Index: /other-projects/rsyntax-textarea/bin/script/jflex
===================================================================
--- /other-projects/rsyntax-textarea/bin/script/jflex	(revision 25584)
+++ /other-projects/rsyntax-textarea/bin/script/jflex	(revision 25584)
@@ -0,0 +1,51 @@
+#! /bin/bash 
+#
+#     JFlex start script $Revision: 339 $
+#
+# if Java is not in your binary path, you need to supply its
+# location in this script. The script automatically finds 
+# JFLEX_HOME when called directly, via binary path, or symbolic
+# link. 
+#
+# Site wide installation: simply make a symlink from e.g.
+# /usr/bin/jflex to this script at its original position
+#
+#===================================================================
+#
+# configurables:
+
+# path to the java interpreter
+JAVA=java
+
+# end configurables
+#
+#===================================================================
+#
+
+# calculate true location
+
+PRG=`type $0`
+PRG="${PRG##* }"
+
+# If PRG is a symlink, trace it to the real home directory
+
+while [ -L "$PRG" ]
+do
+    newprg=$(ls -l ${PRG})
+    newprg="${newprg##*-> }"
+    [ "${newprg}" = "${newprg#/}" ] && newprg="${PRG%/*}/${newprg}"
+    PRG="$newprg"
+done
+
+PRG="${PRG%/*}"
+JFLEX_HOME="${PRG}/../.." 
+
+# --------------------------------------------------------------------
+
+export CLASSPATH
+CLASSPATH=$JFLEX_HOME/lib/JFlex.jar
+
+$JAVA JFlex.Main $@
+
+#for more memory:
+#$JAVA -Xmx128m JFlex.Main $@
Index: /other-projects/rsyntax-textarea/bin/script/jflex.bat
===================================================================
--- /other-projects/rsyntax-textarea/bin/script/jflex.bat	(revision 25584)
+++ /other-projects/rsyntax-textarea/bin/script/jflex.bat	(revision 25584)
@@ -0,0 +1,19 @@
+@echo off
+REM Please adjust the paths JFLEX_HOME and JAVA_HOME to suit your needs
+REM (please do not add a trailing backslash)
+
+set JFLEX_HOME=C:\JFLEX
+
+REM only needed for JDK 1.1.x:
+set JAVA_HOME=C:\JAVA
+
+
+REM ------------------------------------------------------------------- 
+
+set CLPATH=%JAVA_HOME%\lib\classes.zip;%JFLEX_HOME%\lib\JFlex.jar
+
+REM for JDK 1.1.x
+%JAVA_HOME%\bin\java -classpath %CLPATH% JFlex.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
+
+REM for JDK 1.2
+rem java -Xmx128m -jar %JFLEX_HOME%\lib\JFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/COPYRIGHT
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/COPYRIGHT	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/COPYRIGHT	(revision 25584)
@@ -0,0 +1,303 @@
+JFlex - Copying, Warranty & License
+
+  
+
+JFlex is free software, published under the terms of the GNU General Public License. 
+
+There is absolutely NO WARRANTY for JFlex, its code and its documentation. 
+  
+The code generated by JFlex inherits the copyright of the specification it
+was produced from. If it was your specification, you may use the generated 
+code without restriction.
+
+  
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+
+
+0.
+ This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+
+
+1.
+ You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+
+2.
+ You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+
+
+     a)
+     You must cause the modified files to carry prominent notices
+     stating that you changed the files and the date of any change.
+
+
+     b)
+     You must cause any work that you distribute or publish, that in
+     whole or in part contains or is derived from the Program or any
+     part thereof, to be licensed as a whole at no charge to all third
+     parties under the terms of this License.
+
+
+     c)
+     If the modified program normally reads commands interactively
+     when run, you must cause it, when started running for such
+     interactive use in the most ordinary way, to print or display an
+     announcement including an appropriate copyright notice and a
+     notice that there is no warranty (or else, saying that you provide
+     a warranty) and that users may redistribute the program under
+     these conditions, and telling the user how to view a copy of this
+     License.  (Exception: if the Program itself is interactive but
+     does not normally print such an announcement, your work based on
+     the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+
+
+3.
+ You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+
+     a)
+     Accompany it with the complete corresponding machine-readable
+     source code, which must be distributed under the terms of Sections
+     1 and 2 above on a medium customarily used for software interchange; or,
+
+
+     b)
+     Accompany it with a written offer, valid for at least three
+     years, to give any third party, for a charge no more than your
+     cost of physically performing source distribution, a complete
+     machine-readable copy of the corresponding source code, to be
+     distributed under the terms of Sections 1 and 2 above on a medium
+     customarily used for software interchange; or,
+
+
+     c)
+     Accompany it with the information you received as to the offer
+     to distribute corresponding source code.  (This alternative is
+     allowed only for noncommercial distribution and only if you
+     received the program in object code or executable form with such
+     an offer, in accord with Subsection b above.)
+
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+4.
+ You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+
+5.
+ You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+
+
+6.
+ Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+
+
+7.
+ If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+
+8.
+ If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+
+
+9.
+ The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+
+
+
+10.
+ If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+
+
+NO WARRANTY
+
+
+
+11.
+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+
+
+12.
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+
+
+
+END OF TERMS AND CONDITIONS
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/bin/jflex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/bin/jflex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/bin/jflex	(revision 25584)
@@ -0,0 +1,51 @@
+#! /bin/bash 
+#
+#     JFlex start script $Revision: 339 $
+#
+# if Java is not in your binary path, you need to supply its
+# location in this script. The script automatically finds 
+# JFLEX_HOME when called directly, via binary path, or symbolic
+# link. 
+#
+# Site wide installation: simply make a symlink from e.g.
+# /usr/bin/jflex to this script at its original position
+#
+#===================================================================
+#
+# configurables:
+
+# path to the java interpreter
+JAVA=java
+
+# end configurables
+#
+#===================================================================
+#
+
+# calculate true location
+
+PRG=`type $0`
+PRG="${PRG##* }"
+
+# If PRG is a symlink, trace it to the real home directory
+
+while [ -L "$PRG" ]
+do
+    newprg=$(ls -l ${PRG})
+    newprg="${newprg##*-> }"
+    [ "${newprg}" = "${newprg#/}" ] && newprg="${PRG%/*}/${newprg}"
+    PRG="$newprg"
+done
+
+PRG="${PRG%/*}"
+JFLEX_HOME="${PRG}/.." 
+
+# --------------------------------------------------------------------
+
+export CLASSPATH
+CLASSPATH=$JFLEX_HOME/lib/JFlex.jar
+
+$JAVA JFlex.Main $@
+
+#for more memory:
+#$JAVA -Xmx128m JFlex.Main $@
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/bin/jflex.bat
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/bin/jflex.bat	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/bin/jflex.bat	(revision 25584)
@@ -0,0 +1,19 @@
+@echo off
+REM Please adjust the paths JFLEX_HOME and JAVA_HOME to suit your needs
+REM (please do not add a trailing backslash)
+
+set JFLEX_HOME=C:\JFLEX
+
+REM only needed for JDK 1.1.x:
+set JAVA_HOME=C:\JAVA
+
+
+REM ------------------------------------------------------------------- 
+
+set CLPATH=%JAVA_HOME%\lib\classes.zip;%JFLEX_HOME%\lib\JFlex.jar
+
+REM for JDK 1.1.x
+%JAVA_HOME%\bin\java -classpath %CLPATH% JFlex.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
+
+REM for JDK 1.2
+rem java -Xmx128m -jar %JFLEX_HOME%\lib\JFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/COPYRIGHT
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/COPYRIGHT	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/COPYRIGHT	(revision 25584)
@@ -0,0 +1,303 @@
+JFlex - Copying, Warranty & License
+
+  
+
+JFlex is free software, published under the terms of the GNU General Public License. 
+
+There is absolutely NO WARRANTY for JFlex, its code and its documentation. 
+  
+The code generated by JFlex inherits the copyright of the specification it
+was produced from. If it was your specification, you may use the generated 
+code without restriction.
+
+  
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+
+
+0.
+ This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+
+
+1.
+ You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+
+2.
+ You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+
+
+     a)
+     You must cause the modified files to carry prominent notices
+     stating that you changed the files and the date of any change.
+
+
+     b)
+     You must cause any work that you distribute or publish, that in
+     whole or in part contains or is derived from the Program or any
+     part thereof, to be licensed as a whole at no charge to all third
+     parties under the terms of this License.
+
+
+     c)
+     If the modified program normally reads commands interactively
+     when run, you must cause it, when started running for such
+     interactive use in the most ordinary way, to print or display an
+     announcement including an appropriate copyright notice and a
+     notice that there is no warranty (or else, saying that you provide
+     a warranty) and that users may redistribute the program under
+     these conditions, and telling the user how to view a copy of this
+     License.  (Exception: if the Program itself is interactive but
+     does not normally print such an announcement, your work based on
+     the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+
+
+3.
+ You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+
+     a)
+     Accompany it with the complete corresponding machine-readable
+     source code, which must be distributed under the terms of Sections
+     1 and 2 above on a medium customarily used for software interchange; or,
+
+
+     b)
+     Accompany it with a written offer, valid for at least three
+     years, to give any third party, for a charge no more than your
+     cost of physically performing source distribution, a complete
+     machine-readable copy of the corresponding source code, to be
+     distributed under the terms of Sections 1 and 2 above on a medium
+     customarily used for software interchange; or,
+
+
+     c)
+     Accompany it with the information you received as to the offer
+     to distribute corresponding source code.  (This alternative is
+     allowed only for noncommercial distribution and only if you
+     received the program in object code or executable form with such
+     an offer, in accord with Subsection b above.)
+
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+4.
+ You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+
+5.
+ You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+
+
+6.
+ Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+
+
+7.
+ If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+
+8.
+ If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+
+
+9.
+ The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+
+
+
+10.
+ If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+
+
+NO WARRANTY
+
+
+
+11.
+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+
+
+12.
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+
+
+
+END OF TERMS AND CONDITIONS
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/jflex_anttask.html
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/jflex_anttask.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/jflex_anttask.html	(revision 25584)
@@ -0,0 +1,165 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<title>JFlex Ant Task</title>
+</head>
+
+<body>
+
+<h2><a name="JFlex">JFlex Ant Task</a></h2>
+<p>
+ JFlex can be easily integrated with <a HREF="http://ant.apache.org/" 
+ target="_top">Ant</a> build tool. 
+ To use JFlex with Ant, simply copy JFlex.jar to <i>$ANT_HOME/lib/</i> directory.
+</p>
+<h3>Description</h3>
+<p>
+  The JFlex Ant Task invokes the <a HREF="http://jflex.de/" target="_top">JFlex</a> lexical 
+  analyzer generator on a grammar file.
+</p>
+<p>
+ To use the JFlex task, the following line must be placed in the Ant build file:
+</p>
+<pre>&lt;taskdef classname=&quot;JFlex.anttask.JFlexTask&quot; name=&quot;jflex&quot; /&gt;</pre>
+
+<p>
+  The JFlex task requires the <i>file</i> attribute to be set to the source grammar file (*.flex).
+  Unless the target directory is specified with the <i>destdir</i> option, 
+  the generated class will be saved to the same directory where grammar file resides. 
+  Like javac, the JFlex task creates subdirectories in <i>destdir</i> according to the 
+  generated class package.
+</p>
+<p>
+  This task only invokes JFlex if the grammar file is newer than the generated
+  files.
+</p>
+
+<h3>Parameters</h3>
+<table border="1" cellpadding="2" cellspacing="0" width="80%">
+  <tr>
+    <td valign="top"><b>Attribute</b></td>
+    <td valign="top"><b>Description</b></td>
+    <td align="center" valign="top"><b>Required</b></td>
+    <td align="center" valign="top"><b>Default</b></td>
+  </tr>
+  <tr>
+    <td valign="top">file="file"</td>
+    <td valign="top">The grammar file to process.</td>
+    <td valign="top" align="center">Yes</td>
+    <td></td>
+  </tr>
+  <tr>
+    <td valign="top">destdir="dir"</td>
+    <td valign="top">
+      The directory to write the generated files to.  If not set, the files
+      are written to the directory containing the grammar file. Note that unlike 
+      JFlex's "-d" command line option, <i>destdir</i> causes the generated file to be written to 
+      {destdir}/<b>{package name}</b>. This behaviour is similar to <i>javac -d dir</i>.
+    </td>
+    <td valign="top" align="center">No</td>
+    <td></td>
+  </tr>
+  <tr>
+    <td valign="top">outdir="dir"</td>
+    <td valign="top">
+      The directory to write the generated files to.  If not set, the files
+      are written to the directory containing the grammar file. This options works 
+      exactly like JFlex's "-d" command line option, it causes the output file to
+      be written to <i>dir</i> regardless of the package name.
+    </td>
+    <td valign="top" align="center">No</td>
+    <td></td>
+  </tr>
+  <tr>
+    <td valign="top">verbose</td>
+    <td valign="top">Display generation process messages.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">dump</td>
+    <td valign="top">Dump character classes, NFA and DFA tables.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">time or<p>timeStatistics</td>
+    <td valign="top">Display generation time statistics.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">nomin or<p>skipMinimization</td>
+    <td valign="top">Skip minimization step.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">skel="file" or<p>skeleton="file"</td>
+    <td valign="top">Use external skeleton file.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">dot or<p>generateDot</td>
+    <td valign="top">Write graphviz .dot files for the generated automata (alpha).</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">nobak</td>
+    <td valign="top">Do not make a backup if the generated file exists.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">switch</td>
+    <td valign="top">Use code generation method <i>switch</t>.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">table</td>
+    <td valign="top">Use code generation method <i>table</t>.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;off&quot;</td>
+  </tr>
+  <tr>
+    <td valign="top">pack</td>
+    <td valign="top">Use code generation method <i>pack</t>.</td>
+    <td align="center" valign="top">No</td>
+    <td align="center" valign="top">&quot;on&quot;</td>
+  </tr>
+
+</table>
+<h3>Example</h3>
+<blockquote><pre>
+&lt;jflex
+    file=&quot;src/parser/Parser.flex&quot;
+    destdir=&quot;build/generated/&quot;
+/&gt;
+</pre></blockquote>
+<p>
+  JFlex generates the lexical analyzer for <tt>src/parser/Parser.flex</tt> and saves the result 
+  to <tt>build/generated/parser/</tt>, providing <tt>Parser.flex</tt> declares to be in package <tt>parser</tt>.
+</p>
+
+<blockquote><pre>
+&lt;jflex
+    file=&quot;src/parser/Parser.flex&quot;
+    destdir=&quot;build/generated/&quot;
+/&gt;
+&lt;javac
+    srcdir=&quot;build/generated/&quot;
+    destdir=&quot;build/classes/&quot;
+/&gt;
+</pre></blockquote>
+<p>
+ The same as above plus compile generated classes to <i>build/classes</i>
+</p>
+<hr>
+
+</body>
+</html>
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/manual.css
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/manual.css	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/manual.css	(revision 25584)
@@ -0,0 +1,19 @@
+body  { background-color:#FFFFFF; }
+table { background-color:#F0F0F0; }
+h1    { font-size:16pt; font-style:italic; font-weight:bold; font-family:arial,helvetica; 
+        border-top-width:medium; border-top-style:solid; padding-top:5mm; margin-top:1cm; }
+h2    { font-size:14pt; font-style:italic; font-weight:bold; font-family:arial,helvetica; 
+        border-top-width:medium; border-top-style:solid; padding-top:5mm; margin-top:1cm; }
+h3    { font-size:14pt; font-weight:bold; font-family:arial,helvetica; margin-top:1cm; }  
+h4    { font-size:12pt; font-family:arial,helvetica; }
+
+SMALL.TINY		      { font-size:xx-small }
+SMALL.SCRIPTSIZE	  { font-size:xx-small }
+SMALL.FOOTNOTESIZE	{ font-size:x-small  }
+SMALL.SMALL     		{ font-size:small    }
+BIG.LARGE		        { font-size:large    }
+BIG.XLARGE	       	{ font-size:x-large  }
+BIG.XXLARGE		      { font-size:xx-large }
+BIG.HUGE		        { font-size:xx-large }
+BIG.XHUGE		        { font-size:xx-large }
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/manual.html
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/manual.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/doc/manual.html	(revision 25584)
@@ -0,0 +1,3940 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+
+<!--Converted with LaTeX2HTML 2002-2-1 (1.71)
+original version by:  Nikos Drakos, CBLU, University of Leeds
+* revised and updated by:  Marcus Hennecke, Ross Moore, Herb Swan
+* with significant contributions from:
+  Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
+<HTML>
+<HEAD>
+<TITLE>JFlex User's Manual</TITLE>
+<META NAME="description" CONTENT="JFlex User's Manual">
+<META NAME="keywords" CONTENT="manual">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+
+<META NAME="Generator" CONTENT="LaTeX2HTML v2002-2-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="STYLESHEET" HREF="manual.css">
+
+</HEAD>
+
+<BODY >
+
+<P>
+
+<CENTER>
+<A NAME="TOP"></a>
+<A HREF="http://www.jflex.de"><IMG SRC="logo.png" BORDER=0 HEIGHT=223 WIDTH=577></a>
+</CENTER>
+
+<P>
+<DIV ALIGN="CENTER">
+<I><FONT SIZE="+2">The Fast Lexical Analyser Generator</FONT>
+<BR></I></DIV>
+<P></P>
+<DIV ALIGN="CENTER"></DIV>
+<P></P>
+<DIV ALIGN="CENTER"><I>Copyright &#169;1998-2009 by <A NAME="tex2html1"
+  HREF="http://www.doclsf.de">Gerwin Klein</A>
+<BR></I></DIV>
+<P><P><BR>
+<DIV ALIGN="CENTER"><I><FONT SIZE="+4"><I><B>JFlex User's Manual</B></I></FONT>
+<BR></I></DIV>
+<P><P><BR>
+<DIV ALIGN="CENTER"><I>Version 1.4.3, January 31, 2009
+
+</I></DIV>
+
+<P>
+<BR>
+
+<H2><A NAME="SECTION00010000000000000000">
+Contents</A>
+</H2>
+<!--Table of Contents-->
+
+<UL>
+<LI><A NAME="tex2html79"
+  HREF="manual.html#SECTION00020000000000000000">Introduction</A>
+<UL>
+<LI><A NAME="tex2html80"
+  HREF="manual.html#SECTION00021000000000000000">Design goals</A>
+<LI><A NAME="tex2html81"
+  HREF="manual.html#SECTION00022000000000000000">About this manual</A>
+</UL><BR>
+<LI><A NAME="tex2html82"
+  HREF="manual.html#SECTION00030000000000000000">Installing and Running JFlex</A>
+<UL>
+<LI><A NAME="tex2html83"
+  HREF="manual.html#SECTION00031000000000000000">Installing JFlex</A>
+<LI><A NAME="tex2html84"
+  HREF="manual.html#SECTION00032000000000000000">Running JFlex</A>
+</UL><BR>
+<LI><A NAME="tex2html85"
+  HREF="manual.html#SECTION00040000000000000000">A simple Example: How to work with JFlex</A>
+<UL>
+<LI><A NAME="tex2html86"
+  HREF="manual.html#SECTION00041000000000000000">Code to include</A>
+<LI><A NAME="tex2html87"
+  HREF="manual.html#SECTION00042000000000000000">Options and Macros</A>
+<LI><A NAME="tex2html88"
+  HREF="manual.html#SECTION00043000000000000000">Rules and Actions</A>
+<LI><A NAME="tex2html89"
+  HREF="manual.html#SECTION00044000000000000000">How to get it going</A>
+</UL><BR>
+<LI><A NAME="tex2html90"
+  HREF="manual.html#SECTION00050000000000000000">Lexical Specifications</A>
+<UL>
+<LI><A NAME="tex2html91"
+  HREF="manual.html#SECTION00051000000000000000">User code</A>
+<LI><A NAME="tex2html92"
+  HREF="manual.html#SECTION00052000000000000000">Options and declarations</A>
+<LI><A NAME="tex2html93"
+  HREF="manual.html#SECTION00053000000000000000">Lexical rules</A>
+</UL><BR>
+<LI><A NAME="tex2html94"
+  HREF="manual.html#SECTION00060000000000000000">Encodings, Platforms, and Unicode</A>
+<UL>
+<LI><A NAME="tex2html95"
+  HREF="manual.html#SECTION00061000000000000000">The Problem</A>
+<LI><A NAME="tex2html96"
+  HREF="manual.html#SECTION00062000000000000000">Scanning text files</A>
+<LI><A NAME="tex2html97"
+  HREF="manual.html#SECTION00063000000000000000">Scanning binaries</A>
+</UL><BR>
+<LI><A NAME="tex2html98"
+  HREF="manual.html#SECTION00070000000000000000">A few words on performance</A>
+<UL>
+<LI><A NAME="tex2html99"
+  HREF="manual.html#SECTION00071000000000000000">Comparison of JLex and JFlex</A>
+<LI><A NAME="tex2html100"
+  HREF="manual.html#SECTION00072000000000000000">How to write a faster specification</A>
+</UL><BR>
+<LI><A NAME="tex2html101"
+  HREF="manual.html#SECTION00080000000000000000">Porting Issues</A>
+<UL>
+<LI><A NAME="tex2html102"
+  HREF="manual.html#SECTION00081000000000000000">Porting from JLex</A>
+<LI><A NAME="tex2html103"
+  HREF="manual.html#SECTION00082000000000000000">Porting from lex/flex</A>
+</UL><BR>
+<LI><A NAME="tex2html104"
+  HREF="manual.html#SECTION00090000000000000000">Working together</A>
+<UL>
+<LI><A NAME="tex2html105"
+  HREF="manual.html#SECTION00091000000000000000">JFlex and CUP</A>
+<LI><A NAME="tex2html106"
+  HREF="manual.html#SECTION00092000000000000000">JFlex and BYacc/J</A>
+</UL><BR>
+<LI><A NAME="tex2html107"
+  HREF="manual.html#SECTION000100000000000000000">Bugs and Deficiencies</A>
+<UL>
+<LI><A NAME="tex2html108"
+  HREF="manual.html#SECTION000101000000000000000">Deficiencies</A>
+<LI><A NAME="tex2html109"
+  HREF="manual.html#SECTION000102000000000000000">Bugs</A>
+</UL><BR>
+<LI><A NAME="tex2html110"
+  HREF="manual.html#SECTION000110000000000000000">Copying and License</A>
+<LI><A NAME="tex2html111"
+  HREF="manual.html#SECTION000120000000000000000">Bibliography</A>
+</UL>
+<!--End of Table of Contents-->
+
+<H1><A NAME="SECTION00020000000000000000"></A><A NAME="Intro"></A><BR>
+Introduction
+</H1>
+JFlex is a lexical analyser generator for Java<A NAME="tex2html2"
+  HREF="#foot33"><SUP><IMG  ALIGN="BOTTOM" BORDER="1" ALT="[*]" SRC="footnote.png"></SUP></A>written in Java. It is also a rewrite of the very useful tool JLex [<A
+ HREF="manual.html#JLex">3</A>] which
+was developed by Elliot Berk at Princeton University. As Vern Paxson states
+for his C/C++ tool flex [<A
+ HREF="manual.html#flex">11</A>]: they do not share any code though.
+
+<P>
+
+<H2><A NAME="SECTION00021000000000000000">
+Design goals</A>
+</H2>
+The main design goals of JFlex are:
+
+<UL>
+<LI><B>Full unicode support</B>
+</LI>
+<LI><B>Fast generated scanners </B>
+</LI>
+<LI><B>Fast scanner generation</B>
+</LI>
+<LI><B>Convenient specification syntax</B>
+</LI>
+<LI><B>Platform independence</B>
+</LI>
+<LI><B>JLex compatibility</B>
+</LI>
+</UL>
+
+<P>
+
+<H2><A NAME="SECTION00022000000000000000">
+About this manual</A>
+</H2>
+This manual gives a brief but complete description of the tool JFlex. It
+assumes that you are familiar with the issue of lexical analysis. The references [<A
+ HREF="manual.html#Aho">1</A>],
+[<A
+ HREF="manual.html#Appel">2</A>], and [<A
+ HREF="manual.html#Maurer">13</A>] provide a good introduction to this topic.
+
+<P>
+The next section of this manual describes <A HREF="#Installing"><I>installation procedures</I></A> 
+for JFlex. If you never worked with JLex or
+just want to compare a JLex and a JFlex scanner specification you
+should also read <A HREF="#Example"><I>Working with JFlex - an example</I></A> 
+(section <A HREF="#Example">3</A>).  All options and the complete
+specification syntax are presented in 
+<A HREF="#Specifications"><I>Lexical specifications</I></A> (section <A HREF="#Specifications">4</A>);
+<A HREF="#sec:encodings"><I>Encodings, Platforms, and Unicode</I></A> (section <A HREF="#sec:encodings">5</A>)
+provides information about scanning text vs.&nbsp;binary files.
+If you are interested in performance
+considerations and comparing JLex with JFlex speed, 
+<A HREF="#performance"><I>a few words on performance</I></A> (section <A HREF="#performance">6</A>)
+might be just right for you. Those who want to
+use their old JLex specifications may want to check out section <A HREF="#Porting">7.1</A>
+<A HREF="#Porting"><I>Porting from JLex</I></A> to avoid possible problems
+with not portable or non standard JLex behaviour that has been fixed in
+JFlex. Section <A HREF="#lexport">7.2</A> talks about porting scanners from the
+Unix tools lex and flex.  Interfacing JFlex scanners with the LALR
+parser generators CUP and BYacc/J is explained in <A HREF="#WorkingTog"><I>working
+  together</I></A> (section <A HREF="#WorkingTog">8</A>).  Section <A HREF="#Bugs">9</A>
+<A HREF="#Bugs"><I>Bugs</I></A> gives a list of currently known active bugs. 
+The manual concludes with notes about 
+<A HREF="#Copyright"><I>Copying and License</I></A> (section <A HREF="#Copyright">10</A>) and
+<A HREF="#References">references</A>.
+
+<P>
+
+<H1><A NAME="SECTION00030000000000000000"></A><A NAME="Installing"></A><BR>
+Installing and Running JFlex
+</H1>
+
+<P>
+
+<H2><A NAME="SECTION00031000000000000000">
+Installing JFlex</A>
+</H2>
+
+<P>
+
+<H3><A NAME="SECTION00031100000000000000"></A><A NAME="install:windows"></A><BR>
+Windows
+</H3>
+To install JFlex on Windows 95/98/NT/XP, follow these three steps:
+
+<OL>
+<LI>Unzip the file you downloaded into the directory you want JFlex in (using
+something like 
+<A NAME="tex2html3"
+  HREF="http://www.winzip.com">WinZip</A>).
+If you unzipped it to say <code>C:\</code>, the following directory structure
+should be generated:
+
+<PRE>
+C:\JFlex\                          
+      +--bin\                   (start scripts) 
+      +--doc\                   (FAQ and manual)
+      +--examples\ 
+               +--binary\       (scanning binary files)
+               +--byaccj\       (calculator example for BYacc/J)
+               +--cup\          (calculator example for cup)
+               +--interpreter\  (interpreter example for cup)
+               +--java\         (Java lexer specification) 
+               +--simple\       (example scanner)
+               +--simple-maven\ (example with maven)
+               +--standalone\   (a simple standalone scanner)
+               +--standalone-maven\  (above with maven)
+      +--lib\                   (the precompiled classes) 
+      +--src\ 
+          +--JFlex\             (source code of JFlex) 
+          +--JFlex\gui          (source code of JFlex UI classes)
+          +--java_cup\runtime\  (source code of cup runtime classes)
+</PRE>
+
+<P>
+</LI>
+<LI>Edit the file <B><code>bin\jflex.bat</code></B>
+(in the example it's <code>C:\JFlex\bin\jflex.bat</code>)
+such that
+
+<P>
+
+<UL>
+<LI><B><TT>JAVA_HOME</TT></B> contains the directory where your Java JDK is installed
+  (for instance <code>C:\java</code>) and
+</LI>
+<LI><B><TT>JFLEX_HOME</TT></B> the directory that contains JFlex (in the example:
+  <code>C:\JFlex</code>) 
+</LI>
+</UL>
+
+<P>
+</LI>
+<LI>Include the <code>bin\</code> directory of JFlex in your path.
+(the one that contains the start script, in the example: <code>C:\JFlex\bin</code>).
+</LI>
+</OL>
+
+<P>
+
+<H3><A NAME="SECTION00031200000000000000">
+Unix with tar archive</A>
+</H3>
+
+<P>
+To install JFlex on a Unix system, follow these two steps:
+
+<UL>
+<LI>Decompress the archive into a directory of your choice
+  with GNU tar, for instance to <TT>/usr/share</TT>:
+
+<P>
+<TT>tar -C /usr/share -xvzf jflex-1.4.3.tar.gz</TT>
+
+<P>
+(The example is for site wide installation. You need to
+  be root for that. User installation works exactly the
+  same way--just choose a directory where you have write
+  permission)
+
+<P>
+</LI>
+<LI>Make a symbolic link from somewhere in your binary 
+  path to <TT>bin/jflex</TT>, for instance:
+
+<P>
+<TT>ln -s /usr/share/JFlex/bin/jflex /usr/bin/jflex</TT>
+
+<P>
+If the Java interpreter is not in your binary path, you
+  need to supply its location in the script <TT>bin/jflex</TT>.
+</LI>
+</UL>
+
+<P>
+You can verify the integrity of the downloaded file with
+the MD5 checksum available on the <A NAME="tex2html4"
+  HREF="http://www.jflex.de/download.html">JFlex download page</A>. 
+If you put the checksum file in the same directory
+as the archive, you run:
+
+<P>
+<code>md5sum --check </code><TT>jflex-1.4.3.tar.gz.md5</TT>
+
+<P>
+It should tell you
+
+<P>
+<TT>jflex-1.4.3.tar.gz: OK</TT>
+
+<P>
+
+<H3><A NAME="SECTION00031300000000000000">
+Linux with RPM</A>
+</H3>
+
+<P>
+
+<UL>
+<LI>become root
+</LI>
+<LI>issue
+<BR>  <TT>rpm -U jflex-1.4.3-0.rpm</TT>
+</LI>
+</UL>
+
+<P>
+You can verify the integrity of the downloaded <TT>rpm</TT> file with
+
+<P>
+<code>rpm --checksig </code><TT>jflex-1.4.3-0.rpm</TT>
+
+<P>
+
+<H2><A NAME="SECTION00032000000000000000">
+Running JFlex</A>
+</H2>
+You run JFlex with:
+
+<P>
+<TT>jflex &lt;options&gt; &lt;inputfiles&gt;</TT>
+
+<P>
+It is also possible to skip the start script in <code>bin\</code>
+and include the file <code>lib\JFlex.jar</code>
+in your <TT>CLASSPATH</TT> environment variable instead.
+
+<P>
+Then you run JFlex with:
+
+<P>
+<TT>java JFlex.Main &lt;options&gt; &lt;inputfiles&gt;</TT>
+
+<P>
+The input files and options are in both cases optional. If you don't provide a file name on
+the command line, JFlex will pop up a window to ask you for one.
+
+<P>
+JFlex knows about the following options:
+
+<P>
+<DL>
+<DT></DT>
+<DD><code>-d &lt;directory&gt;</code>
+<BR>  writes the generated file to the directory <code>&lt;directory&gt;</code>
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--skel &lt;file&gt;</code>
+<BR>  uses external skeleton <code>&lt;file&gt;</code>. This is mainly for JFlex
+  maintenance and special low level customisations. Use only when you
+  know what you are doing! JFlex comes with a skeleton file in the
+  <TT>src</TT> directory that reflects exactly the internal, pre-compiled
+  skeleton and can be used with the <TT>-skel</TT> option.
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--nomin</code>
+<BR>  skip the DFA minimisation step during scanner generation.
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--jlex</code>
+<BR>  tries even harder to comply to JLex interpretation of specs.
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--dot</code>
+<BR>  generate graphviz dot files for the NFA, DFA and minimised 
+  DFA. This feature is still in alpha status, and not
+  fully implemented yet. 
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--dump</code>
+<BR>  display transition tables of NFA, initial DFA, and minimised DFA 
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--verbose</code> or <TT>-v</TT>
+<BR>  display generation progress messages (enabled by default)
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--quiet</code> or <TT>-q</TT>
+<BR>  display error messages only (no chatter about what JFlex is
+  currently doing)
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--time</code>
+<BR>  display time statistics about the code generation process
+  (not very accurate)
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--version</code>
+<BR>  print version number 
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--info</code>
+<BR>  print system and JDK information (useful if you'd like
+  to report a problem)
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--pack</code>
+<BR>  use the %pack code generation method by default
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--table</code>
+<BR>  use the %table code generation method by default
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--switch</code>
+<BR>  use the %switch code generation method by default
+
+<P>
+</DD>
+<DT></DT>
+<DD><code>--help</code> or <TT>-h</TT>
+<BR>  print a help message explaining options and usage of JFlex.
+</DD>
+</DL>
+
+<P>
+
+<H1><A NAME="SECTION00040000000000000000"></A><A NAME="Example"></A><BR>
+A simple Example: How to work with JFlex
+</H1>
+To demonstrate what a lexical specification with JFlex looks like, this
+section presents a part of the specification for the Java language.
+The example does not describe the whole lexical structure of Java programs,
+but only a small and simplified part of it (some keywords, some operators,
+comments and only two kinds of literals). It also shows how to interface
+with the LALR parser generator CUP [<A
+ HREF="manual.html#CUP">8</A>] and therefore
+uses a class <TT>sym</TT> (generated by CUP), where integer constants for
+the terminal tokens of the CUP grammar are declared. JFlex comes with a
+directory <TT>examples</TT>, where you can find a small standalone scanner
+that doesn't need other tools like CUP to give you a running example.
+The "<TT>examples</TT>" directory also contains a <EM>complete</EM> JFlex 
+specification of the lexical structure of Java programs together with the 
+CUP parser specification for Java by 
+<A NAME="tex2html5"
+  HREF="mailto:cananian@alumni.princeton.edu">C. Scott Ananian</A>, obtained
+from the CUP [<A
+ HREF="manual.html#CUP">8</A>] web site (it was modified to interface with the JFlex scanner). 
+Both specifications adhere to the Java Language Specification [<A
+ HREF="manual.html#LangSpec">7</A>].
+
+<P>
+<FONT SIZE="-1"><A NAME="CodeTop"></A></FONT><PRE>
+/* JFlex example: part of Java language lexer specification */
+import java_cup.runtime.*;
+
+/**
+ * This class is a simple example lexer.
+ */
+%%
+</PRE><FONT SIZE="-1">
+<A NAME="CodeOptions"></A></FONT><PRE>
+%class Lexer
+%unicode
+%cup
+%line
+%column
+</PRE><FONT SIZE="-1">
+<A NAME="CodeScannerCode"></A></FONT><PRE>
+%{
+  StringBuffer string = new StringBuffer();
+
+  private Symbol symbol(int type) {
+    return new Symbol(type, yyline, yycolumn);
+  }
+  private Symbol symbol(int type, Object value) {
+    return new Symbol(type, yyline, yycolumn, value);
+  }
+%}
+</PRE><FONT SIZE="-1">
+<A NAME="CodeMacros"></A></FONT><PRE>
+LineTerminator = \r|\n|\r\n
+InputCharacter = [^\r\n]
+WhiteSpace     = {LineTerminator} | [ \t\f]
+
+/* comments */
+Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}
+
+TraditionalComment   = "/*" [^*] ~"*/" | "/*" "*"+ "/"
+EndOfLineComment     = "//" {InputCharacter}* {LineTerminator}
+DocumentationComment = "/**" {CommentContent} "*"+ "/"
+CommentContent       = ( [^*] | \*+ [^/*] )*
+
+Identifier = [:jletter:] [:jletterdigit:]*
+
+DecIntegerLiteral = 0 | [1-9][0-9]*
+</PRE><FONT SIZE="-1">
+<A NAME="CodeStateDecl"></A></FONT><PRE>
+%state STRING
+
+%%
+</PRE><FONT SIZE="-1">
+<A NAME="CodeRulesYYINITIAL"></A></FONT><PRE>
+/* keywords */
+&lt;YYINITIAL&gt; "abstract"           { return symbol(sym.ABSTRACT); }
+&lt;YYINITIAL&gt; "boolean"            { return symbol(sym.BOOLEAN); }
+&lt;YYINITIAL&gt; "break"              { return symbol(sym.BREAK); }
+</PRE><FONT SIZE="-1">
+<A NAME="CodeRulesBunch"></A></FONT><PRE>
+&lt;YYINITIAL&gt; {
+  /* identifiers */ 
+  {Identifier}                   { return symbol(sym.IDENTIFIER); }
+ 
+  /* literals */
+  {DecIntegerLiteral}            { return symbol(sym.INTEGER_LITERAL); }
+  \"                             { string.setLength(0); yybegin(STRING); }
+
+  /* operators */
+  "="                            { return symbol(sym.EQ); }
+  "=="                           { return symbol(sym.EQEQ); }
+  "+"                            { return symbol(sym.PLUS); }
+
+  /* comments */
+  {Comment}                      { /* ignore */ }
+ 
+  /* whitespace */
+  {WhiteSpace}                   { /* ignore */ }
+}
+</PRE><FONT SIZE="-1">
+<A NAME="CodeRulesYYtext"></A></FONT><PRE>
+&lt;STRING&gt; {
+  \"                             { yybegin(YYINITIAL); 
+                                   return symbol(sym.STRING_LITERAL, 
+                                   string.toString()); }
+  [^\n\r\"\\]+                   { string.append( yytext() ); }
+  \\t                            { string.append('\t'); }
+  \\n                            { string.append('\n'); }
+
+  \\r                            { string.append('\r'); }
+  \\\"                           { string.append('\"'); }
+  \\                             { string.append('\\'); }
+}
+</PRE><FONT SIZE="-1">
+<A NAME="CodeRulesAllStates"></A></FONT><PRE>
+/* error fallback */
+.|\n                             { throw new Error("Illegal character &lt;"+
+                                                    yytext()+"&gt;"); }
+</PRE>
+
+<P>
+From this specification JFlex generates a <TT>.java</TT> file with one
+class that contains code for the scanner. The class will have a
+constructor taking a <TT>java.io.Reader</TT> from which the input is
+read. The class will also have a function <TT>yylex()</TT> that runs the
+scanner and that can be used to get the next token from the input (in this
+example the function actually has the name <TT>next_token()</TT> because
+the specification uses the <TT>%cup</TT> switch).
+
+<P>
+As with JLex, the specification consists of three parts, divided by <TT>%%</TT>:
+
+<UL>
+<LI><A HREF="#ExampleUserCode">usercode</A>,
+</LI>
+<LI><A HREF="#ExampleOptions">options and declarations</A> and 
+</LI>
+<LI><A HREF="#ExampleLexRules">lexical rules</A>.
+</LI>
+</UL>
+
+<P>
+
+<H2><A NAME="SECTION00041000000000000000"></A><A NAME="ExampleUserCode"></A><BR>
+Code to include
+</H2>
+Let's take a look at the first section, ``user code'': The text up to the
+first line starting with <TT>%%</TT> is copied verbatim to the top 
+of the generated lexer class (before the actual class declaration). 
+Beside <TT>package</TT> and <TT>import</TT> statements there is usually not much 
+to do here. If the code ends with a javadoc class comment, the generated class
+will get this comment, if not, JFlex will generate one automatically.
+
+<P>
+
+<H2><A NAME="SECTION00042000000000000000"></A><A NAME="ExampleOptions"></A><BR>
+Options and Macros
+</H2>
+The second section ``options and declarations'' is more interesting. It consists
+of a set of options, code that is included inside the generated scanner
+class, lexical states and macro declarations. Each JFlex option must begin
+a line of the specification and starts with a <TT>%</TT>. In our example
+the following options are used:
+
+<P>
+
+<UL>
+<LI><TT><A HREF="#CodeOptions">%class Lexer</A></TT> tells JFlex to give the
+  generated class the name ``Lexer'' and to write the code to a file ``<TT>Lexer.java</TT>''.
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeOptions">%unicode</A></TT> defines the set of characters the scanner will 
+  work on. For scanning text files, <TT>%unicode</TT> should always be used. See also
+  section <A HREF="#sec:encodings">5</A> for more information on character sets, encodings, and
+  scanning text vs. binary files.
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeOptions">%cup</A></TT> switches to CUP compatibility
+  mode to interface with a CUP generated parser.
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeOptions">%line</A></TT> switches line counting on (the
+  current line number can be accessed via the variable <TT>yyline</TT>)
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeOptions">%column</A></TT> switches column counting on
+  (current column is accessed via <TT>yycolumn</TT>)
+
+<P>
+</LI>
+</UL>
+<A NAME="ExampleScannerCode"></A>
+<P>
+The code included in <TT><A HREF="#CodeScannerCode">%{...%}</A></TT>
+is copied verbatim into the generated lexer class source.
+Here you can declare member variables and functions that are used
+inside scanner actions. In our example we declare a <TT>StringBuffer</TT> ``<TT>string</TT>''
+in which we will store parts of string literals and two helper functions
+``<TT>symbol</TT>'' that create <TT>java_cup.runtime.Symbol</TT> objects
+with position information of the current token (see section <A HREF="#CUPWork">8.1</A>
+<A HREF="#CUPWork"><I>JFlex and CUP</I></A> 
+for how to interface with the parser generator CUP). As JFlex options, both 
+<code>%{</code> and <code>\%}</code> must begin a line. 
+<A NAME="ExampleMacros"></A>
+<P>
+The specification continues with macro declarations. Macros are
+abbreviations for regular expressions, used to make lexical specifications
+easier to read and understand. A macro declaration
+consists of a macro identifier followed by <TT>=</TT>, then followed by
+the regular expression it represents.  This regular expression may
+itself contain macro usages. Although this allows a grammar like specification
+style, macros are still just abbreviations and not non terminals - they
+cannot be recursive or mutually recursive. Cycles in macro definitions
+are detected and reported at generation time by JFlex.
+
+<P>
+Here some of the example macros in more detail:
+
+<UL>
+<LI><TT><A HREF="#CodeMacros">LineTerminator</A></TT> stands for the regular
+  expression that matches an ASCII CR, an ASCII LF or an CR followed by LF.
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeMacros">InputCharacter</A></TT> stands for all characters
+  that are not a CR or LF.
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeMacros">TraditionalComment</A></TT> is the expression
+  that matches the string <TT>"/*"</TT> followed by a character that
+  is not a <TT>*</TT>, followed by anything that does not contain, but
+  ends in <TT>"/*"</TT>.  As this would not match comments like
+  <TT>/****/</TT>, we add <TT>"/*"</TT> followed by an arbitrary
+  number (at least one) of <TT>"*"</TT> followed by the closing
+  <TT>"/"</TT>. This is not the only, but one of the simpler
+  expressions matching non-nesting Java comments. It is tempting to
+  just write something like the expression <TT>"/*" .* "*/"</TT>, but
+  this would match more than we want. It would for instance match the
+  whole of <TT>/* */ x = 0; /* */</TT>, instead of two comments and
+  four real tokens. See DocumentationComment and CommentContent for an
+  alternative.
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeMacros">CommentContent</A></TT> matches zero or more
+  occurrences of any character except a <TT>*</TT> or any number of 
+  <TT>*</TT> followed by a character that is not a <TT>/</TT>
+
+<P>
+</LI>
+<LI><TT><A HREF="#CodeMacros">Identifier</A></TT> matches each string that
+  starts with a character of class <TT>jletter</TT> followed by zero or more characters
+  of class <TT>jletterdigit</TT>. <TT>jletter</TT> and <TT>jletterdigit</TT>
+  are predefined character classes.  <TT>jletter</TT> includes all characters for which
+  the Java function <TT>Character.isJavaIdentifierStart</TT> returns <TT>true</TT> and 
+  <TT>jletterdigit</TT> all characters for that <TT>Character.isJavaIdentifierPart</TT>
+  returns <TT>true</TT>. 
+</LI>
+</UL>
+<A NAME="ExampleStateDecl"></A>
+<P>
+The last part of the second section in our
+lexical specification is a lexical state declaration: 
+<TT><A HREF="#CodeStateDecl">%state STRING</A></TT>
+declares a lexical state <TT>STRING</TT> that can be
+used in the ``lexical rules'' part of the specification. A state declaration
+is a line starting with <TT>%state</TT> followed by a space or comma
+separated list of state identifiers. There can be more than one line starting
+with <TT>%state</TT>.
+
+<P>
+
+<H2><A NAME="SECTION00043000000000000000"></A><A NAME="ExampleLexRules"></A><BR>
+Rules and Actions
+</H2>
+The "lexical rules" section of a JFlex specification contains regular expressions
+and actions (Java code) that are executed when the scanner matches the
+associated regular expression. As the scanner reads its input, it keeps
+track of all regular expressions and activates the action of the expression
+that has the longest match. Our specification above for instance would with input
+"<TT>breaker</TT>" match the regular expression for <TT><A HREF="#CodeMacros">Identifier</A></TT>
+and not the keyword "<TT><A HREF="#CodeRulesYYINITIAL">break</A></TT>"
+followed by the Identifier "<TT>er</TT>", because rule <code>{Identifier}</code>
+matches more of this input at once (i.e. it matches all of it)
+than any other rule in the specification. If two regular expressions both 
+have the longest match for a certain input, the scanner chooses the action 
+of the expression that appears first in the specification. In that way, we 
+get for input "<TT>break</TT>" the keyword "<TT>break</TT>" and not an 
+Identifier "<TT>break</TT>". 
+
+<P>
+Additional to regular expression matches, one can use lexical states to
+refine a specification. A lexical state acts like a start condition.
+If the scanner is in lexical state <TT>STRING</TT>, only expressions that
+are preceded by the start condition <TT>&lt;STRING&gt;</TT> can be matched.
+A start condition of a regular expression can contain more than one lexical
+state. It is then matched when the lexer is in any of these lexical states.
+The lexical state <TT>YYINITIAL</TT> is predefined and is also the state
+in which the lexer begins scanning. If a regular expression has no start
+conditions it is matched in <EM>all</EM> lexical states.
+<A NAME="ExampleRulesStateBunch"></A>
+<P>
+Since you often have a bunch of expressions with the same start conditions, 
+JFlex allows the same abbreviation as the Unix tool <TT>flex</TT>:
+<PRE>
+&lt;STRING&gt; {
+  expr1   { action1 }
+  expr2   { action2 }
+}
+</PRE>
+means that both <TT>expr1</TT> and <TT>expr2</TT> have start condition <TT>&lt;STRING&gt;</TT>.
+<A NAME="ExampleRulesYYINITIAL"></A>
+<P>
+The first three rules in our example demonstrate the syntax of a regular 
+expression preceded by the start condition <TT>&lt;YYINITIAL&gt;</TT>.
+
+<P>
+<TT><A HREF="#CodeRulesYYINITIAL">&lt;YYINITIAL&gt; "abstract"</A><code>  {</code> return symbol(sym.ABSTRACT); <code>}</code></TT>
+
+<P>
+matches the input "<TT>abstract</TT>" only if the scanner is in its
+start state "<TT>YYINITIAL</TT>". When the string "<TT>abstract</TT>" is
+matched, the scanner function returns the CUP symbol <TT>sym.ABSTRACT</TT>.
+If an action does not return a value, the scanning process is resumed immediately 
+after executing the action.
+<A NAME="ExampleRulesBunch"></A>
+<P>
+The rules enclosed in
+
+<P>
+<TT><A HREF="#CodeRulesBunch">&lt;YYINITIAL&gt; {
+<BR>  ...
+<BR>}</A></TT>
+
+<P>
+demonstrate the abbreviated syntax and are also only matched in state <TT>YYINITIAL</TT>.
+<A NAME="ExampleRulesYYbegin"></A>
+<P>
+Of these rules, one may be of special interest:
+
+<P>
+<code>\"  { </code> <TT><A HREF="#CodeRulesBunch">string.setLength(0); yybegin(STRING);</A></TT><code> }</code>
+
+<P>
+If the scanner matches a double quote in state <TT>YYINITIAL</TT> we
+have recognised the start of a string literal. Therefore we clear our <TT>StringBuffer</TT>
+that will hold the content of this string literal and tell the scanner
+with <TT>yybegin(STRING)</TT> to switch into the lexical state <TT>STRING</TT>.
+Because we do not yet return a value to the parser, our scanner proceeds
+immediately.
+<A NAME="ExampleRulesYYtext"></A>
+<P>
+In lexical state <TT>STRING</TT> another
+rule demonstrates how to refer to the input that has been matched:
+
+<P>
+<code>[^\n\r\"]+  { </code> <TT><A HREF="#CodeRulesYYtext">string.append( yytext() );</A></TT><code> }</code>
+
+<P>
+The expression <code>[^\n\r\"]+</code> matches
+all characters in the input up to the next backslash (indicating an
+escape sequence such as <code>\n</code>), double quote (indicating the end
+of the string), or line terminator (which must not occur in a string literal).
+The matched region of the input is referred to with <TT><A HREF="#CodeRulesYYtext">yytext()</A></TT>
+and appended to the content of the string literal parsed so far.
+<A NAME="ExampleRuleLast"></A>
+<P>
+The last lexical rule in the example specification
+is used as an error fallback. It matches any character in any state that
+has not been matched by another rule. It doesn't conflict with any other
+rule because it has the least priority (because it's the last rule) and
+because it matches only one character (so it can't have longest match
+precedence over any other rule).
+
+<P>
+
+<H2><A NAME="SECTION00044000000000000000">
+How to get it going</A>
+</H2>
+
+<UL>
+<LI>Install JFlex (see section <A HREF="#Installing">2</A> <A HREF="#Installing"><I>Installing JFlex</I></A>)
+
+<P>
+</LI>
+<LI>If you have written your specification file (or chosen one from the <TT>examples</TT>
+directory), save it (say under the name <TT>java-lang.flex</TT>).
+
+<P>
+</LI>
+<LI>Run JFlex with
+
+<P>
+<TT>jflex java-lang.flex</TT>
+
+<P>
+</LI>
+<LI>JFlex should then report some progress messages about generating the scanner
+and write the generated code to the directory of your specification file.
+
+<P>
+</LI>
+<LI>Compile the generated <TT>.java</TT> file and your own classes. (If you
+use CUP, generate your parser classes first)
+
+<P>
+</LI>
+<LI>That's it.
+</LI>
+</UL>
+
+<P>
+
+<H1><A NAME="SECTION00050000000000000000"></A><A NAME="Specifications"></A><BR>
+Lexical Specifications
+</H1>
+As shown above, a lexical specification file for JFlex consists of three
+parts divided by a single line starting with <TT>%%</TT>:
+
+<P>
+<TT><A HREF="#SpecUsercode">UserCode</A></TT>
+<BR><TT>%%</TT>
+<BR><TT><A HREF="#SpecOptions">Options and declarations</A></TT>
+<BR><TT>%%</TT>
+<BR><TT><A HREF="#LexRules">Lexical rules</A></TT>
+
+<P>
+In all parts of the specification comments of the form
+<TT>/* comment text */</TT> and the Java style end of line comments starting with <TT>//</TT>
+are permitted. JFlex comments do nest - so the number of <TT>/*</TT> and <TT>*/</TT> 
+should be balanced.
+
+<P>
+
+<H2><A NAME="SECTION00051000000000000000"></A><A NAME="SpecUsercode"></A><BR>
+User code
+</H2>
+The first part contains user code that is copied verbatim into the beginning
+of the source file of the generated lexer before the scanner class is declared. 
+As shown in the example above, this is the place to put <TT>package</TT> 
+declarations and <TT>import</TT>
+statements. It is possible, but not considered as good Java programming
+style to put own helper class (such as token classes) in this section.
+They should get their own <TT>.java</TT> file instead.
+
+<P>
+
+<H2><A NAME="SECTION00052000000000000000"></A><A NAME="SpecOptions"></A><BR>
+Options and declarations
+</H2>
+The second part of the lexical specification contains <A HREF="#SpecOptDirectives">options</A>
+to customise your generated lexer (JFlex directives and Java code to include in
+different parts of the lexer), declarations of <A HREF="#StateDecl">lexical states</A> and 
+<A HREF="#MacroDefs">macro definitions</A> for use in the third section 
+<A HREF="#LexRules">``Lexical rules''</A> of the lexical specification file.
+<A NAME="SpecOptDirectives"></A>
+<P>
+Each JFlex directive must be situated at the beginning of  a line
+and starts with the <TT>%</TT> character. Directives that have one or
+more parameters are described as follows:
+
+<P>
+<TT>%class "classname"</TT>
+
+<P>
+means that you start a line with <TT>%class</TT> followed by a space followed
+by the name of the class for the generated scanner (the double quotes are
+<I>not</I> to be entered, see the <A HREF="#CodeOptions">example specification</A> in
+section <A HREF="#CodeOptions">3</A>).
+
+<P>
+
+<H3><A NAME="SECTION00052100000000000000"></A><A NAME="ClassOptions"></A><BR>
+Class options and user class code
+</H3>
+These options regard name, constructor, API, and related parts of the
+generated scanner class.
+
+<UL>
+<LI><B><TT>%class "classname"</TT></B>
+
+<P>
+Tells JFlex to give the generated class the name "<TT>classname</TT>" and to
+write the generated code to a file "<TT>classname.java</TT>". If the 
+<TT>-d &lt;directory&gt;</TT> command line option is not used, the code
+will be written to the directory where the specification file resides. If
+no <TT>%class</TT> directive is present in the specification, the generated
+class will get the name "<TT>Yylex</TT>" and will be written to a file
+"<TT>Yylex.java</TT>". There should be only one <TT>%class</TT> directive
+in a specification.
+
+<P>
+</LI>
+<LI><B><TT>%implements "interface 1"[, "interface 2", ..]</TT></B>
+
+<P>
+Makes the generated class implement the specified interfaces. If more than
+one <TT>%implements</TT> directive is present, all the specified interfaces 
+will be implemented.
+
+<P>
+</LI>
+<LI><B><TT>%extends "classname"</TT></B>
+
+<P>
+Makes the generated class a subclass of the class ``<TT>classname</TT>''.
+There should be only one <TT>%extends</TT> directive in a specification.
+
+<P>
+</LI>
+<LI><B><TT>%public</TT></B>
+
+<P>
+Makes the generated class public (the class is only accessible in its
+own package by default).
+
+<P>
+</LI>
+<LI><B><TT>%final</TT></B>
+
+<P>
+Makes the generated class final.
+
+<P>
+</LI>
+<LI><B><TT>%abstract</TT></B>
+
+<P>
+Makes the generated class abstract.
+
+<P>
+</LI>
+<LI><B><TT>%apiprivate</TT></B>
+
+<P>
+Makes all generated methods and fields of the class
+private. Exceptions are the constructor, user code in the
+specification, and, if <code>%cup</code> is present, the method
+<TT>next_token</TT>. All occurrences of
+<TT>" public "</TT> (one space character before and after <TT>public</TT>)
+in the skeleton file are replaced by
+<TT>" private "</TT> (even if a user-specified skeleton is used).
+Access to the generated class is expected to be mediated by user class
+code (see next switch).
+
+<P>
+</LI>
+<LI><B><code>%{</code></B>
+<BR><B><TT>...</TT></B>
+<BR><B><code>%}</code></B>
+
+<P>
+The code enclosed in <code>%{</code> and <code>%}</code> is copied verbatim
+into the generated class. Here you can define your own member variables
+and functions in the generated scanner. Like all options, both <code>%{</code>
+and <code>%}</code> must start a line in the specification. If more than one
+class code directive <code>%{...%}</code> is present, the code is concatenated
+in order of appearance in the specification.
+
+<P>
+</LI>
+<LI><B><code>%init{</code></B>
+<BR><B><TT>...</TT></B>
+<BR><B><code>%init}</code></B>
+
+<P>
+The code enclosed in <code>%init{</code> and <code>%init}</code> is copied
+verbatim into the constructor of the generated class. Here, member
+variables declared in the <code>%{...%}</code> directive can be initialised.
+If more than one initialiser option is present, the code is concatenated
+in order of appearance in the specification.
+
+<P>
+</LI>
+<LI><B><code>%initthrow{</code></B>
+<BR><B><TT>"exception1"[, "exception2", ...]</TT></B>
+<BR><B><code>%initthrow}</code></B>
+
+<P>
+or (on a single line) just
+
+<P>
+<B><TT>%initthrow "exception1" [,  "exception2", ...]</TT></B>
+
+<P>
+Causes the specified exceptions to be declared in the <TT>throws</TT>
+clause of the constructor. If more than one <code>%initthrow{</code> <TT>...</TT> <code>%initthrow}</code>
+directive is present in the specification, all specified exceptions will
+be declared.
+
+<P>
+</LI>
+<LI><B><TT>%ctorarg "type" "ident"</TT></B>
+
+<P>
+Adds the specified argument to the constructors of the generated scanner. 
+If more than one such directive is present, the arguments are added in order
+of occurrence in the specification. Note that this option conflicts with
+the <code>%standalone</code> and <code>%debug</code> directives, because there is no
+sensible default that can be created automatically for such parameters 
+in the generated <TT>main</TT> methods. JFlex will warn in this case and
+generate an additional default constructor without these parameters and without user init code (which might potentially refer to the parameters).
+
+<P>
+</LI>
+<LI><B><TT>%scanerror "exception"</TT></B>
+
+<P>
+Causes the generated scanner to throw an instance of the specified
+exception in case of an internal error (default is
+<TT>java.lang.Error</TT>).  Note that this exception is only for
+internal scanner errors. With usual specifications it should never
+occur (i.e.&nbsp;if there is an error fallback rule in the specification
+and only the documented scanner API is used).
+
+<P>
+</LI>
+<LI><B><TT>%buffer "size"</TT></B>
+
+<P>
+Set the initial size of the scan buffer to the specified value 
+(decimal, in bytes). The default value is 16384.
+
+<P>
+</LI>
+<LI><B><TT>%include "filename"</TT></B>
+
+<P>
+Replaces the <TT>%include</TT> verbatim by the specified file. This
+feature is still experimental. It works, but error reporting can be
+strange if a syntax error occurs on the last token in the included
+file.
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00052200000000000000"></A><A NAME="ScanningMethod"></A><BR>
+Scanning method
+</H3>
+This section shows how the scanning method can be customised. You can redefine
+the name and return type of the method and it is possible to declare
+exceptions that may be thrown in one of the actions of the specification.
+If no return type is specified, the scanning method will be declared as
+returning values of class <TT>Yytoken</TT>.
+
+<UL>
+<LI><B><TT>%function "name"</TT></B>
+
+<P>
+Causes the scanning method to get the specified name. If no <TT>%function</TT>
+directive is present in the specification, the scanning method gets the
+name ``<TT>yylex</TT>''. This directive overrides settings of the 
+<TT><A HREF="#CupMode">%cup</A></TT> switch. Please note that the default name
+of the scanning method with the <TT><A HREF="#CupMode">%cup</A></TT> switch is
+<TT>next_token</TT>. Overriding this name might lead to the generated scanner
+being implicitly declared as <TT>abstract</TT>, because it does not provide
+the method <TT>next_token</TT> of the interface <TT>java_cup.runtime.Scanner</TT>.
+It is of course possible to provide a dummy implementation of that method
+in the class code section if you still want to override the function name.
+
+<P>
+</LI>
+<LI><B><TT>%integer</TT></B>
+<BR><B><TT>%int</TT></B>
+
+<P>
+Both cause the scanning method to be declared as of Java type <TT>int</TT>.
+Actions in the specification can then return <TT>int</TT> values as tokens.
+The default end of file value under this setting is <TT>YYEOF</TT>, which is a <TT>public
+static final int</TT> member of the generated class.
+
+<P>
+</LI>
+<LI><B><TT>%intwrap</TT></B>
+
+<P>
+Causes the scanning method to be declared as of the Java wrapper type
+<TT>Integer</TT>. Actions in the specification can then return <TT>Integer</TT>
+values as tokens. The default end of file value under this setting is <TT>null</TT>.
+
+<P>
+</LI>
+<LI><B><TT>%type "typename"</TT></B>
+
+<P>
+Causes the scanning method to be declared as returning values of the specified type.
+Actions in the specification can then return values of <TT>typename</TT>
+as tokens. The default end of file value under this setting is <TT>null</TT>.
+If <TT>typename</TT> is not a subclass of <TT>java.lang.Object</TT>,
+you should specify another end of file value using the
+<A HREF="#eofval"><TT>%eofval{</TT> <TT>...</TT> <TT>%eofval}</TT></A>
+directive or the <A HREF="#EOFRule"><TT>&lt;&lt;EOF&gt;&gt;</TT> rule</A>. 
+The <TT>%type</TT> directive overrides settings of the 
+<TT><A HREF="#CupMode">%cup</A></TT> switch.
+
+<P>
+</LI>
+<LI><B><code>%yylexthrow{</code></B>
+<BR><B><TT>"exception1"[, "exception2", ... ]</TT></B>
+<BR><B><code>%yylexthrow}</code></B>
+
+<P>
+or (on a single line) just
+
+<P>
+<B><TT>%yylexthrow "exception1" [,  "exception2", ...]</TT></B>
+
+<P>
+The exceptions listed inside <code>%yylexthrow{</code> <TT>...</TT> <code>%yylexthrow}</code> 
+will be declared in the throws clause of the scanning method. If there is
+more than one <code>%yylexthrow{</code> <TT>...</TT> <code>%yylexthrow}</code> clause in
+the specification, all specified exceptions will be declared.
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00052300000000000000"></A><A NAME="EOF"></A><BR>
+The end of file
+</H3>
+There is always a default value that the scanning method will return when
+the end of file has been reached. You may however define a specific value
+to return and a specific piece of code that should be executed when the
+end of file is reached.
+
+<P>
+The default end of file values depends on the return type of the scanning method:
+
+<UL>
+<LI>For <B><TT>%integer</TT></B>, the scanning method will return the value
+<B><TT>YYEOF</TT></B>, which is a <TT>public static final int</TT> member
+of the generated class.
+
+<P>
+</LI>
+<LI>For <B><TT>%intwrap</TT></B>, 
+</LI>
+<LI>no specified type at all, or a 
+</LI>
+<LI>user defined type, declared using <B><TT>%type</TT></B>, the value is <B><TT>null</TT></B>.
+
+<P>
+</LI>
+<LI>In CUP compatibility mode, using <B><TT>%cup</TT></B>, the value is 
+
+<P>
+<B><TT>new java_cup.runtime.Symbol(sym.EOF)</TT></B>
+</LI>
+</UL>
+
+<P>
+User values and code to be executed at the end of file can be defined using these directives:
+
+<A NAME="eofval"></A><UL>
+<LI><B><code>%eofval{</code></B>
+<BR><B><TT>...</TT></B>
+<BR><B><code>%eofval}</code></B>
+
+<P>
+The code included in <code>%eofval{</code> <TT>...</TT> <code>%eofval}</code> will
+be copied verbatim into the scanning method and will be executed <EM>each time</EM> 
+when the end of file is reached (this is possible when
+the scanning method is called again after the end of file has been
+reached). The code should return the value that indicates the end of
+file to the parser.  There should be only one <code>%eofval{</code> 
+<TT>...</TT> <code>%eofval}</code> clause in the specification.  
+The <code>%eofval{ ... %eofval}</code> directive overrides settings of the 
+<TT><A HREF="#CupMode">%cup</A></TT> switch and <TT><A HREF="#YaccMode">%byaccj</A></TT> switch. 
+As of version 1.2 JFlex provides
+a more readable way to specify the end of file value using the
+<A HREF="#EOFRule"><TT>&lt;&lt;EOF&gt;&gt;</TT> rule</A> (see also section <A HREF="#EOFRule">4.3.2</A>).
+
+<P>
+</LI>
+<LI><A NAME="eof"></A>  <B><code>%eof{</code></B>
+<BR>  <B><TT>...</TT></B>
+<BR>  <B><code>%eof}</code></B> 
+
+<P>
+The code included in <code>%{eof ... %eof}</code> will be executed
+  exactly once, when the end of file is reached. The code is included
+  inside a method <TT>void yy_do_eof()</TT> and should not return any
+  value (use <code>%eofval{...%eofval}</code> or 
+  <A HREF="#EOFRule"><TT>&lt;&lt;EOF&gt;&gt;</TT></A> for this purpose). If more than one 
+  end of file code directive is present, the code will be concatenated
+  in order of appearance in the specification.
+
+<P>
+</LI>
+<LI><B><code>%eofthrow{</code></B>
+<BR>  <B><TT>"exception1"[,"exception2", ... ]</TT></B>
+<BR>  <B><code>%eofthrow}</code></B>
+
+<P>
+or (on a single line) just
+
+<P>
+<B><TT>%eofthrow "exception1" [,  "exception2", ...]</TT></B>
+
+<P>
+The exceptions listed inside <code>%eofthrow{...%eofthrow}</code> will
+  be declared in the throws clause of the method <TT>yy_do_eof()</TT>
+  (see <A HREF="#eof"><TT>%eof</TT></A> for more on that method).
+  If there is more than one <code>%eofthrow{...%eofthrow}</code> clause
+  in the specification, all specified exceptions will be declared.
+
+<P>
+<A NAME="eofclose"></A></LI>
+<LI><B><TT>%eofclose</TT></B>
+
+<P>
+Causes JFlex to close the input stream at the end of file. The code
+  <TT>yyclose()</TT> is appended to the method <TT>yy_do_eof()</TT>
+  (together with the code specified in <code>%eof{...%eof}</code>) and
+  the exception <TT>java.io.IOException</TT> is declared in the throws
+  clause of this method (together with those of 
+  <code>%eofthrow{...%eofthrow}</code>)
+
+<P>
+</LI>
+<LI><B><TT>%eofclose false</TT></B>
+
+<P>
+Turns the effect of <TT>%eofclose</TT> off again (e.g. in case closing of
+  input stream is not wanted after <TT>%cup</TT>).
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00052400000000000000"></A><A NAME="Standalone"></A><BR>
+Standalone scanners
+</H3>
+
+<UL>
+<LI><B><TT>%debug</TT></B>
+
+<P>
+Creates a main function in the generated class that expects the name
+of an input file on the command line and then runs the scanner on this
+input file by printing information about each returned token to the Java 
+console until the end of file is reached. The information includes:
+line number (if line counting is enabled), column (if column counting is enabled),
+the matched text, and the executed action (with line number in the specification).
+
+<P>
+</LI>
+<LI><B><TT>%standalone</TT></B>
+
+<P>
+Creates a main function in the generated class that expects the name
+of an input file on the command line and then runs the scanner on this
+input file. The values returned by the scanner are ignored, but any unmatched
+text is printed to the Java console instead (as the C/C++ tool flex does, if
+run as standalone program). To avoid having to use an extra token class, the
+scanning method will be declared as having default type <TT>int</TT>, not <TT>YYtoken</TT>
+(if there isn't any other type explicitly specified).
+This is in most cases irrelevant, but could be useful to know when making
+another scanner standalone for some purpose. You should also consider using
+the <TT>%debug</TT> directive, if you just want to be able to run the scanner
+without a parser attached for testing etc.
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00052500000000000000"></A><A NAME="CupMode"></A><BR>
+CUP compatibility
+</H3>
+You may also want to read section <A HREF="#CUPWork">8.1</A> <A HREF="#CUPWork"><I>JFlex and CUP</I></A>
+if you are interested in how to interface your generated
+scanner with CUP.
+
+<UL>
+<LI><B><TT>%cup</TT></B>
+
+<P>
+The <TT>%cup</TT> directive enables the CUP compatibility mode and is equivalent
+to the following set of directives:
+
+<P>
+<PRE>
+%implements java_cup.runtime.Scanner
+%function next_token
+%type java_cup.runtime.Symbol
+%eofval{
+  return new java_cup.runtime.Symbol(&lt;CUPSYM&gt;.EOF);
+%eofval}
+%eofclose
+</PRE>
+
+<P>
+The value of <TT>&lt;CUPSYM&gt;</TT> defaults to <TT>sym</TT> and can be
+changed with the <TT>%cupsym</TT> directive. In JLex compatibility
+mode (<TT>-jlex</TT> switch on the command line), <TT>%eofclose</TT>
+will not be turned on.
+
+<P>
+</LI>
+<LI><B><TT>%cupsym "classname"</TT></B>
+
+<P>
+Customises the name of the CUP generated class/interface 
+containing the names of terminal tokens. Default is <TT>sym</TT>.
+The directive should not be used after <TT>%cup</TT>, but before.
+
+<P>
+</LI>
+<LI><B><TT>%cupdebug</TT></B>
+
+<P>
+Creates a main function in the generated class that expects the name
+of an input file on the command line and then runs the scanner on this
+input file. Prints line, column, matched text, and CUP symbol name for
+each returned token to standard out.
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00052600000000000000"></A><A NAME="YaccMode"></A><BR>
+BYacc/J compatibility
+</H3>
+You may also want to read section <A HREF="#YaccWork">8.2</A> <A HREF="#YaccWork"><I>JFlex and BYacc/J</I></A>
+if you are interested in how to interface your generated
+scanner with Byacc/J.
+
+<UL>
+<LI><B><TT>%byacc</TT></B>
+
+<P>
+The <TT>%byacc</TT> directive enables the BYacc/J compatibility mode and is equivalent
+to the following set of directives:
+
+<P>
+<PRE>
+%integer
+%eofval{
+  return 0;
+%eofval}
+%eofclose
+</PRE>
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00052700000000000000"></A><A NAME="CodeGeneration"></A><BR>
+Code generation
+</H3>
+The following options define what kind of lexical analyser code JFlex
+will produce. <TT>%pack</TT> is the default setting and will be used,
+when no code generation method is specified.
+
+<P>
+
+<UL>
+<LI><B><TT>%switch</TT></B>
+
+<P>
+With <TT>%switch</TT> JFlex will generate a scanner that has
+  the DFA hard coded into a nested switch statement. This method gives
+  a good deal of compression in terms of the size of the compiled 
+  <TT>.class</TT> file while still providing very good performance. If your
+  scanner gets to big though (say more than about 200 states)
+  performance may vastly degenerate and you should consider using one
+  of the <TT>%table</TT> or <TT>%pack</TT> directives. If your scanner
+  gets even bigger (about 300 states), the Java compiler <TT>javac</TT>
+  could produce corrupted code, that will crash when executed or will
+  give you an <TT>java.lang.VerifyError</TT> when checked by the virtual
+  machine. This is due to the size limitation of 64 KB of Java
+  methods as described in the Java Virtual Machine Specification
+  [<A
+ HREF="manual.html#MachineSpec">10</A>]. In this case you will be forced to use the 
+  <TT>%pack</TT> directive, since <TT>%switch</TT>
+  usually provides more compression of the DFA table than the 
+  <TT>%table</TT> directive.
+
+<P>
+</LI>
+<LI><B><TT>%table</TT></B>
+
+<P>
+The <TT>%table</TT> direction causes JFlex to produce a classical
+  table driven scanner that encodes its DFA table in an array.  In
+  this mode, JFlex only does a small amount of table compression (see
+  [<A
+ HREF="manual.html#ParseTable">6</A>], [<A
+ HREF="manual.html#SparseTable">12</A>], [<A
+ HREF="manual.html#Aho">1</A>] and [<A
+ HREF="manual.html#Maurer">13</A>]
+  for more details on the matter of table compression) and uses the
+  same method that JLex did up to version 1.2.1. See section <A HREF="#performance">6</A>
+  <A HREF="#performance">performance</A> of this manual to compare
+  these methods. The same reason as above (64 KB size limitation of
+  methods) causes the same problem, when the scanner gets too big.
+  This is, because the virtual machine treats static initialisers of
+  arrays as normal methods. You will in this case again be forced to
+  use the <TT>%pack</TT> directive to avoid the problem.
+
+<P>
+</LI>
+<LI><B><TT>%pack</TT></B>
+
+<P>
+<TT>%pack</TT> causes JFlex to compress the generated DFA table and to
+  store it in one or more string literals. JFlex takes care that the
+  strings are not longer than permitted by the class file format.
+  The strings have to be unpacked when
+  the first scanner object is created and initialised.
+  After unpacking the internal access to the DFA table is exactly the
+  same as with option <TT>%table</TT> -- the only extra work to be done
+  at runtime is the unpacking process which is quite fast (not noticeable
+  in normal cases). It is in time complexity proportional to the
+  size of the expanded DFA table, and it is static,
+  i.e. it is done only once for a certain scanner class -- no matter
+  how often it is instantiated.  Again, see section
+  <A HREF="#performance">6</A> <A HREF="#performance">performance</A>
+  on the performance of these scanners
+  With <TT>%pack</TT>, there should be practically no
+  limitation to the size of the scanner. <TT>%pack</TT> is the default
+  setting and will be used when no code generation method is specified.
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00052800000000000000"></A><A NAME="CharacterSets"></A><BR>
+Character sets
+</H3>
+
+<UL>
+<LI><B><TT>%7bit</TT></B>
+
+<P>
+Causes the generated scanner to use an 7 bit input character set (character
+codes 0-127). If an input character with a code greater than 127 is
+encountered in an input at runtime, the scanner will throw an <TT>ArrayIndexOutofBoundsException</TT>.
+Not only because of this, you should consider using the <TT>%unicode</TT> directive. 
+See also section <A HREF="#sec:encodings">5</A> for information about character encodings. This is the default in JLex compatibility mode.
+
+<P>
+</LI>
+<LI><B><TT>%full</TT></B>
+<BR><B><TT>%8bit</TT></B>
+
+<P>
+Both options cause the generated scanner to use an 8 bit input character
+set (character codes 0-255). If an input character with a code greater
+than 255 is encountered in an input at runtime, the scanner will throw
+an <TT>ArrayIndexOutofBoundsException</TT>. Note that even if your platform
+uses only one byte per character, the Unicode value of a character may
+still be greater than 255. If you are scanning text files, you should
+consider using the <TT>%unicode</TT> directive. See also section <A HREF="#sec:encodings">5</A>
+for more information about character encodings.
+
+<P>
+</LI>
+<LI><B><TT>%unicode</TT></B>
+<BR><B><TT>%16bit</TT></B>
+
+<P>
+Both options cause the generated scanner to use the full 16 bit Unicode input
+character set that Java supports natively (character code points 0-65535).
+There will be no runtime overflow when using this set of input characters.
+<TT>%unicode</TT> does not mean that the scanner will read two bytes at a
+time. What is read and what constitutes a character depends on the runtime
+platform. See also section <A HREF="#sec:encodings">5</A> for more information about
+character encodings. This is the default unless the JLex compatibility mode is
+used (command line option <TT>-jlex</TT>).
+
+<P>
+<A NAME="caseless"></A></LI>
+<LI><B><TT>%caseless</TT></B>
+<BR><B><TT>%ignorecase</TT></B>
+
+<P>
+This option causes JFlex to handle all characters and strings in the
+specification as if they were specified in both uppercase and lowercase form.
+This enables an easy way to specify a scanner for a language with case
+insensitive keywords. The string "<TT>break</TT>" in a specification is for
+instance handled like the expression <TT>([bB][rR][eE][aA][kK])</TT>. The
+<TT>%caseless</TT> option does not change the matched text and does not
+effect character classes. So <TT>[a]</TT> still only matches the character
+<TT>a</TT> and not <TT>A</TT>, too. Which letters are uppercase and which
+lowercase letters, is defined by the Unicode standard and determined by JFlex
+with the Java methods <TT>Character.toUpperCase</TT> and
+<TT>Character.toLowerCase</TT>. In JLex compatibility mode (<TT>-jlex</TT>
+switch on the command line), <TT>%caseless</TT> and <TT>%ignorecase</TT>
+also affect character classes.
+
+<P>
+</LI>
+</UL>
+<H3><A NAME="SECTION00052900000000000000"></A><A NAME="Counting"></A><BR>
+Line, character and column counting
+</H3>
+
+<UL>
+<LI><B><TT>%char</TT></B>
+
+<P>
+Turns character counting on. The <TT>int</TT> member variable <TT>yychar</TT>
+contains the number of characters (starting with 0) from the beginning
+of input to the beginning of the current token.
+
+<P>
+</LI>
+<LI><B><TT>%line</TT></B>
+
+<P>
+Turns line counting on. The <TT>int</TT> member variable <TT>yyline</TT>
+contains the number of lines (starting with 0) from the beginning of input
+to the beginning of the current token.
+
+<P>
+</LI>
+<LI><B><TT>%column</TT></B>
+
+<P>
+Turns column counting on. The <TT>int</TT> member variable <TT>yycolumn</TT>
+contains the number of characters (starting with 0) from the beginning
+of the current line to the beginning of the current token.
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION000521000000000000000"></A><A NAME="Obsolete"></A><BR>
+Obsolete JLex options
+</H3>
+
+<UL>
+<LI><B><TT>%notunix</TT></B>
+
+<P>
+This JLex option is obsolete in JFlex but still recognised as valid directive.
+It used to switch between Windows and Unix kind of line terminators (<code>\r\n</code>
+and <code>\n</code>) for the <TT>$</TT> operator in regular expressions. JFlex
+always recognises both styles of platform dependent line terminators.
+
+<P>
+</LI>
+<LI><B><TT>%yyeof</TT></B>
+
+<P>
+This JLex option is obsolete in JFlex but still recognised as valid directive.
+In JLex it declares a public member constant <TT>YYEOF</TT>. JFlex declares it in any case.
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION000521100000000000000"></A><A NAME="StateDecl"></A><BR>
+State declarations
+</H3>
+State declarations have the following from:
+
+<P>
+<TT>%s[tate] "state identifier" [, "state identifier", ... ]</TT> for inclusive or
+<BR><TT>%x[state] "state identifier" [, "state identifier", ... ]</TT> for exclusive states
+
+<P>
+There may be more than one line of state declarations, each starting with
+<TT>%state</TT> or <TT>%xstate</TT> (the first character is sufficient,
+<TT>%s</TT> and <TT>%x</TT> works, too). State identifiers are letters followed 
+by a sequence of letters, digits or underscores. State identifiers can be separated 
+by white-space or comma.
+
+<P>
+The sequence
+
+<P>
+<TT>%state STATE1</TT>
+<BR><TT>%xstate STATE3, XYZ, STATE_10</TT>
+<BR><TT>%state ABC STATE5</TT>
+
+<P>
+declares the set of identifiers <TT>STATE1, STATE3, XYZ,
+    STATE_10, ABC, STATE5</TT> as lexical states, <TT>STATE1</TT>, <TT>ABC</TT>, <TT>STATE5</TT>
+as inclusive, and <TT>STATE3</TT>, <TT>XYZ</TT>, <TT>STATE_10</TT> as exclusive. 
+See also section
+<A HREF="#HowMatched">4.3.3</A> on the way lexical states influence how the input is
+matched.
+
+<P>
+
+<H3><A NAME="SECTION000521200000000000000"></A><A NAME="MacroDefs"></A><BR>
+Macro definitions
+</H3>
+A macro definition has the form
+
+<P>
+<TT>macroidentifier = regular expression</TT>
+
+<P>
+That means, a macro definition is a macro identifier (letter followed
+by a sequence of letters, digits or underscores), that can later be
+used to reference the macro, followed by optional white-space, followed
+by an "<TT>=</TT>", followed by optional white-space, followed by a
+regular expression (see section <A HREF="#LexRules">4.3</A> <A HREF="#LexRules"><I>lexical
+    rules</I></A> for more information about regular expressions).
+
+<P>
+The regular expression on the right hand side must be well formed and
+must not contain the <code>^</code>, <TT>/</TT> or <TT>$</TT> operators. <B>Differently
+to JLex, macros are not just pieces of text that are expanded by copying</B>
+- they are parsed and must be well formed.
+
+<P>
+<B>This is a feature.</B> It eliminates some very hard to find bugs in
+lexical specifications (such like not having parentheses around more
+complicated macros - which is not necessary with JFlex).  See section
+<A HREF="#Porting">7.1</A> <A HREF="#Porting"><I>Porting from JLex</I></A> for more
+details on the problems of JLex style macros.
+
+<P>
+Since it is allowed to have macro usages in macro definitions, it is
+possible to use a grammar like notation to specify the desired lexical
+structure. Macros however remain just abbreviations of the regular expressions
+they represent. They are not non terminals of a grammar and cannot be used
+recursively in any way. JFlex detects cycles in macro definitions and reports
+them at generation time. JFlex also warns you about macros that have been
+defined but never used in the ``lexical rules'' section of the specification.
+
+<P>
+
+<H2><A NAME="SECTION00053000000000000000"></A><A NAME="LexRules"></A><BR>
+Lexical rules
+</H2>
+The ``lexical rules'' section of an JFlex specification contains a set of
+regular expressions and actions (Java code) that are executed when the
+scanner matches the associated regular expression.
+
+<P>
+
+<H3><A NAME="SECTION00053100000000000000"></A><A NAME="Grammar"></A><BR>
+Syntax
+</H3>
+The syntax of the "lexical rules" section is described by the following
+BNF grammar (terminal symbols are enclosed in 'quotes'):
+
+<P>
+<PRE>
+LexicalRules ::= Rule+ 
+Rule         ::= [StateList] ['^'] RegExp [LookAhead] Action 
+               | [StateList] '&lt;&lt;EOF&gt;&gt;' Action
+               | StateGroup 
+StateGroup   ::= StateList '{' Rule+ '}' 
+StateList    ::= '&lt;' Identifier (',' Identifier)* '&gt;' 
+LookAhead    ::= '$' | '/' RegExp
+Action       ::= '{' JavaCode '}' | '|'
+
+RegExp       ::= RegExp '|' RegExp 
+               | RegExp RegExp 
+               | '(' RegExp ')'
+               | ('!'|'~') RegExp
+               | RegExp ('*'|'+'|'?')
+               | RegExp "{" Number ["," Number] "}" 
+               | '[' ['^'] (Character|Character'-'Character)* ']' 
+               | PredefinedClass 
+               | '{' Identifier '}' 
+               | '"' StringCharacter+ '"' 
+               | Character 
+
+PredefinedClass ::= '[:jletter:]' 
+                  | '[:jletterdigit:]' 
+                  | '[:letter:]' 
+                  | '[:digit:]' 
+                  | '[:uppercase:]' 
+                  | '[:lowercase:]' 
+                  | '.'
+</PRE>
+
+<P>
+<A NAME="Terminals"></A>The grammar uses the following terminal symbols:   
+
+<UL>
+<LI><TT>JavaCode</TT>
+<BR>  a sequence of <EM><TT>BlockStatements</TT></EM> as described in the Java
+  Language Specification [<A
+ HREF="manual.html#LangSpec">7</A>], section 14.2.
+
+<P>
+</LI>
+<LI><TT>Number</TT>
+<BR>  a non negative decimal integer.
+
+<P>
+</LI>
+<LI><TT>Identifier</TT>
+<BR>  a letter <code>[a-zA-Z]</code> followed by a sequence of zero or more
+  letters, digits or underscores <code>[a-zA-Z0-9_]</code>
+
+<P>
+</LI>
+<LI><TT>Character</TT>
+<BR>  an escape sequence or any unicode character that is not one of these
+  meta characters:
+  <code>  |  (  )  {  }  [  ]  &lt; &gt;  \  .  *  +  ?  ^  $  / . " ~ !</code>
+
+<P>
+</LI>
+<LI><TT>StringCharacter</TT>
+<BR>  an escape sequence or any unicode character that is not one of these
+  meta characters:
+  <code>  \  "</code>
+
+<P>
+</LI>
+<LI>An escape sequence
+
+<P>
+
+<UL>
+<LI><code>\n</code>  <code>\r</code>  <code>\t</code>  <code>\f</code>  <code>\b</code>
+</LI>
+<LI>a <code>\x</code> followed by two hexadecimal digits <TT>[a-fA-F0-9]</TT> (denoting
+    a standard ASCII escape sequence),
+
+<P>
+</LI>
+<LI>a <code>\u</code> followed by four hexadecimal digits <TT>[a-fA-F0-9]</TT>
+    (denoting an unicode escape sequence),
+
+<P>
+</LI>
+<LI>a backslash followed by a three digit octal number from 000 to 377 (denoting
+    a standard ASCII escape sequence), or
+
+<P>
+</LI>
+<LI>a backslash followed by any other unicode character that stands for this
+    character.
+
+<P>
+</LI>
+</UL>
+
+<P>
+</LI>
+</UL>
+
+<P>
+Please note that the <code>\n</code> escape sequence stands for the ASCII
+LF character - not for the end of line. If you would like to match the
+line terminator, you should use the expression <code>\r|\n|\r\n</code> if you want
+the Java conventions, or <code>\r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085</code>
+if you want to be fully Unicode compliant (see also [<A
+ HREF="manual.html#unicode_rep">5</A>]).
+
+<P>
+As of version 1.1 of JFlex the white-space characters <TT>" "</TT>
+(space) and <code>"\t"</code> (tab) can be used to improve the readability of
+regular expressions. They will be ignored by JFlex. In character
+classes and strings however, white-space characters keep standing for
+themselves (so the string <TT>" "</TT> still matches exactly one space
+character and <code>[ \n]</code> still matches an ASCII LF or a space
+character).
+
+<P>
+JFlex applies the following standard operator precedences in regular
+expression (from highest to lowest):
+
+<P>
+
+<UL>
+<LI>unary postfix operators (<code>'*', '+', '?', {n}, {n,m}</code>)
+
+<P>
+</LI>
+<LI>unary prefix operators (<code>'!', '~'</code>)
+
+<P>
+</LI>
+<LI>concatenation (<TT>RegExp::= RegExp Regexp</TT>)
+
+<P>
+</LI>
+<LI>union (<code>RegExp::= RegExp '|' RegExp</code>)
+</LI>
+</UL>
+
+<P>
+So the expression <code>a | abc | !cd*</code> for instance is parsed as 
+<code>(a|(abc)) | ((!c)(d*))</code>.
+
+<P>
+
+<H3><A NAME="SECTION00053200000000000000"></A><A NAME="Semantics"></A><BR>
+Semantics
+</H3>
+This section gives an informal description of which text is matched by
+a regular expression (i.e. an expression described by the <TT>RegExp</TT>
+production of the grammar presented <A HREF="#Grammar">above</A>).
+
+<P>
+A regular expression that consists solely of
+
+<UL>
+<LI>a <TT>Character</TT> matches this character.
+
+<P>
+</LI>
+<LI>a character class <code>'[' (Character|Character'-'Character)* ']'</code> matches
+  any character in that class. A <TT>Character</TT> is to be considered an
+  element of a class, if it is listed in the class or if its code lies within
+  a listed character range <TT>Character'-'Character</TT>. So <code>[a0-3\n]</code>
+  for instance matches the characters
+
+<P>
+<code>a 0 1 2 3 \n</code>
+
+<P>
+If the list of characters is empty (i.e.&nbsp;just <code>[]</code>), the expression
+  matches nothing at all (the empty set), not even the empty string. This
+  may be useful in combination with the negation operator <code>'!'</code>.
+
+<P>
+</LI>
+<LI>a negated character class <code>'[^' (Character|Character'-'Character)* ']'</code>
+  matches all characters not listed in the class. If the list of characters
+  is empty (i.e. <code>[^]</code>), the expression matches any character of the
+  input character set.
+
+<P>
+</LI>
+<LI>a string <TT>'"' StringCharacter+ '"</TT> <TT>'</TT> matches the exact
+  text enclosed in double quotes. All meta characters but <code>\</code> and
+  <TT>"</TT>  loose their special meaning inside a string. See also the
+  <A HREF="#caseless"><TT>%ignorecase</TT></A> switch.
+
+<P>
+</LI>
+<LI>a macro usage <code>'{' Identifier '}'</code> matches the input that is matched
+  by the right hand side of the macro with name "<TT>Identifier</TT>".
+
+<P>
+<A NAME="predefCharCl"></A></LI>
+<LI>a predefined character class matches any of
+  the characters in that class. There are the following predefined character
+  classes:
+
+<P>
+<TT>.</TT>  contains all characters but <code>\n</code>.
+
+<P>
+All other predefined character classes are defined in the Unicode
+  specification or the Java Language Specification and determined by
+  Java functions of class
+  <TT>java</TT>.<TT>lang</TT>.<TT>Character</TT>.
+
+<P>
+<PRE>
+[:jletter:]      isJavaIdentifierStart()
+[:jletterdigit:] isJavaIdentifierPart()
+[:letter:]       isLetter()
+[:digit:]        isDigit()
+[:uppercase:]    isUpperCase()
+[:lowercase:]    isLowerCase()
+</PRE>
+
+<P>
+They are especially useful when working with the unicode character set.
+
+<P>
+</LI>
+</UL>
+
+<P>
+If <TT>a</TT> and <TT>b</TT> are regular expressions, then
+
+<P>
+<DL COMPACT>
+<DT><TT>a | b</TT></DT>
+<DD>(union) 
+
+<P>
+is the regular expression, that matches
+            all input that is matched by <TT>a</TT> or by <TT>b</TT>.
+
+<P>
+</DD>
+<DT><TT>a b</TT></DT>
+<DD>(concatenation) 
+
+<P>
+is the regular expression,
+            that matches the input matched by <TT>a</TT> followed by the 
+            input matched by <TT>b</TT>.
+
+<P>
+</DD>
+<DT><TT>a*</TT></DT>
+<DD>(Kleene closure) 
+
+<P>
+matches zero or more repetitions
+            of the input matched by <TT>a</TT>
+
+<P>
+</DD>
+<DT><TT>a+</TT></DT>
+<DD>(iteration)
+
+<P>
+is equivalent to <TT>aa*</TT>
+
+<P>
+</DD>
+<DT><TT>a?</TT></DT>
+<DD>(option)
+
+<P>
+matches the empty input or the input matched
+            by <TT>a</TT>
+
+<P>
+</DD>
+<DT><TT>!a</TT></DT>
+<DD>(negation)
+
+<P>
+matches everything but the strings matched by <TT>a</TT>. 
+          Use with care: the construction of <code>!a</code> involves
+          an additional, possibly exponential NFA to DFA transformation 
+          on the NFA for <TT>a</TT>. Note that
+          with negation and union you also have (by applying DeMorgan)
+          intersection and set difference: the intersection of 
+          <TT>a</TT> and <TT>b</TT> is <code>!(!a|!b)</code>, the expression 
+          that matches everything of <TT>a</TT> not matched by <TT>b</TT> is 
+          <code>!(!a|b)</code>
+
+<P>
+</DD>
+<DT><TT>~a</TT></DT>
+<DD>(upto)
+
+<P>
+matches everything up to (and including) the first occurrence of a text
+          matched by <TT>a</TT>. The expression <code>~a</code> is equivalent
+          to <code>!([^]* a [^]*) a</code>. A traditional C-style comment
+          is matched by <code>"/*" ~"*/"</code>
+
+<P>
+</DD>
+<DT><TT>a{n}</TT></DT>
+<DD>(repeat)          
+
+<P>
+is equivalent to <TT>n</TT> times the concatenation of <TT>a</TT>.
+            So <code>a{4}</code> for instance is equivalent to the expression <TT>a a a a</TT>.
+            The decimal integer <TT>n</TT> must be positive.          
+
+<P>
+</DD>
+<DT><TT>a{n,m}</TT></DT>
+<DD>is equivalent to at least <TT>n</TT> times and at most <TT>m</TT> times the 
+            concatenation of <TT>a</TT>. So <code>a{2,4}</code> for instance is equivalent 
+            to the expression <code>a a a? a?</code>. Both <TT>n</TT> and <TT>m</TT> are non
+            negative decimal integers and <TT>m</TT> must not be smaller than <TT>n</TT>.
+
+<P>
+</DD>
+<DT><TT>( a )</TT></DT>
+<DD>matches the same input as <TT>a</TT>.
+
+<P>
+</DD>
+</DL>
+
+<P>
+In a lexical rule, a regular expression <TT>r</TT> may be preceded by a
+'<code>^</code>' (the beginning of line operator). <TT>r</TT> is then
+only matched at the beginning of a line in the input. A line begins
+after each occurrence of <code>\r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085</code> 
+(see also [<A
+ HREF="manual.html#unicode_rep">5</A>]) and at the beginning of input.  
+The preceding line terminator in the input is not consumed and can 
+be matched by another rule.
+
+<P>
+In a lexical rule, a regular expression <TT>r</TT> may be followed by a
+look-ahead expression. A look-ahead expression is either a '<TT>$</TT>'
+(the end of line operator) or a <code>'/'</code> followed by an arbitrary
+regular expression. In both cases the look-ahead is not consumed and
+not included in the matched text region, but it <EM>is</EM> considered
+while determining which rule has the longest match (see also 
+<A HREF="#HowMatched">4.3.3</A> <A HREF="#HowMatched"><I>How the input is matched</I></A>). 
+
+<P>
+In the '<TT>$</TT>' case <TT>r</TT> is only matched at the end of a line in
+the input. The end of a line is denoted by the regular expression
+<code>\r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085</code>. 
+So <code>a$</code> is equivalent to <code>a / \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085</code>.This is a bit different to the situation described in [<A
+ HREF="manual.html#unicode_rep">5</A>]:
+since in JFlex <code>$</code> is a true trailing context, the end of file
+does <B>not</B> count as end of line.
+
+<P>
+<A NAME="trailingContext"></A>For arbitrary look-ahead (also called <EM>trailing context</EM>) the 
+expression is matched only when followed by input that matches the
+trailing context. 
+
+<P>
+<A NAME="EOFRule"></A>As of version 1.2, JFlex allows lex/flex style <TT>&#171;EOF&#187;</TT> rules in
+lexical specifications. A rule
+<PRE>
+[StateList]  &lt;&lt;EOF&gt;&gt;    { some action code }
+</PRE>
+is very similar to the <A HREF="#eofval"><TT>%eofval</TT> directive</A> (section <A HREF="#eofval">4.2.3</A>). 
+The difference lies in the optional <TT>StateList</TT> that may precede the <TT>&#171;EOF&#187;</TT> rule. The
+action code will only be executed when the end of file is read and the
+scanner is currently in one of the lexical states listed in <TT>StateList</TT>. 
+The same <TT>StateGroup</TT> (see section <A HREF="#HowMatched">4.3.3</A> 
+<A HREF="#HowMatched"><I>How the input is matched</I></A>) and precedence 
+rules as in the ``normal'' rule case apply 
+(i.e. if there is more than one <TT>&#171;EOF&#187;</TT> 
+rule for a certain lexical state, the action of the one appearing 
+earlier in the specification will be executed). <TT>&#171;EOF&#187;</TT> rules 
+override settings of the <TT>%cup</TT> and <TT>%byaccj</TT> options and 
+should not be mixed with the <TT>%eofval</TT> directive.
+
+<P>
+An <TT>Action</TT> consists either of a piece of Java code enclosed in
+curly braces or is the special <code>|</code> action. The <code>|</code> action is
+an abbreviation for the action of the following expression.
+
+<P>
+Example:
+<PRE>
+expression1   |
+expression2   |
+expression3   { some action }
+</PRE>
+is equivalent to the expanded form
+<PRE>
+expression1   { some action }
+expression2   { some action }
+expression3   { some action }
+</PRE>
+
+<P>
+They are useful when you work with trailing context expressions. The 
+expression <TT>a | (c / d) | b</TT> is not syntactically legal, but can 
+easily be expressed using the <code>|</code> action:
+<PRE>
+a       |
+c / d   |
+b       { some action }
+</PRE>
+
+<P>
+
+<H3><A NAME="SECTION00053300000000000000"></A><A NAME="HowMatched"></A><BR>
+How the input is matched
+</H3>
+When consuming its input, the scanner determines the regular expression
+that matches the longest portion of the input (longest match rule). If
+there is more than one regular expression that matches the longest portion
+of input (i.e. they all match the same input), the generated scanner chooses
+the expression that appears first in the specification. After determining
+the active regular expression, the associated action is executed. If there
+is no matching regular expression, the scanner terminates the program with
+an error message (if the <TT>%standalone</TT> directive has been used, the
+scanner prints the unmatched input to <TT>java.lang.System.out</TT> instead
+and resumes scanning). 
+
+<P>
+Lexical states can be used to further restrict the set of regular expressions
+that match the current input. 
+
+<P>
+
+<UL>
+<LI>A regular expression can only be matched when its associated set of lexical
+states includes the currently active lexical state of the scanner or if
+the set of associated lexical states is empty and the currently active lexical
+state is inclusive. Exclusive and inclusive states only differ at this point: 
+rules with an empty set of associated states.
+
+<P>
+</LI>
+<LI>The currently active lexical state of the scanner can be changed from within
+an action of a regular expression using the method <TT>yybegin()</TT>.
+
+<P>
+</LI>
+<LI>The scanner starts in the inclusive lexical state 
+<TT>YYINITIAL</TT>, which is always declared by default.
+
+<P>
+</LI>
+<LI>The set of lexical states associated with a regular expression is 
+the <TT>StateList</TT> that precedes the expression. If a rule is
+contained in one or more <TT>StateGroups</TT>, then the states of
+these are also associated with the rule, i.e.&nbsp;they accumulate over
+<TT>StateGroups</TT>.
+
+<P>
+Example:
+<PRE>
+%states A, B
+%xstates C
+%%
+expr1                   { yybegin(A); action }
+&lt;YYINITIAL, A&gt; expr2    { action }
+&lt;A&gt; {
+  expr3                 { action }
+  &lt;B,C&gt; expr4           { action }
+}
+</PRE>
+The first line declares two (inclusive) lexical states <TT>A</TT> and <TT>B</TT>,
+the second line an exclusive lexical state <TT>C</TT>.
+The default (inclusive) state <TT>YYINITIAL</TT> is always implicitly there and
+doesn't need to be declared. The rule with <TT>expr1</TT> has no
+states listed, and is thus matched in all states but the exclusive
+ones, i.e.&nbsp;<TT>A</TT>, <TT>B</TT>, and <TT>YYINITIAL</TT>. In its
+action, the scanner is switched to state <TT>A</TT>. The second rule
+<TT>expr2</TT> can only match when the scanner is in state
+<TT>YYINITIAL</TT> or <TT>A</TT>. The rule <TT>expr3</TT> can only be
+matched in state <TT>A</TT> and <TT>expr4</TT> in states <TT>A</TT>, <TT>B</TT>,
+and <TT>C</TT>.
+
+<P>
+</LI>
+<LI>Lexical states are declared and used as Java <TT>int</TT> constants in
+the generated class under the same name as they are used in the specification.
+There is no guarantee that the values of these integer constants are
+distinct. They are pointers into the generated DFA table, and if JFlex
+recognises two states as lexically equivalent (if they are used with the
+exact same set of regular expressions), then the two constants will get
+the same value.
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H3><A NAME="SECTION00053400000000000000">
+The generated class</A>
+</H3>
+JFlex generates exactly one file containing one class from the specification
+(unless you have declared another class in the first specification section).
+
+<P>
+The generated class contains (among other things) the DFA tables, an input buffer, 
+the lexical states of the specification, a constructor, and the scanning method
+with the user supplied actions.
+
+<P>
+The name of the class is by default <TT>Yylex</TT>, it is customisable
+with the <TT>%class</TT> directive (see also section
+<A HREF="#ClassOptions">4.2.1</A>). The input buffer of the lexer is connected with an
+input stream over the <TT>java.io.Reader</TT> object which is passed
+to the lexer in the generated constructor. If you want to provide your
+own constructor for the lexer, you should always call the generated
+one in it to initialise the input buffer. The input buffer should not
+be accessed directly, but only over the advertised API (see also
+section <A HREF="#ScannerMethods">4.3.5</A>). Its internal implementation may change
+between releases or skeleton files without notice.
+
+<P>
+The main interface to the outside world is the generated scanning
+method (default name <TT>yylex</TT>, default return type
+<TT>Yytoken</TT>). Most of its aspects are customisable (name, return
+type, declared exceptions etc., see also section
+<A HREF="#ScanningMethod">4.2.2</A>).  If it is called, it will consume input until
+one of the expressions in the specification is matched or an error
+occurs. If an expression is matched, the corresponding action is
+executed. It may return a value of the specified return type (in which
+case the scanning method return with this value), or if it doesn't
+return a value, the scanner resumes consuming input until the next
+expression is matched. If the end of file is reached, the scanner
+executes the EOF action, and (also upon each further call to the scanning
+method) returns the specified EOF value (see also section <A HREF="#EOF">4.2.3</A>).
+
+<P>
+
+<H3><A NAME="SECTION00053500000000000000"></A><A NAME="ScannerMethods"></A><BR>
+Scanner methods and fields accessible in actions (API)
+</H3>
+Generated methods and member fields in JFlex scanners are prefixed
+with <TT>yy</TT> to indicate that they are generated and to avoid name
+conflicts with user code copied into the class. Since user code is
+part of the same class, JFlex has no language means like the
+<TT>private</TT> modifier to indicate which members and methods are
+internal and which ones belong to the API. Instead, JFlex follows a
+naming convention: everything starting with a <TT>zz</TT> prefix like
+<TT>zzStartRead</TT> is to be considered internal and subject to
+change without notice between JFlex releases. Methods and members of
+the generated class that do not have a <TT>zz</TT> prefix like
+<TT>yycharat</TT> belong to the API that the scanner class provides to
+users in action code of the specification. They will be remain stable
+and supported between JFlex releases as long as possible.
+
+<P>
+Currently, the API consists of the following methods and member fields:
+
+<UL>
+<LI><TT>String yytext()</TT>
+<BR>  returns the matched input text region
+
+<P>
+</LI>
+<LI><TT>int yylength()</TT>
+<BR>  returns the length of the matched input text region (does not require
+  a <TT>String</TT> object to be created)
+
+<P>
+</LI>
+<LI><TT>char yycharat(int pos)</TT>
+<BR>  returns the character at position <TT>pos</TT> from the matched text.
+  It is equivalent to <TT>yytext().charAt(pos)</TT>, but faster.  <TT>  pos</TT> must be a value from <TT>0</TT> to <TT>yylength()-1</TT>.
+
+<P>
+</LI>
+<LI><TT>void yyclose()</TT>
+<BR>  closes the input stream. All subsequent calls to the scanning method will 
+  return the end of file value    
+
+<P>
+</LI>
+<LI><TT>void yyreset(java.io.Reader reader)</TT>
+<BR>  closes the current input stream, and resets the scanner to read from
+  a new input stream.  All internal variables are reset, the old input
+  stream <EM>cannot</EM> be reused (content of the internal buffer is
+  discarded and lost).  The lexical state is set to <TT>YY_INITIAL</TT>.
+
+<P>
+</LI>
+<LI><TT>void yypushStream(java.io.Reader reader)</TT>
+<BR> Stores the current input stream on a stack, and
+ reads from a new stream. Lexical state, line,
+ char, and column counting remain untouched.
+ The current input stream can be restored with
+ <TT>yypopstream</TT> (usually in an <TT>&#171;EOF&#187;</TT> action).
+
+<P>
+A typical example for this are include files in
+ style of the C pre-processor. The corresponding 
+ JFlex specification could look somewhat like this:
+<PRE>
+"#include" {FILE}  { yypushStream(new FileReader(getFile(yytext()))); }
+..
+&lt;&lt;EOF&gt;&gt;        { if (yymoreStreams()) yypopStream(); else return EOF; }
+</PRE>
+
+<P>
+This method is only available in the skeleton file
+ <TT>skeleton.nested</TT>. You can find it in the 
+ <TT>src</TT> directory of the JFlex distribution.
+
+<P>
+</LI>
+<LI><TT>void yypopStream()</TT>
+<BR>  Closes the current input stream and continues to
+  read from the one on top of the stream stack.
+
+<P>
+This method is only available in the skeleton file
+  <TT>skeleton.nested</TT>. You can find it in the 
+  <TT>src</TT> directory of the JFlex distribution.
+
+<P>
+</LI>
+<LI><TT>boolean yymoreStreams()</TT>
+<BR>  Returns true iff there are still streams for <TT>yypopStream</TT> 
+  left to read from on the stream stack.
+
+<P>
+This method is only available in the skeleton file
+  <TT>skeleton.nested</TT>. You can find it in the 
+  <TT>src</TT> directory of the JFlex distribution. 
+
+<P>
+</LI>
+<LI><TT>int yystate()</TT>
+<BR>  returns the current lexical state of the scanner.
+
+<P>
+</LI>
+<LI><TT>void yybegin(int lexicalState)</TT>
+<BR>  enters the lexical state <TT>lexicalState</TT>
+
+<P>
+</LI>
+<LI><TT>void yypushback(int number)</TT>
+<BR>  pushes <TT>number</TT> characters of the matched text back into the input stream. 
+  They will be read again in the next call of the scanning method. 
+  The number of characters to be read again must not be greater than the length
+  of the matched text. The pushed back characters will after the call of 
+  <TT>yypushback</TT> not be included in <TT>yylength</TT> and <TT>yytext()</TT>.
+  Please note that in Java strings are unchangeable, i.e. an action code like
+  <PRE>
+    String matched = yytext();
+    yypushback(1);
+    return matched;
+</PRE>
+  will return the whole matched text, while    
+  <PRE>
+    yypushback(1);
+    return yytext();
+</PRE>
+  will return the matched text minus the last character.
+
+<P>
+</LI>
+<LI><TT>int yyline</TT>
+<BR>  contains the current line of input (starting with 0, only active with
+  the <TT><A HREF="#Counting">%line</A></TT> directive)
+
+<P>
+</LI>
+<LI><TT>int yychar</TT>
+<BR>  contains the current character count in the input (starting with 0,
+  only active with the <TT><A HREF="#Counting">%char</A></TT> directive)
+
+<P>
+</LI>
+<LI><TT>int yycolumn</TT>
+<BR>  contains the current column of the current line (starting with 0, only
+  active with the <TT><A HREF="#Counting">%column</A></TT> directive)
+
+<P>
+</LI>
+</UL>
+
+<P>
+
+<H1><A NAME="SECTION00060000000000000000"></A><A NAME="sec:encodings"></A><BR>
+Encodings, Platforms, and Unicode
+</H1>
+
+<P>
+This section tries to shed some light on the issues of Unicode and
+encodings, cross platform scanning, and how to deal with binary data.
+My thanks go to Stephen Ostermiller for his input on this topic.
+
+<P>
+
+<H2><A NAME="SECTION00061000000000000000"></A><A NAME="sec:howtoencoding"></A><BR>
+The Problem
+</H2>
+
+<P>
+Before we dive straight into details, let's take a look at what the
+problem is. The problem is Java's platform independence when you want
+to use it. For scanners the interesting part about platform
+independence is character encodings and how they are handled.
+
+<P>
+If a program reads a file from disk, it gets a stream of bytes.  In
+earlier times, when the grass was green, and the world was much
+simpler, everybody knew that the byte value 65 is, of course, an A.
+It was no problem to see which bytes meant which characters (actually
+these times never existed, but anyway).  The normal Latin alphabet
+only has 26 characters, so 7 bits or 128 distinct values should surely
+be enough to map them, even if you allow yourself the luxury of upper
+and lower case.  Nowadays, things are different. The world suddenly
+grew much larger, and all kinds of people wanted all kinds of special
+characters, just because they use them in their language and writing.
+This is were the mess starts. Since the 128 distinct values were
+already filled up with other stuff, people began to use all 8 bits of
+the byte, and extended the byte/character mappings to fit their need,
+and of course everybody did it differently. Some people for instance
+may have said ``let's use the value 213 for the German character &#228;''.  Others
+may have found that 213 should much rather mean &#233;, because they didn't need
+German and wrote French instead. As long as you use your program and
+data files only on one platform, this is no problem, as all know what
+means what, and everything gets used consistently.
+
+<P>
+Now Java comes into play, and wants to run everywhere (once written,
+that is) and now there suddenly is a problem: how do I get the same
+program to say &#228; to a certain byte when it runs in Germany and maybe &#233;
+when it runs in France? And also the other way around: when I want to
+say &#233; on the screen, which byte value should I send to the operating
+system?
+
+<P>
+Java's solution to this is to use Unicode internally.  Unicode aims to
+be a superset of all known character sets and is therefore a perfect base
+for encoding things that might get used all over the world. To make
+things work correctly, you still have to know where you are and how to
+map byte values to Unicode characters and vice versa, but the
+important thing is, that this mapping is at least possible (you can
+map Kanji characters to Unicode, but you cannot map them to ASCII or
+iso-latin-1).
+
+<P>
+
+<H2><A NAME="SECTION00062000000000000000"></A><A NAME="sec:howtotext"></A><BR>
+Scanning text files
+</H2>
+
+<P>
+Scanning text files is the standard application for scanners like
+JFlex. Therefore it should also be the most convenient one. Most times 
+it is.
+
+<P>
+The following scenario works like a breeze:
+You work on a platform X, write your lexer specification there, can
+use any obscure Unicode character in it as you like, and compile the
+program. Your users work on any platform Y (possibly but not 
+necessarily something different from X), they write their input files
+on Y and they run your program on Y. No problems.
+
+<P>
+Java does this as follows:
+If you want to read anything in Java that is supposed to contain text, 
+you use a <TT>FileReader</TT> or some <TT>InputStream</TT> together with
+an <TT>InputStreamReader</TT>. <TT>InputStreams</TT> return the raw bytes, the 
+<TT>InputStreamReader</TT> converts the bytes into Unicode characters with
+the platform's default encoding. If a text file is produced on the
+same platform, the platform's default encoding should do the mapping
+correctly. Since JFlex also uses readers and Unicode internally, this
+mechanism also works for the scanner specifications. If you write an
+<TT>A</TT> in your text editor and the editor uses the platform's encoding (say <TT>A</TT> is 65), 
+then Java translates this into the logical Unicode <TT>A</TT> internally. 
+If a user writes an <TT>A</TT> on a completely different platform (say <TT>A</TT> is 237 there),
+then Java also translates this into the logical Unicode <TT>A</TT> internally. Scanning
+is performed after that translation and both match.
+
+<P>
+Note that because of this mapping from bytes to characters, you should always 
+use the <TT>%unicode</TT> switch in you lexer specification if you want to scan
+text files. <TT>%8bit</TT> may not be enough, even if
+you know that your platform only uses one byte per character. The encoding
+Cp1252 used on many Windows machines for instance knows 256 characters, but
+the character &#180; with Cp1252 code <code>\x92</code> has the Unicode value <code>\u2019</code>, which
+is larger than 255 and which would make your scanner throw an 
+<TT>ArrayIndexOutOfBoundsException</TT> if it is encountered.
+
+<P>
+So for the usual case you don't have to do anything but use the
+<TT>%unicode</TT> switch in your lexer specification.
+
+<P>
+Things may break when you produce a text file on platform X and
+consume it on a different platform Y. Let's say you have a file
+written on a Windows PC using the encoding Cp1252. Then you move
+this file to a Linux PC with encoding ISO 8859-1 and there you want
+to run your scanner on it. Java now thinks the file is encoded
+in ISO 8859-1 (the platform's default encoding) while it really is 
+encoded in Cp1252. For most characters
+Cp1252 and ISO 8859-1 are the same, but for the byte values <code>\x80</code>
+to <code>\x9f</code> they disagree: ISO 8859-1 is undefined there. You can fix
+the problem by telling Java explicitly which encoding to use. When
+constructing the <TT>InputStreamReader</TT>, you can give the encoding
+as argument. The line
+<DIV ALIGN="CENTER">
+<TT>Reader r = new InputStreamReader(input, "Cp1252"); </TT>
+
+</DIV>
+will do the trick.
+
+<P>
+Of course the encoding to use can also come from the data itself:
+for instance, when you scan a HTML page, it may have embedded 
+information about its character encoding in the headers.
+
+<P>
+More information about encodings, which ones are supported, how
+they are called, and how to set them may be found in the
+official Java documentation in the chapter about 
+internationalisation. 
+The link 
+<A NAME="tex2html6"
+  HREF="http://java.sun.com/j2se/1.3/docs/guide/intl/"><TT>http://java.sun.com/j2se/1.3/docs/guide/intl/</TT></A>
+leads to an online version of this for Sun's JDK 1.3.
+
+<P>
+
+<H2><A NAME="SECTION00063000000000000000"></A><A NAME="sec:howtobinary"></A><BR>
+Scanning binaries
+</H2>
+
+<P>
+Scanning binaries is both easier and more difficult
+than scanning text files. It's easier because you want
+the raw bytes and not their meaning, i.e.&nbsp;you don't want 
+any translation.
+It's more difficult because it's not so easy to get
+``no translation'' when you use Java readers. 
+
+<P>
+The problem (for binaries) is that JFlex scanners are
+designed to work on text. Therefore the interface is
+the <TT>Reader</TT> class (there is a constructor
+for <TT>InputStream</TT> instances, but it's just there
+for convenience and wraps an <TT>InputStreamReader</TT>
+around it to get characters, not bytes). 
+You can still get a binary scanner when you write 
+your own custom <TT>InputStreamReader</TT> class that
+does explicitly no translation, but just copies
+byte values to character codes instead. It sounds
+quite easy, and actually it is no big deal, but there 
+are a few little pitfalls on the way. In the scanner
+specification you can only enter positive character
+codes (for bytes that is <code>\x00</code>
+to <code>\xFF</code>). Java's <TT>byte</TT> type on the other hand
+is a signed 8 bit integer (-128 to 127), so you have to convert 
+them properly in your custom <TT>Reader</TT>. Also, you should
+take care when you write your lexer spec: if you
+use text in there, it gets interpreted by an encoding
+first, and what scanner you get as result might depend
+on which platform you run JFlex on when you generate
+the scanner (this is what you want for text, but for binaries it
+gets in the way). If you are not sure, or if the development
+platform might change, it's probably best to use character 
+code escapes in all places, since they don't change their
+meaning.
+
+<P>
+To illustrate these points, the example in <TT>examples/binary</TT> 
+contains a very small binary scanner that tries to
+detect if a file is a Java <TT>class</TT> file. For that
+purpose it looks if the file begins with the magic number <code>\xCAFEBABE</code>.
+
+<P>
+
+<H1><A NAME="SECTION00070000000000000000"></A><A NAME="performance"></A><BR>
+A few words on performance
+</H1>
+This section gives some empirical results about the speed of JFlex generated
+scanners in comparison to those generated by JLex,
+compares a JFlex scanner with a <A HREF="#PerformanceHandwritten">handwritten</A> 
+one, and presents some <A HREF="#PerformanceTips">tips</A> on how to make
+your specification produce a faster scanner.
+
+<P>
+
+<H2><A NAME="SECTION00071000000000000000"></A><A NAME="PerformanceJLex"></A><BR>
+Comparison of JLex and JFlex
+</H2>
+Scanners generated by the tool JLex are quite fast. It was however
+possible to further improve the performance of generated scanners
+using JFlex. The following table shows the results that were produced
+by the scanner specification of a small toy programming language (the
+example from the JLex web site). The scanner was generated using JLex
+1.2.6 and JFlex version 1.3.5 with all three different JFlex code
+generation methods. Then it was run on a W98 system using Sun's JDK
+1.3 with different sample inputs of that toy programming language. All
+test runs were made under the same conditions on an otherwise idle
+machine.
+
+<P>
+The values presented in the table denote the time from the first call
+to the scanning method to returning the EOF value and the speedup in
+percent. The tests were run both in the mixed (HotSpot) JVM mode and
+the pure interpreted mode.  The mixed mode JVM brings
+about a factor of 10 performance improvement, the difference between
+JLex and JFlex only decreases slightly.
+
+<P>
+<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">KB</TD>
+<TD ALIGN="CENTER">JVM</TD>
+<TD ALIGN="RIGHT">JLex</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%switch</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%table</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%pack</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">325 ms</TD>
+<TD ALIGN="RIGHT">261 ms</TD>
+<TD ALIGN="RIGHT">24.5 %</TD>
+<TD ALIGN="RIGHT">261 ms</TD>
+<TD ALIGN="RIGHT">24.5 %</TD>
+<TD ALIGN="RIGHT">261 ms</TD>
+<TD ALIGN="RIGHT">24.5 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">127 ms</TD>
+<TD ALIGN="RIGHT">98 ms</TD>
+<TD ALIGN="RIGHT">29.6 %</TD>
+<TD ALIGN="RIGHT">94 ms</TD>
+<TD ALIGN="RIGHT">35.1 %</TD>
+<TD ALIGN="RIGHT">96 ms</TD>
+<TD ALIGN="RIGHT">32.3 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">66 ms</TD>
+<TD ALIGN="RIGHT">50 ms</TD>
+<TD ALIGN="RIGHT">32.0 %</TD>
+<TD ALIGN="RIGHT">50 ms</TD>
+<TD ALIGN="RIGHT">32.0 %</TD>
+<TD ALIGN="RIGHT">48 ms</TD>
+<TD ALIGN="RIGHT">37.5 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">4009 ms</TD>
+<TD ALIGN="RIGHT">3025 ms</TD>
+<TD ALIGN="RIGHT">32.5 %</TD>
+<TD ALIGN="RIGHT">3258 ms</TD>
+<TD ALIGN="RIGHT">23.1 %</TD>
+<TD ALIGN="RIGHT">3231 ms</TD>
+<TD ALIGN="RIGHT">24.1 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">1641 ms</TD>
+<TD ALIGN="RIGHT">1155 ms</TD>
+<TD ALIGN="RIGHT">42.1 %</TD>
+<TD ALIGN="RIGHT">1245 ms</TD>
+<TD ALIGN="RIGHT">31.8 %</TD>
+<TD ALIGN="RIGHT">1234 ms</TD>
+<TD ALIGN="RIGHT">33.0 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">817 ms</TD>
+<TD ALIGN="RIGHT">573 ms</TD>
+<TD ALIGN="RIGHT">42.6 %</TD>
+<TD ALIGN="RIGHT">617 ms</TD>
+<TD ALIGN="RIGHT">32.4 %</TD>
+<TD ALIGN="RIGHT">613 ms</TD>
+<TD ALIGN="RIGHT">33.3 %</TD>
+</TR>
+</TABLE>
+
+<P><BR>
+
+<P>
+Since the scanning time of the lexical analyser examined in the table
+above includes lexical actions that often need to create new object instances,
+another table shows the execution time for the same specification with empty
+lexical actions to compare the pure scanning engines.
+
+<P>
+<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">KB</TD>
+<TD ALIGN="CENTER">JVM</TD>
+<TD ALIGN="RIGHT">JLex</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%switch</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%table</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%pack</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">204 ms</TD>
+<TD ALIGN="RIGHT">140 ms</TD>
+<TD ALIGN="RIGHT">45.7 %</TD>
+<TD ALIGN="RIGHT">138 ms</TD>
+<TD ALIGN="RIGHT">47.8 %</TD>
+<TD ALIGN="RIGHT">140 ms</TD>
+<TD ALIGN="RIGHT">45.7 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">83 ms</TD>
+<TD ALIGN="RIGHT">55 ms</TD>
+<TD ALIGN="RIGHT">50.9 %</TD>
+<TD ALIGN="RIGHT">52 ms</TD>
+<TD ALIGN="RIGHT">59.6 %</TD>
+<TD ALIGN="RIGHT">52 ms</TD>
+<TD ALIGN="RIGHT">59.6 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">41 ms</TD>
+<TD ALIGN="RIGHT">28 ms</TD>
+<TD ALIGN="RIGHT">46.4 %</TD>
+<TD ALIGN="RIGHT">26 ms</TD>
+<TD ALIGN="RIGHT">57.7 %</TD>
+<TD ALIGN="RIGHT">26 ms</TD>
+<TD ALIGN="RIGHT">57.7 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">2983 ms</TD>
+<TD ALIGN="RIGHT">2036 ms</TD>
+<TD ALIGN="RIGHT">46.5 %</TD>
+<TD ALIGN="RIGHT">2230 ms</TD>
+<TD ALIGN="RIGHT">33.8 %</TD>
+<TD ALIGN="RIGHT">2232 ms</TD>
+<TD ALIGN="RIGHT">33.6 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">1260 ms</TD>
+<TD ALIGN="RIGHT">793 ms</TD>
+<TD ALIGN="RIGHT">58.9 %</TD>
+<TD ALIGN="RIGHT">865 ms</TD>
+<TD ALIGN="RIGHT">45.7 %</TD>
+<TD ALIGN="RIGHT">867 ms</TD>
+<TD ALIGN="RIGHT">45.3 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">628 ms</TD>
+<TD ALIGN="RIGHT">395 ms</TD>
+<TD ALIGN="RIGHT">59.0 %</TD>
+<TD ALIGN="RIGHT">432 ms</TD>
+<TD ALIGN="RIGHT">45.4 %</TD>
+<TD ALIGN="RIGHT">432 ms</TD>
+<TD ALIGN="RIGHT">45.4 %</TD>
+</TR>
+</TABLE>
+
+<P><BR>
+
+<P>
+Execution time of single instructions depends on the platform and
+the implementation of the Java Virtual Machine the program is executed
+on. Therefore the tables above cannot be used as a reference to which
+code generation method of JFlex is the right one to choose in general.
+The following table was produced by the same lexical specification and
+the same input on a Linux system also using Sun's JDK 1.3.
+
+<P>
+With actions:
+
+<P>
+<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">KB</TD>
+<TD ALIGN="CENTER">JVM</TD>
+<TD ALIGN="RIGHT">JLex</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%switch</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%table</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%pack</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">246 ms</TD>
+<TD ALIGN="RIGHT">203 ms</TD>
+<TD ALIGN="RIGHT">21.2 %</TD>
+<TD ALIGN="RIGHT">193 ms</TD>
+<TD ALIGN="RIGHT">27.5 %</TD>
+<TD ALIGN="RIGHT">190 ms</TD>
+<TD ALIGN="RIGHT">29.5 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">99 ms</TD>
+<TD ALIGN="RIGHT">76 ms</TD>
+<TD ALIGN="RIGHT">30.3 %</TD>
+<TD ALIGN="RIGHT">69 ms</TD>
+<TD ALIGN="RIGHT">43.5 %</TD>
+<TD ALIGN="RIGHT">70 ms</TD>
+<TD ALIGN="RIGHT">41.4 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">48 ms</TD>
+<TD ALIGN="RIGHT">36 ms</TD>
+<TD ALIGN="RIGHT">33.3 %</TD>
+<TD ALIGN="RIGHT">34 ms</TD>
+<TD ALIGN="RIGHT">41.2 %</TD>
+<TD ALIGN="RIGHT">35 ms</TD>
+<TD ALIGN="RIGHT">37.1 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">3251 ms</TD>
+<TD ALIGN="RIGHT">2247 ms</TD>
+<TD ALIGN="RIGHT">44.7 %</TD>
+<TD ALIGN="RIGHT">2430 ms</TD>
+<TD ALIGN="RIGHT">33.8 %</TD>
+<TD ALIGN="RIGHT">2444 ms</TD>
+<TD ALIGN="RIGHT">33.0 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">1320 ms</TD>
+<TD ALIGN="RIGHT">848 ms</TD>
+<TD ALIGN="RIGHT">55.7 %</TD>
+<TD ALIGN="RIGHT">958 ms</TD>
+<TD ALIGN="RIGHT">37.8 %</TD>
+<TD ALIGN="RIGHT">920 ms</TD>
+<TD ALIGN="RIGHT">43.5 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">658 ms</TD>
+<TD ALIGN="RIGHT">423 ms</TD>
+<TD ALIGN="RIGHT">55.6 %</TD>
+<TD ALIGN="RIGHT">456 ms</TD>
+<TD ALIGN="RIGHT">44.3 %</TD>
+<TD ALIGN="RIGHT">452 ms</TD>
+<TD ALIGN="RIGHT">45.6 %</TD>
+</TR>
+</TABLE>
+
+<P><BR>
+
+<P>
+Without actions:
+
+<P>
+<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">KB</TD>
+<TD ALIGN="CENTER">JVM</TD>
+<TD ALIGN="RIGHT">JLex</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%switch</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%table</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+<TD ALIGN="RIGHT"><FONT SIZE="-1"><TT>%pack</TT></FONT></TD>
+<TD ALIGN="RIGHT">speedup</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">136 ms</TD>
+<TD ALIGN="RIGHT">78 ms</TD>
+<TD ALIGN="RIGHT">74.4 %</TD>
+<TD ALIGN="RIGHT">76 ms</TD>
+<TD ALIGN="RIGHT">78.9 %</TD>
+<TD ALIGN="RIGHT">77 ms</TD>
+<TD ALIGN="RIGHT">76.6 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">59 ms</TD>
+<TD ALIGN="RIGHT">31 ms</TD>
+<TD ALIGN="RIGHT">90.3 %</TD>
+<TD ALIGN="RIGHT">48 ms</TD>
+<TD ALIGN="RIGHT">22.9 %</TD>
+<TD ALIGN="RIGHT">32 ms</TD>
+<TD ALIGN="RIGHT">84.4 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">28 ms</TD>
+<TD ALIGN="RIGHT">15 ms</TD>
+<TD ALIGN="RIGHT">86.7 %</TD>
+<TD ALIGN="RIGHT">15 ms</TD>
+<TD ALIGN="RIGHT">86.7 %</TD>
+<TD ALIGN="RIGHT">15 ms</TD>
+<TD ALIGN="RIGHT">86.7 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">1992 ms</TD>
+<TD ALIGN="RIGHT">1047 ms</TD>
+<TD ALIGN="RIGHT">90.3 %</TD>
+<TD ALIGN="RIGHT">1246 ms</TD>
+<TD ALIGN="RIGHT">59.9 %</TD>
+<TD ALIGN="RIGHT">1215 ms</TD>
+<TD ALIGN="RIGHT">64.0 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">187</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">859 ms</TD>
+<TD ALIGN="RIGHT">408 ms</TD>
+<TD ALIGN="RIGHT">110.5 %</TD>
+<TD ALIGN="RIGHT">479 ms</TD>
+<TD ALIGN="RIGHT">79.3 %</TD>
+<TD ALIGN="RIGHT">487 ms</TD>
+<TD ALIGN="RIGHT">76.4 %</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">93</TD>
+<TD ALIGN="CENTER">interpr.</TD>
+<TD ALIGN="RIGHT">435 ms</TD>
+<TD ALIGN="RIGHT">200 ms</TD>
+<TD ALIGN="RIGHT">117.5 %</TD>
+<TD ALIGN="RIGHT">237 ms</TD>
+<TD ALIGN="RIGHT">83.5 %</TD>
+<TD ALIGN="RIGHT">242 ms</TD>
+<TD ALIGN="RIGHT">79.8 %</TD>
+</TR>
+</TABLE>
+
+<P><BR>
+
+<P>
+Although all JFlex scanners were faster than those generated by JLex, 
+slight differences between JFlex code generation methods show up when compared
+to the run on the W98 system.
+<A NAME="PerformanceHandwritten"></A>
+<P>
+The following table compares a hand-written scanner for the Java language
+obtained from the web site of CUP with the JFlex generated scanner for Java
+that comes with JFlex in the <TT>examples</TT> directory. They were tested
+on different <TT>.java</TT> files on a Linux machine with Sun's JDK 1.3.
+
+<P>
+<TABLE CELLPADDING=3 BORDER="1" WIDTH="100%">
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">lines</TD>
+<TD ALIGN="RIGHT">KB</TD>
+<TD ALIGN="CENTER">JVM</TD>
+<TD ALIGN="RIGHT">hand-written scanner</TD>
+<TD ALIGN="CENTER" COLSPAN=2>JFlex generated scanner</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">19050</TD>
+<TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">824 ms</TD>
+<TD ALIGN="RIGHT">248 ms</TD>
+<TD ALIGN="RIGHT">235 % faster</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">6350</TD>
+<TD ALIGN="RIGHT">165</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">272 ms</TD>
+<TD ALIGN="RIGHT">84 ms</TD>
+<TD ALIGN="RIGHT">232 % faster</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">1270</TD>
+<TD ALIGN="RIGHT">33</TD>
+<TD ALIGN="CENTER">hotspot</TD>
+<TD ALIGN="RIGHT">53 ms</TD>
+<TD ALIGN="RIGHT">18 ms</TD>
+<TD ALIGN="RIGHT">194 % faster</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">19050</TD>
+<TD ALIGN="RIGHT">496</TD>
+<TD ALIGN="CENTER">interpreted</TD>
+<TD ALIGN="RIGHT">5.83 s</TD>
+<TD ALIGN="RIGHT">3.85 s</TD>
+<TD ALIGN="RIGHT">51 % faster</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">6350</TD>
+<TD ALIGN="RIGHT">165</TD>
+<TD ALIGN="CENTER">interpreted</TD>
+<TD ALIGN="RIGHT">1.95 s</TD>
+<TD ALIGN="RIGHT">1.29 s</TD>
+<TD ALIGN="RIGHT">51 % faster</TD>
+</TR>
+<TR><TD ALIGN="LEFT">&nbsp;</TD><TD ALIGN="RIGHT">1270</TD>
+<TD ALIGN="RIGHT">33</TD>
+<TD ALIGN="CENTER">interpreted</TD>
+<TD ALIGN="RIGHT">0.38 s</TD>
+<TD ALIGN="RIGHT">0.25 s</TD>
+<TD ALIGN="RIGHT">52 % faster</TD>
+</TR>
+</TABLE>
+
+<P><BR>
+
+<P>
+Although JDK 1.3 seems to speed up the hand-written scanner if compared
+to JDK 1.1 or 1.2 more than the generated one, the generated scanner is
+still up to 3.3 times as fast as the hand-written one. One example of 
+a hand-written scanner that is
+considerably slower than the equivalent generated one is surely no
+proof for all generated scanners being faster than hand-written. It is
+clearly impossible to prove something like that, since you could
+always write the generated scanner by hand. From a software
+engineering point of view however, there is no excuse for writing a
+scanner by hand since this task takes more time, is more difficult and
+therefore more error prone than writing a compact, readable and easy
+to change lexical specification. (I'd like to add, that I do <EM>not</EM>
+think, that the hand-written scanner from the CUP web site used here in
+the test is stupid or badly written or anything like that. I actually
+think, Scott did a great job with it)
+
+<P>
+
+<H2><A NAME="SECTION00072000000000000000"></A><A NAME="PerformanceTips"></A><BR>
+How to write a faster specification
+</H2>
+Although JFlex generated scanners show good performance without
+special optimisations, there are some heuristics that can make a
+lexical specification produce an even faster scanner. Those are
+(roughly in order of performance gain):
+
+<P>
+
+<UL>
+<LI>Avoid rules that require backtracking
+
+<P>
+From the C/C++ flex [<A
+ HREF="manual.html#flex">11</A>] man page: <EM>``Getting rid
+of backtracking is messy and often may be an enormous amount of work for
+a complicated scanner.''</EM> Backtracking is introduced by the longest match
+rule and occurs for instance on this set of expressions:
+
+<P>
+<TT>  "averylongkeyword"</TT>
+<BR><TT>  .</TT>
+
+<P>
+With input <TT>"averylongjoke"</TT> the scanner has to read all characters
+up to <TT>'j' </TT>to decide that rule <TT>.</TT> should be matched. All
+characters of <TT>"verylong"</TT> have to be read again for the next
+matching process. Backtracking can be avoided in general by adding
+error rules that match those error conditions 
+
+<P>
+<code> "av"|"ave"|"avery"|"averyl"|..</code>
+
+<P>
+While this is impractical in most scanners, there is still the
+possibility to add a ``catch all'' rule for a lengthy list of keywords
+<PRE>
+"keyword1"  { return symbol(KEYWORD1); } 
+.. 
+"keywordn"  { return symbol(KEYWORDn); }
+[a-z]+      { error("not a keyword"); }
+</PRE>
+Most programming language scanners already have a rule like this for
+some kind of variable length identifiers.
+
+<P>
+</LI>
+<LI>Avoid line and column counting
+
+<P>
+It costs multiple additional comparisons per input character and the
+  matched text has to be re-scanned for counting. In most scanners it
+  is possible to do the line counting in the specification by
+  incrementing <TT>yyline</TT> each time a line terminator has been
+  matched.  Column counting could also be included in actions. This
+  will be faster, but can in some cases become quite messy.
+
+<P>
+</LI>
+<LI>Avoid look-ahead expressions and the end of line operator '$'
+
+<P>
+In the best case, the trailing context will first have to be read and 
+  then (because it is not to be consumed) re-read again. The cases of 
+  fixed-length look-ahead and fixed-length base expressions are handled efficiently
+  by matching the concatenation and then pushing back the required amount
+  of characters. This extends to the case of a disjunction of fixed-length
+  look-ahead expressions such as <code>r1 / \r|\n|\r\n</code>. All other cases
+  <code>r1 / r2</code> are handled by first scanning the concatenation of 
+  <code>r1</code> and <code>r2</code>, and then finding the correct end of <code>r1</code>. 
+  The end of <code>r1</code> is found by scanning forwards in the match again,
+  marking all possible <code>r1</code> terminations, and then scanning the reverse
+  of <code>r2</code> backwards from the end until a start of <code>r2</code> intersects
+  with an end of <code>r1</code>. This algorithm is linear in the size of the input
+  (not quadratic or worse as backtracking is), but about a factor of 2 slower 
+  than normal scanning. It also consumes memory proportional to the size
+  of the matched input for <code>r1 r2</code>. 
+
+<P>
+</LI>
+<LI>Avoid the beginning of line operator '<code>^</code>'
+
+<P>
+It costs multiple additional comparisons per match. In some
+  cases one extra look-ahead character is needed (when the last character read is
+  <code>\r</code> the scanner has to read one character ahead to check if
+  the next one is an <code>\n</code> or not).
+
+<P>
+</LI>
+<LI>Match as much text as possible in a rule.
+
+<P>
+One rule is matched in the innermost loop of the scanner.  After
+  each action some overhead for setting up the internal state of the
+   scanner is necessary.
+</LI>
+</UL>
+
+<P>
+Note that writing more rules in a specification does not make the generated
+scanner slower (except when you have to switch to another code generation
+method because of the larger size).
+
+<P>
+The two main rules of optimisation apply also for lexical specifications:
+
+<OL>
+<LI><B>don't do it</B>
+</LI>
+<LI><B>(for experts only) don't do it yet</B>
+</LI>
+</OL>
+
+<P>
+Some of the performance tips above contradict a readable and compact
+specification style. When in doubt or when requirements are not or not
+yet fixed: don't use them -- the specification can always be optimised
+in a later state of the development process.
+
+<P>
+
+<H1><A NAME="SECTION00080000000000000000">
+Porting Issues</A>
+</H1>
+
+<P>
+
+<H2><A NAME="SECTION00081000000000000000"></A><A NAME="Porting"></A><BR>
+Porting from JLex
+</H2>
+JFlex was designed to read old JLex specifications unchanged and to
+generate a scanner which behaves exactly the same as the one generated
+by JLex with the only difference of being faster.
+
+<P>
+This works as expected on all well formed JLex specifications.
+
+<P>
+Since the statement above is somewhat absolute, let's take a look at
+what ``well formed'' means here. A JLex specification is well formed, when
+it
+
+<UL>
+<LI>generates a working scanner with JLex
+
+<P>
+</LI>
+<LI>doesn't contain the unescaped characters <TT>!</TT> and <TT>~</TT>
+
+<P>
+They are operators in JFlex while JLex treats them as normal
+  input characters. You can easily port such a JLex specification
+  to JFlex by replacing every <TT>!</TT> with <code>\!</code> and every
+  <code>~</code> with <code>\~</code> in all regular expressions.
+
+<P>
+</LI>
+<LI>has only complete regular expressions surrounded by parentheses in
+  macro definitions
+
+<P>
+This may sound a bit harsh, but could otherwise be a major problem
+  - it can also help you find some disgusting bugs in your
+  specification that didn't show up in the first place. In JLex, a
+  right hand side of a macro is just a piece of text, that is copied
+  to the point where the macro is used. With this, some weird kind of
+  stuff like
+  <PRE>
+  macro1 = ("hello"
+  macro2 = {macro1})*
+</PRE>  
+  was possible (with <TT>macro2</TT> expanding to <code>("hello")*</code>).  This
+  is not allowed in JFlex and you will have to transform such
+  definitions. There are however some more subtle kinds of errors that
+  can be introduced by JLex macros. Let's consider a definition like
+  <code>macro = a|b</code>  and a usage like <code>{macro}*</code>.
+  This expands in JLex to <code>a|b*</code> and not to the probably intended
+  <code>(a|b)*</code>.
+
+<P>
+JFlex uses always the second form of expansion, since this is the natural
+  form of thinking about abbreviations for regular expressions.
+
+<P>
+Most specifications shouldn't suffer from this problem, because
+  macros often only contain (harmless) character classes like
+  <TT>alpha = [a-zA-Z]</TT> and more dangerous definitions like
+
+<P>
+<code> ident = {alpha}({alpha}|{digit})*</code>
+
+<P>
+are only used to write rules like
+
+<P>
+<code> {ident}       { .. action .. }</code>
+
+<P>
+and not more complex expressions like
+
+<P>
+<code> {ident}*      { .. action .. }</code>
+
+<P>
+where the kind of error presented above would show up.
+</LI>
+</UL>
+
+<P>
+
+<H2><A NAME="SECTION00082000000000000000"></A><A NAME="lexport"></A><BR>
+Porting from lex/flex
+</H2>
+This section tries to give an overview of activities and possible
+problems when porting a lexical specification from the C/C++ tools lex
+and flex [<A
+ HREF="manual.html#flex">11</A>] available on most Unix systems to JFlex.
+
+<P>
+Most of the C/C++ specific features are naturally not present in JFlex,
+but most ``clean'' lex/flex lexical specifications can be ported to 
+JFlex without very much work.
+
+<P>
+This section is by far not complete and is based mainly on a survey of
+the flex man page and very little personal experience.  If you do
+engage in any porting activity from lex/flex to JFlex and encounter
+problems, have better solutions for points presented here or have just
+some tips you would like to share, please do <A NAME="tex2html7"
+  HREF="mailto:lsf@jflex.de">contact me</A>. I will
+incorporate your experiences in this manual (with all due credit to you,
+of course).
+
+<P>
+
+<H3><A NAME="SECTION00082100000000000000">
+Basic structure</A>
+</H3>
+A lexical specification for flex has the following basic structure:
+<PRE>
+definitions
+%%
+rules
+%%
+user code
+</PRE>
+
+<P>
+The <TT>user code</TT> section usually contains some C code that is used
+in actions of the <TT>rules</TT> part of the specification. For JFlex most
+of this code will have to be included in the class code <code>%{..%}</code>
+directive in the <TT>options</TT> <TT>and declarations</TT> section (after 
+translating the C code to Java, of course). 
+
+<P>
+
+<H3><A NAME="SECTION00082200000000000000">
+Macros and Regular Expression Syntax</A>
+</H3>
+The <TT>definitions</TT> section of a flex specification is quite similar
+to the <TT>options and declarations</TT> part of JFlex specs.
+
+<P>
+Macro definitions in flex have the form:
+<PRE>
+&lt;identifier&gt;  &lt;expression&gt;
+</PRE>
+To port them to JFlex macros, just insert a <TT>=</TT> between <TT>&lt;identifier&gt;</TT>
+and <TT>&lt;expression&gt;</TT>.
+
+<P>
+The syntax and semantics of regular expressions in flex are pretty much the
+same as in JFlex. A little attention is needed for some escape sequences 
+present in flex (such as <code>\a</code>) that are not supported in JFlex. These
+escape sequences should be transformed into their octal or hexadecimal 
+equivalent. 
+
+<P>
+Another point are predefined character classes. Flex offers the ones directly
+supported by C, JFlex offers the ones supported by Java. These classes will
+sometimes have to be listed manually (if there is need for this feature, it
+may be implemented in a future JFlex version).
+
+<P>
+
+<H3><A NAME="SECTION00082300000000000000">
+Lexical Rules</A>
+</H3>
+Since flex is mostly Unix based, the '<code>^</code>' (beginning of line) and
+'<code>$</code>' (end of line) operators, consider the <code>\n</code> character as only line terminator. This should usually cause not much problems, but you
+should be prepared for occurrences of <code>\r</code> or <code>\r\n</code> or one of
+the characters <code>\u2028</code>, <code>\u2029</code>, <code>\u000B</code>, <code>\u000C</code>, 
+or <code>\u0085</code>. They are considered to be line terminators in Unicode and 
+therefore may not be consumed when 
+<code>^</code> or <code>$</code> is present in a rule.
+<P>
+
+<H1><A NAME="SECTION00090000000000000000"></A><A NAME="WorkingTog"></A><BR>
+Working together
+</H1>
+
+<P>
+
+<H2><A NAME="SECTION00091000000000000000"></A><A NAME="CUPWork"></A><BR>
+JFlex and CUP
+</H2>
+One of the main design goals of JFlex was to make interfacing with the free
+Java parser generator CUP [<A
+ HREF="manual.html#CUP">8</A>] as easy as possibly. 
+This has been done by giving
+the <TT><A HREF="#CupMode">%cup</A></TT> directive a special meaning. An
+interface however always has two sides. This section concentrates on the
+CUP side of the story.
+
+<P>
+
+<H3><A NAME="SECTION00091100000000000000">
+CUP version 0.10j and above</A>
+</H3>
+Since CUP version 0.10j, this has been simplified greatly by the new 
+CUP scanner interface <TT>java_cup.runtime.Scanner</TT>. JFlex lexers now implement
+this interface automatically when then <TT><A HREF="#CupMode">%cup</A></TT>
+switch is used. There are no special <TT>parser code</TT>, <TT>init
+  code</TT> or <TT>scan with</TT> options any more that you have to provide
+in your CUP parser specification. You can just concentrate on your grammar.
+
+<P>
+If your generated lexer has the class name <TT>Scanner</TT>, the parser
+is started from the a main program like this:
+
+<P>
+<PRE>
+...
+  try {
+    parser p = new parser(new Scanner(new FileReader(fileName)));
+    Object result = p.parse().value;
+  }
+  catch (Exception e) {
+...
+</PRE>
+
+<P>
+
+<H3><A NAME="SECTION00091200000000000000">
+Custom symbol interface</A>
+</H3>
+If you have used the <TT>-symbol</TT> command line switch of CUP to change
+the name of the generated symbol interface, you have to tell JFlex about
+this change of interface so that correct end-of-file code is generated. 
+You can do so either by using an <code>%eofval{</code> directive or by using
+and <TT>&#171;EOF&#187;</TT> rule. 
+
+<P>
+If your new symbol interface is called <TT>mysym</TT> for example, the
+corresponding code in the jflex specification would be either
+
+<P>
+
+<PRE>
+%eofval{
+  return mysym.EOF;
+%eofval}
+</PRE>
+
+<P>
+in the macro/directives section of the spec, or it would be
+
+<P>
+
+<PRE>
+  &lt;&lt;EOF&gt;&gt;  { return mysym.EOF; }
+</PRE>
+
+<P>
+in the rules section of your spec.
+
+<P>
+
+<H3><A NAME="SECTION00091300000000000000">
+Using existing JFlex/CUP specifications with CUP 0.10j</A>
+</H3>
+If you already have an existing specification and you would like to upgrade
+both JFlex and CUP to their newest version, you will probably have to adjust
+your specification.
+
+<P>
+The main difference between the <TT><A HREF="#CupMode">%cup</A></TT> switch in
+JFlex 1.2.1 and lower, and the current JFlex version is, that JFlex scanners
+now automatically implement the <TT>java_cup.runtime.Scanner</TT> interface.
+This means, that the scanning function now changes its name from <TT>yylex()</TT>
+to <TT>next_token()</TT>. 
+
+<P>
+The main difference from older CUP versions to 0.10j is, that CUP now
+has a default constructor that accepts a <TT>java_cup.runtime.Scanner</TT> 
+as argument and that uses this scanner as
+default (so no <TT>scan with</TT> code is necessary any more).
+
+<P>
+If you have an existing CUP specification, it will probably look somewhat like this:
+<PRE>
+parser code {:
+  Lexer lexer;
+
+  public parser (java.io.Reader input) {
+    lexer = new Lexer(input);
+  }
+:};
+
+scan with {: return lexer.yylex(); :};
+</PRE>
+
+<P>
+To upgrade to CUP 0.10j, you could change it to look like this:
+<PRE>
+parser code {:
+  public parser (java.io.Reader input) {
+    super(new Lexer(input));
+  }
+:};
+</PRE>
+
+<P>
+If you do not mind to change the method that is calling the parser,
+you could remove the constructor entirely (and if there is nothing else
+in it, the whole <TT>parser code</TT> section as well, of course). The calling
+main procedure would then construct the parser as shown in the section above.
+
+<P>
+The JFlex specification does not need to be changed.
+
+<P>
+
+<H3><A NAME="SECTION00091400000000000000">
+Using older versions of CUP</A>
+</H3>
+For people, who like or have to use older versions of CUP, the following section 
+explains ``the old way''. Please note, that the standard name of the scanning 
+function with the <TT><A HREF="#CupMode">%cup</A></TT> switch is not 
+<TT>yylex()</TT>, but <TT>next_token()</TT>.
+
+<P>
+If you have a scanner specification that begins like this:
+
+<P>
+<PRE>
+package PACKAGE;
+import java_cup.runtime.*;   /* this is convenience, but not necessary */
+ 
+%%
+ 
+%class Lexer
+%cup
+..
+</PRE>
+
+<P>
+then it matches a CUP specification starting  like
+
+<P>
+<PRE>
+package PACKAGE;
+
+parser code {:
+  Lexer lexer;
+
+  public parser (java.io.Reader input) {
+    lexer = new Lexer(input);
+  }
+:};
+
+scan with {: return lexer.next_token(); :};
+
+..
+</PRE>
+
+<P>
+This assumes that the generated parser will get the name <TT>parser</TT>.
+If it doesn't, you have to adjust the constructor name.
+
+<P>
+The parser can then be started in a main routine like this:
+
+<P>
+<PRE>
+..
+  try {
+    parser p = new parser(new FileReader(fileName));
+    Object result = p.parse().value; 
+  }
+  catch (Exception e) {
+..
+</PRE>
+
+<P>
+If you want the parser specification to be independent of the name of the generated
+scanner, you can instead write an interface <TT>Lexer</TT>
+
+<P>
+<PRE>
+public interface Lexer {
+  public java_cup.runtime.Symbol next_token() throws java.io.IOException;
+}
+</PRE>
+
+<P>
+change the parser code to:
+
+<P>
+<PRE>
+package PACKAGE;
+
+parser code {:
+  Lexer lexer;
+
+  public parser (Lexer lexer) {
+    this.lexer = lexer;
+  }
+:};
+
+scan with {: return lexer.next_token(); :};
+
+..
+</PRE>
+
+<P>
+tell JFlex about the lexer 
+interface using the <TT>%implements</TT>
+directive:
+
+<P>
+<PRE>
+..
+%class Scanner     /* not Lexer now since that is our interface! */
+%implements Lexer
+%cup
+..
+</PRE>
+
+<P>
+and finally change the main routine to look like
+
+<P>
+<PRE>
+...
+  try {
+    parser p = new parser(new Scanner(new FileReader(fileName)));
+    Object result = p.parse().value;
+  }
+  catch (Exception e) {
+...
+</PRE>
+
+<P>
+If you want to improve the error messages that CUP generated parsers
+produce, you can also override the methods <TT>report_error</TT> and <TT>report_fatal_error</TT>
+in the ``parser code'' section of the CUP specification. The new methods
+could for instance use <TT>yyline</TT> and <TT>yycolumn</TT> (stored in
+the <TT>left</TT> and <TT>right</TT> members of class <TT>java_cup.runtime.Symbol</TT>)
+to report error positions more conveniently for the user. The lexer and
+parser for the Java language in the <TT>examples/java</TT> directory of the
+JFlex distribution use this style of error reporting. These specifications
+also demonstrate the techniques above in action.
+
+<P>
+
+<H2><A NAME="SECTION00092000000000000000"></A><A NAME="YaccWork"></A><BR>
+JFlex and BYacc/J
+</H2>
+
+<P>
+JFlex has built-in support for the Java extension 
+<A NAME="tex2html8"
+  HREF="http://byaccj.sourceforge.net/">BYacc/J</A>
+[<A
+ HREF="manual.html#BYaccJ">9</A>] by Bob Jamison
+to the classical Berkeley Yacc parser generator.
+This section describes how to interface BYacc/J with JFlex. It
+builds on many helpful suggestions and comments from Larry Bell.
+
+<P>
+Since Yacc's architecture is a bit different from CUP's, the
+interface setup also works in a slightly different manner.
+BYacc/J expects a function <TT>int yylex()</TT> in the parser
+class that returns each next token. Semantic values are expected
+in a field <TT>yylval</TT> of type <TT>parserval</TT> where ``<TT>parser</TT>''
+is the name of the generated parser class.
+
+<P>
+For a small calculator example, one could use a set up like the 
+following on the JFlex side:
+
+<P>
+<PRE>
+%%
+
+%byaccj
+
+%{
+  /* store a reference to the parser object */
+  private parser yyparser;
+
+  /* constructor taking an additional parser object */
+  public Yylex(java.io.Reader r, parser yyparser) {
+    this(r);
+    this.yyparser = yyparser;
+  }
+%}
+
+NUM = [0-9]+ ("." [0-9]+)?
+NL  = \n | \r | \r\n
+
+%%
+
+/* operators */
+"+" | 
+..
+"(" | 
+")"    { return (int) yycharat(0); }
+
+/* newline */
+{NL}   { return parser.NL; }
+
+/* float */
+{NUM}  { yyparser.yylval = new parserval(Double.parseDouble(yytext()));
+         return parser.NUM; }
+</PRE>
+
+<P>
+The lexer expects a reference to the parser in its constructor.
+Since Yacc allows direct use of terminal characters like <TT>'+'</TT>
+in its specifications, we just return the character code for
+single char matches (e.g. the operators in the example). Symbolic
+token names are stored as <TT>public static int</TT> constants in
+the generated parser class. They are used as in the <TT>NL</TT> token
+above. Finally, for some tokens, a semantic value may have to be 
+communicated to the parser. The <TT>NUM</TT> rule demonstrates that
+bit.
+
+<P>
+A matching BYacc/J parser specification could look like this:
+<PRE>
+%{
+  import java.io.*;
+%}
+      
+%token NL          /* newline  */
+%token &lt;dval&gt; NUM  /* a number */
+
+%type &lt;dval&gt; exp
+
+%left '-' '+'
+..
+%right '^'         /* exponentiation */
+      
+%%
+
+..
+      
+exp:     NUM          { $$ = $1; }
+       | exp '+' exp  { $$ = $1 + $3; }
+       ..
+       | exp '^' exp  { $$ = Math.pow($1, $3); }
+       | '(' exp ')'  { $$ = $2; }
+       ;
+
+%%
+  /* a reference to the lexer object */
+  private Yylex lexer;
+
+  /* interface to the lexer */
+  private int yylex () {
+    int yyl_return = -1;
+    try {
+      yyl_return = lexer.yylex();
+    }
+    catch (IOException e) {
+      System.err.println("IO error :"+e);
+    }
+    return yyl_return;
+  }
+
+  /* error reporting */
+  public void yyerror (String error) {
+    System.err.println ("Error: " + error);
+  }
+
+  /* lexer is created in the constructor */
+  public parser(Reader r) {
+    lexer = new Yylex(r, this);
+  }
+
+  /* that's how you use the parser */
+  public static void main(String args[]) throws IOException {
+    parser yyparser = new parser(new FileReader(args[0]));
+    yyparser.yyparse();    
+  }
+</PRE>
+
+<P>
+Here, the customised part is mostly in the user code section:
+We create the lexer in the constructor of the parser and store
+a reference to it for later use in the parser's <TT>int yylex()</TT>
+method. This <TT>yylex</TT> in the parser only calls <TT>int yylex()</TT>
+of the generated lexer and passes the result on. If something goes
+wrong, it returns -1 to indicate an error.
+
+<P>
+Runnable versions of the specifications above 
+are located in the <TT>examples/byaccj</TT> directory of the JFlex 
+distribution.
+
+<P>
+
+<H1><A NAME="SECTION000100000000000000000"></A><A NAME="Bugs"></A><BR>
+Bugs and Deficiencies
+</H1>
+
+<P>
+
+<H2><A NAME="SECTION000101000000000000000">
+Deficiencies</A>
+</H2>
+Unicode matching is not fully conforming to the relevant current Unicode report. Instead, the Unicode support in JFlex is the one native to Java. That means, only 16 bit code points are supported and most Unicode character classes are not directly supported (although they can be custom-defined in macros). The Java 5 development version of JFlex contains better support for Unicode, as will the next major release.
+
+<P>
+
+<H2><A NAME="SECTION000102000000000000000">
+Bugs</A>
+</H2>
+As of January 31, 2009, no bugs have been reported for JFlex version 1.4.3. All 
+bugs reported for earlier versions have been fixed.
+
+<P>
+If you find new problems, please use the bugs section of the
+<A NAME="tex2html9"
+  HREF="http://www.jflex.de/">JFlex web site</A>
+to report them.
+
+<P>
+
+<H1><A NAME="SECTION000110000000000000000"></A><A NAME="Copyright"></A><BR>
+Copying and License
+</H1>
+JFlex is free software, published under the terms of the 
+<A NAME="tex2html10"
+  HREF="http://www.fsf.org/copyleft/gpl.html">GNU General Public License</A>.
+
+<P>
+There is absolutely NO WARRANTY for JFlex, its code and its documentation.
+
+<P>
+The code generated by JFlex inherits the copyright of the specification it
+was produced from. If it was your specification, you may use the generated 
+code without restriction.
+
+<P>
+See the file <A NAME="tex2html11"
+  HREF="COPYRIGHT"><TT>COPYRIGHT</TT></A>
+for more information.  
+
+<P>
+
+<H2><A NAME="SECTION000120000000000000000"></A><A NAME="References"></A><BR>
+Bibliography
+</H2><DL COMPACT><DD> 
+
+<P>
+<P></P><DT><A NAME="Aho">1</A>
+<DD>
+  A.&nbsp;Aho, R.&nbsp;Sethi, J.&nbsp;Ullman, <EM>Compilers: Principles, Techniques, and Tools</EM>, 1986
+
+<P>
+<P></P><DT><A NAME="Appel">2</A>
+<DD>
+  A.&nbsp;W.&nbsp;Appel, <EM>Modern Compiler Implementation in Java: basic techniques</EM>, 1997
+
+<P>
+<P></P><DT><A NAME="JLex">3</A>
+<DD>
+ E.&nbsp;Berk, <EM>JLex: A lexical analyser generator for Java</EM>,
+<BR> <A NAME="tex2html12"
+  HREF="http://www.cs.princeton.edu/~appel/modern/java/JLex/"><TT>http://www.cs.princeton.edu/~appel/modern/java/JLex/</TT></A>
+<P>
+<P></P><DT><A NAME="fast">4</A>
+<DD>
+  K.&nbsp;Brouwer, W.&nbsp;Gellerich,E.&nbsp;Ploedereder, 
+  <EM>Myths and Facts about the Efficient Implementation of Finite Automata and Lexical Analysis</EM>, 
+  in: Proceedings of the 7th International Conference on Compiler Construction (CC '98), 1998
+
+<P>
+<P></P><DT><A NAME="unicode_rep">5</A>
+<DD>
+  M.&nbsp;Davis, <EM>Unicode Regular Expression Guidelines</EM>, Unicode Technical Report #18, 2000
+<BR>  <A NAME="tex2html13"
+  HREF="http://www.unicode.org/unicode/reports/tr18/tr18-5.1.html"><TT>http://www.unicode.org/unicode/reports/tr18/tr18-5.1.html</TT></A>
+<P>
+<P></P><DT><A NAME="ParseTable">6</A>
+<DD>
+ P.&nbsp;Dencker, K.&nbsp;D&#252;rre, J.&nbsp;Henft, <EM>Optimization of Parser Tables for portable Compilers</EM>, 
+ in: ACM Transactions on Programming Languages and Systems 6(4), 1984
+
+<P>
+<P></P><DT><A NAME="LangSpec">7</A>
+<DD>
+  J.&nbsp;Gosling, B.&nbsp;Joy, G.&nbsp;Steele, <EM>The Java Language Specifcation</EM>, 1996,
+<BR>  <A NAME="tex2html14"
+  HREF="http://java.sun.com/docs/books/jls/"><TT>http://java.sun.com/docs/books/jls/</TT></A>
+<P>
+<P></P><DT><A NAME="CUP">8</A>
+<DD>
+  S.&nbsp;E.&nbsp;Hudson, <EM>CUP LALR Parser Generator for Java</EM>,
+<BR>  <A NAME="tex2html15"
+  HREF="http://www.cs.princeton.edu/~appel/modern/java/CUP/"><TT>http://www.cs.princeton.edu/~appel/modern/java/CUP/</TT></A>
+<P>
+<P></P><DT><A NAME="BYaccJ">9</A>
+<DD>
+  B.&nbsp;Jamison, <EM>BYacc/J</EM>,
+<BR>  <A NAME="tex2html16"
+  HREF="http://byaccj.sourceforge.net"><TT>http://byaccj.sourceforge.net/</TT></A>
+<P>
+<P></P><DT><A NAME="MachineSpec">10</A>
+<DD>
+ T.&nbsp;Lindholm, F.&nbsp;Yellin, <EM>The Java Virtual Machine Specification</EM>, 1996,
+<BR> <A NAME="tex2html17"
+  HREF="http://java.sun.com/docs/books/vmspec/"><TT>http://java.sun.com/docs/books/vmspec/</TT></A>
+<P>
+<P></P><DT><A NAME="flex">11</A>
+<DD>
+ V.&nbsp;Paxson, <EM>flex - The fast lexical analyzer generator</EM>, 1995
+
+<P>
+<P></P><DT><A NAME="SparseTable">12</A>
+<DD>
+  R.&nbsp;E. Tarjan, A.&nbsp;Yao, <EM>Storing a Sparse Table</EM>, in: Communications of the ACM 22(11), 1979 
+
+<P>
+<P></P><DT><A NAME="Maurer">13</A>
+<DD>
+  R.&nbsp;Wilhelm, D.&nbsp;Maurer, <EM>&#220;bersetzerbau</EM>, Berlin 1997<SUP>2</SUP>
+<tex2html_verbatim_mark>mathend000#
+
+<P>
+</DL>
+
+<P>
+<BR><HR><H4>Footnotes</H4>
+<DL>
+<DT><A NAME="foot33">... Java</A><A
+ HREF="manual.html#tex2html2"><SUP><IMG  ALIGN="BOTTOM" BORDER="1" ALT="[*]" SRC="footnote.png"></SUP></A></DT>
+<DD>Java is a trademark of 
+Sun Microsystems, Inc., and refers to Sun's Java programming language. 
+JFlex is not sponsored by or affiliated with Sun Microsystems, Inc.
+
+</DD>
+</DL><BR><HR>
+<ADDRESS>
+Sat 31 Jan 2009 23:43:28 EST, <a href="http://www.doclsf.de">Gerwin Klein</a>
+</ADDRESS>
+</BODY>
+</HTML>
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/Makefile
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/Makefile	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/Makefile	(revision 25584)
@@ -0,0 +1,22 @@
+
+JAVA  = java
+JAVAC = javac
+JFLEX = jflex
+
+# -------------------------------------------------
+
+all: run
+
+run: compile
+	$(JAVA) BinaryLexer *
+
+compile: BinaryLexer.class StraightStreamReader.class
+
+clean:
+	rm -f *~ *.class BinaryLexer.java
+
+%.class: %.java
+	$(JAVAC) $^
+
+BinaryLexer.java: binary.flex
+	$(JFLEX) $^
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/README	(revision 25584)
@@ -0,0 +1,18 @@
+This directory contains a small example of a scanner for binary files.
+
+The example tries to detect if an input file is a java class file by
+checking if the first 4 bytes contain the magic number 0xCAFEBABE.
+It uses a custom Reader class that copies bytes to characters one to
+one. The characters the scanner gets to read are the bytes from the
+input stream without any conversion. Many thanks to Stephen Ostermiller
+for providing the custom Reader class, the original version of that
+class is available from http://www.smo.f2s.com/utils/
+
+See the JFlex manual for details on how to scan binaries and how
+this is different from scanning text files.
+
+Files:
+binary.flex                 the scanner spec
+StraightStreamReader.java   the custom reader class (by Stephen Ostermiller)
+Makefile                    rules for make to compile and run the example
+README                      this file
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/StraightStreamReader.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/StraightStreamReader.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/StraightStreamReader.java	(revision 25584)
@@ -0,0 +1,287 @@
+/*
+ * An InputStreamReader that does no character encoding translations.
+ * Copyright (C) 2001 Stephen Ostermiller <utils@Ostermiller.com>
+ *
+ * Changes: (2001 by Gerwin Klein <lsf@jflex.de>)
+ *          - commented out package declaration for the example
+ *          - original version at http://www.smo.f2s.com/utils/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * See COPYING.TXT for details.
+ */
+ 
+// package com.Ostermiller.util;
+
+import java.io.*;
+
+/**
+ * A StraightStreamReader is a bridge from byte streams to character streams: It reads bytes
+ * and translates them into characters without using a character encoding.  The characters
+ * that a StraightStreamReader returns may not be valid unicode characters but they are
+ * guaranteed to be in the 0x00 to 0xFF range.
+ * <P>
+ * Most of the time you want to do character encoding translation when translating bytes to
+ * characters.  If you are planning on displaying the text, you should always do this and should
+ * use an InputStreamReader for the purpose.  Sometimes it is useful to treat characters as bytes
+ * with some extra bits.  In these cases you would want to use a StraightStreamReader.
+ * <P>
+ * For top efficiency, consider wrapping an StraightStreamReader within a BufferedReader. For example:<br>
+ * <code>BufferedReader in = new BufferedReader(new StraightStreamReader(System.in));</code>
+ */
+public class StraightStreamReader extends Reader{
+
+    /**
+     * The input stream from which all methods in this class read.
+     */
+    private InputStream in;
+
+    /**
+     * A byte array to be used for calls to the InputStream.  This
+     * is cached as a class variable to avoid object creation and
+     * deletion each time a read is called.  This buffer may be
+     * null and may not be large enough.  Make sure to check it
+     * before using it.
+     */
+    private byte[] buffer;
+
+    /**
+     * Create a StraightStreamReader from an InputStream
+     *
+     * @param in InputStream to wrap a Reader around.
+	 */
+	public StraightStreamReader(InputStream in) {
+		this.in = in;
+	}
+
+    /**
+     * Close the stream.
+     *
+     * @throws IOException If an I/O error occurs
+     */
+	public void close() throws IOException {
+		in.close();
+	}
+
+    /**
+     * Mark the present position in the stream. Subsequent calls to reset() 
+	 * will attempt to reposition the stream to this point. Not all 
+	 * character-input streams support the mark() operation.
+     *
+     * @param readAheadLimit Limit on the number of characters that may be read 
+	 *    while still preserving the mark. After reading this many characters, 
+	 *    attempting to reset the stream may fail.
+     * @throws IOException If the stream does not support mark(), or if some other I/O error occurs
+     */
+    public void mark(int readAheadLimit) throws IOException {
+    	in.mark(readAheadLimit);
+    }
+
+    /**
+     * Tell whether this stream supports the mark() operation.
+     *
+	 * @return true if and only if this stream supports the mark operation.
+     */
+  	public boolean markSupported(){
+  		return in.markSupported();
+  	} 
+
+    /**
+	 * Read a single character. This method will block until a character is available, an 
+	 * I/O error occurs, or the end of the stream is reached.
+     * 
+	 * @return The character read, as an integer in the range 0 to 256 (0x00-0xff), or -1 if 
+	 *    the end of the stream has been reached
+	 * @throws IOException If an I/O error occurs
+     */
+  	public int read() throws IOException { 
+        return in.read();
+  	}
+
+    /**
+	 * Read characters into an array. This method will block until some input is available,
+	 * an I/O error occurs, or the end of the stream is reached.
+     *
+	 * @param cbuf Destination buffer
+     * @return The number of bytes read, or -1 if the end of the stream has been reached
+	 * @throws IOException If an I/O error occurs
+     */
+  	public int read(char[] cbuf) throws IOException {
+  		return read(cbuf, 0, cbuf.length);
+  	}
+    
+    /**
+	 * Read characters into an array. This method will block until some input is available,
+	 * an I/O error occurs, or the end of the stream is reached.
+     *
+	 * @param cbuf Destination buffer
+	 * @param off Offset at which to start storing characters
+	 * @param len Maximum number of characters to read
+	 * @return The number of bytes read, or -1 if the end of the stream has been reached
+	 * @throws IOException If an I/O error occurs
+     */
+  	public int read(char[] cbuf, int off, int len) throws IOException {
+        // ensure the capacity of the buffer that we will be using
+        // to read from the input stream
+		if (buffer == null || buffer.length < len){
+			buffer = new byte[len];
+        }
+        // read from the input stream and copy it to the character array
+        int length = in.read(buffer, 0, len);
+        for (int i=0; i<length; i++){
+            cbuf[off+i] = (char)(0xFF & buffer[i]);
+		}
+		return length;
+   	}
+
+  	/**
+	 * Tell whether this stream is ready to be read.
+     *
+	 * @return True if the next read() is guaranteed not to block for input, false otherwise.
+     *    Note that returning false does not guarantee that the next read will block.
+	 * @throws IOException If an I/O error occurs
+     */
+  	public boolean ready() throws IOException {
+  		return (in.available() > 0);
+  	}
+
+  	/**
+	 * Reset the stream. If the stream has been marked, then attempt to reposition it at the mark. 
+	 * If the stream has not been marked, then attempt to reset it in some way appropriate to the 
+	 * particular stream, for example by repositioning it to its starting point. Not all 
+	 * character-input streams support the reset() operation, and some support reset() 
+	 * without supporting mark().
+     *
+	 * @throws IOException If the stream has not been marked, or if the mark has been invalidated, 
+	 *    or if the stream does not support reset(), or if some other I/O error occurs
+     */
+  	public void reset() throws IOException {
+  		in.reset();
+  	}
+
+  	/**
+	 * Skip characters. This method will block until some characters are available, 
+	 * an I/O error occurs, or the end of the stream is reached.
+	 *
+	 * @param n The number of characters to skip
+	 * @return The number of characters actually skipped
+	 * @throws IllegalArgumentException If n is negative
+     * @throws IOException If an I/O error occurs
+     */
+  	public long skip(long n) throws IOException {
+        return in.skip(n);
+  	}
+
+    /**
+     * Regression test for this class.  If this class is working, this should
+     * run and print no errors.
+     * <P>
+     * This method creates a tempory file in the working directory called "test.txt".
+     * This file should not exist before hand, and the program should have create,
+     * read, write, and delete access to this file.
+     *
+     * @param args command line arguments (ignored)
+     */
+    private static void main(String[] args){
+        try {
+            File f = new File("test.txt");
+            if (f.exists()){
+                throw new IOException(f + " already exists.  I don't want to overwrite it.");
+            }
+            StraightStreamReader in;
+            char[] cbuf = new char[0x1000];
+            int read;
+            int totRead;
+
+            // write a file with all possible values of bytes
+			FileOutputStream out = new FileOutputStream(f);
+            for (int i=0x00; i<0x100; i++){
+                out.write(i);
+            }
+            out.close();
+
+            // read it back using the read single character method
+            in = new StraightStreamReader(new FileInputStream(f));
+            for (int i=0x00; i<0x100; i++){
+                read = in.read();
+                if (read != i){
+                	System.err.println("Error: " + i + " read as " + read);
+                }
+            }
+            in.close();
+
+            // read as much of it back as possible with one simple buffer read.
+            in = new StraightStreamReader(new FileInputStream(f));
+            totRead = in.read(cbuf);
+            if (totRead != 0x100){
+                System.err.println("Simple buffered read did not read the full amount: 0x" + Integer.toHexString(totRead));
+            }
+            for (int i=0x00; i<totRead; i++){
+               if (cbuf[i] != i){
+                	System.err.println("Error: 0x" + i + " read as 0x" + cbuf[i]);
+                }
+            }
+            in.close();
+
+            // read it back using buffer read method.
+            in = new StraightStreamReader(new FileInputStream(f));
+            totRead = 0;
+            while (totRead <= 0x100 && (read = in.read(cbuf, totRead, 0x100 - totRead)) > 0){
+                totRead += read;
+			}
+            if (totRead != 0x100){
+                System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead));
+            }
+            for (int i=0x00; i<totRead; i++){
+               if (cbuf[i] != i){
+                	System.err.println("Error: 0x" + i + " read as 0x" + cbuf[i]);
+                }
+            }
+            in.close();
+
+            // read it back using an offset buffer read method.
+            in = new StraightStreamReader(new FileInputStream(f));
+            totRead = 0;
+            while (totRead <= 0x100 && (read = in.read(cbuf, totRead+0x123, 0x100 - totRead)) > 0){
+                totRead += read;
+			}
+            if (totRead != 0x100){
+                System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead));
+            }
+            for (int i=0x00; i<totRead; i++){
+               if (cbuf[i+0x123] != i){
+                	System.err.println("Error: 0x" + i + " read as 0x" + cbuf[i+0x123]);
+                }
+            }
+            in.close();
+
+            // read it back using a partial offset buffer read method.
+            in = new StraightStreamReader(new FileInputStream(f));
+            totRead = 0;
+            while (totRead <= 0x100 && (read = in.read(cbuf, totRead+0x123, 7)) > 0){
+                totRead += read;
+			}
+            if (totRead != 0x100){
+                System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead));
+            }
+            for (int i=0x00; i<totRead; i++){
+               if (cbuf[i+0x123] != i){
+                	System.err.println("Error: 0x" + i + " read as 0x" + cbuf[i+0x123]);
+                }
+            }
+            in.close();
+
+            f.delete();
+        } catch (IOException x){
+            System.err.println(x.getMessage());
+		}
+	}
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/binary.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/binary.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/binary/binary.flex	(revision 25584)
@@ -0,0 +1,52 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+import java.io.*;
+
+%%
+
+%class BinaryLexer
+%8bit
+
+%int
+
+%{
+  public static void main(String [] argv) {
+    for (int i = 0; i < argv.length; i++) {
+      try {
+        System.out.print("["+argv[i]+"] is ");
+        BinaryLexer l = new BinaryLexer(new StraightStreamReader(new FileInputStream(argv[i])));
+        l.yylex();
+      }
+      catch (Exception e) {
+        e.printStackTrace(System.out);
+        System.exit(1);
+      }
+    }
+  }
+%}
+
+magic = \xCA \xFE \xBA \xBE
+
+%%
+
+{magic} [^]+  { System.out.println("a class file"); }
+
+[^]+          { System.out.println("not a class file"); }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/Makefile
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/Makefile	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/Makefile	(revision 25584)
@@ -0,0 +1,27 @@
+# only works with the Java extension of yacc: 
+# byacc/j from http://troi.lincom-asg.com/~rjamison/byacc/
+
+JFLEX  = jflex 
+BYACCJ = yacc -J
+JAVAC  = javac
+
+# targets:
+
+all: Parser.class
+
+run: Parser.class
+	java Parser
+
+build: clean Parser.class
+
+clean:
+	rm -f *~ *.class *.java
+
+Parser.class: Yylex.java Parser.java
+	$(JAVAC) Parser.java
+
+Yylex.java: calc.flex
+	$(JFLEX) calc.flex
+
+Parser.java: calc.y
+	$(BYACCJ) calc.y
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/README	(revision 25584)
@@ -0,0 +1,22 @@
+This directory contains an interoperability example for BYacc/J and JFlex
+(a small calculator)
+
+You need the parser generator byacc/j from
+http://troi.lincom-asg.com/~rjamison/byacc/
+for this example to work (version byacc/j 1.1 has been tested).
+
+Use the Makefile to generate the lexer and parser.
+The example can then be started with
+
+java Parser
+
+
+files:
+
+calc.flex
+  JFlex specification for the lexical part of the arithmetic expressions
+
+calc.y
+  BYacc/J specification and main program for the calculator
+
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/calc.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/calc.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/calc.flex	(revision 25584)
@@ -0,0 +1,62 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2000 Gerwin Klein <lsf@jflex.de>                          *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * Thanks to Larry Bell and Bob Jamison for suggestions and comments.      *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+%%
+
+%byaccj
+
+%{
+  private Parser yyparser;
+
+  public Yylex(java.io.Reader r, Parser yyparser) {
+    this(r);
+    this.yyparser = yyparser;
+  }
+%}
+
+NUM = [0-9]+ ("." [0-9]+)?
+NL  = \n | \r | \r\n
+
+%%
+
+/* operators */
+"+" | 
+"-" | 
+"*" | 
+"/" | 
+"^" | 
+"(" | 
+")"    { return (int) yycharat(0); }
+
+/* newline */
+{NL}   { return Parser.NL; }
+
+/* float */
+{NUM}  { yyparser.yylval = new ParserVal(Double.parseDouble(yytext()));
+         return Parser.NUM; }
+
+/* whitespace */
+[ \t]+ { }
+
+\b     { System.err.println("Sorry, backspace doesn't work"); }
+
+/* error fallback */
+[^]    { System.err.println("Error: unexpected character '"+yytext()+"'"); return -1; }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/calc.y
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/calc.y	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/byaccj/calc.y	(revision 25584)
@@ -0,0 +1,112 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001 Gerwin Klein <lsf@jflex.de>                          *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This is a modified version of the example from                          *
+ *   http://www.lincom-asg.com/~rjamison/byacc/                            *
+ *                                                                         *
+ * Thanks to Larry Bell and Bob Jamison for suggestions and comments.      *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+%{
+  import java.io.*;
+%}
+      
+%token NL          /* newline  */
+%token <dval> NUM  /* a number */
+
+%type <dval> exp
+
+%left '-' '+'
+%left '*' '/'
+%left NEG          /* negation--unary minus */
+%right '^'         /* exponentiation        */
+      
+%%
+
+input:   /* empty string */
+       | input line
+       ;
+      
+line:    NL      { if (interactive) System.out.print("Expression: "); }
+       | exp NL  { System.out.println(" = " + $1); 
+                   if (interactive) System.out.print("Expression: "); }
+       ;
+      
+exp:     NUM                { $$ = $1; }
+       | exp '+' exp        { $$ = $1 + $3; }
+       | exp '-' exp        { $$ = $1 - $3; }
+       | exp '*' exp        { $$ = $1 * $3; }
+       | exp '/' exp        { $$ = $1 / $3; }
+       | '-' exp  %prec NEG { $$ = -$2; }
+       | exp '^' exp        { $$ = Math.pow($1, $3); }
+       | '(' exp ')'        { $$ = $2; }
+       ;
+
+%%
+
+  private Yylex lexer;
+
+
+  private int yylex () {
+    int yyl_return = -1;
+    try {
+      yylval = new ParserVal(0);
+      yyl_return = lexer.yylex();
+    }
+    catch (IOException e) {
+      System.err.println("IO error :"+e);
+    }
+    return yyl_return;
+  }
+
+
+  public void yyerror (String error) {
+    System.err.println ("Error: " + error);
+  }
+
+
+  public Parser(Reader r) {
+    lexer = new Yylex(r, this);
+  }
+
+
+  static boolean interactive;
+
+  public static void main(String args[]) throws IOException {
+    System.out.println("BYACC/Java with JFlex Calculator Demo");
+
+    Parser yyparser;
+    if ( args.length > 0 ) {
+      // parse a file
+      yyparser = new Parser(new FileReader(args[0]));
+    }
+    else {
+      // interactive mode
+      System.out.println("[Quit with CTRL-D]");
+      System.out.print("Expression: ");
+      interactive = true;
+	    yyparser = new Parser(new InputStreamReader(System.in));
+    }
+
+    yyparser.yyparse();
+    
+    if (interactive) {
+      System.out.println();
+      System.out.println("Have a nice day");
+    }
+  }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/Main.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/Main.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/Main.java	(revision 25584)
@@ -0,0 +1,39 @@
+/*
+  This example comes from a short article series in the Linux 
+  Gazette by Richard A. Sevenich and Christopher Lopes, titled
+  "Compiler Construction Tools". The article series starts at
+
+  http://www.linuxgazette.com/issue39/sevenich.html
+
+  Small changes and updates to newest JFlex+Cup versions 
+  by Gerwin Klein
+*/
+
+/*
+  Commented By: Christopher Lopes
+  File Name: Main.java
+  To Create: 
+  After the scanner, lcalc.flex, and the parser, ycalc.cup, have been created.
+  > javac Main.java
+  
+  To Run: 
+  > java Main test.txt
+  where test.txt is an test input file for the calculator.
+*/
+   
+import java.io.*;
+   
+public class Main {
+  static public void main(String argv[]) {    
+    /* Start the parser */
+    try {
+      parser p = new parser(new Lexer(new FileReader(argv[0])));
+      Object result = p.parse().value;      
+    } catch (Exception e) {
+      /* do cleanup here -- possibly rethrow e */
+      e.printStackTrace();
+    }
+  }
+}
+
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/Makefile
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/Makefile	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/Makefile	(revision 25584)
@@ -0,0 +1,26 @@
+JAVA=java
+JAVAC=javac
+JFLEX=jflex
+CUP=$(JAVA) java_cup.Main <
+
+all: test
+
+test: output.txt
+	@(diff output.txt output.good && echo "Test OK!") || echo "Test failed!"
+
+output.txt: Main.class test.txt
+	$(JAVA) Main test.txt > output.txt
+
+Main.class: Main.java Lexer.java parser.java
+
+%.class: %.java
+	$(JAVAC) $^
+
+Lexer.java: lcalc.flex
+	$(JFLEX) lcalc.flex
+
+parser.java: ycalc.cup
+	$(CUP) ycalc.cup
+
+clean:
+	rm -f parser.java Lexer.java sym.java output.txt *.class *~
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/README	(revision 25584)
@@ -0,0 +1,30 @@
+A small JFlex+Cup example
+
+It comes from a short article series in the Linux Gazette by Richard
+A. Sevenich and Christopher Lopes, titled "Compiler Construction
+Tools". The article series starts at
+
+http://www.linuxgazette.com/issue39/sevenich.html
+
+Small changes and updates to newest JFlex+Cup versions by Gerwin Klein
+
+
+To compile:
+>jflex lcalc.flex
+>java java_cup.Main < ycalc.cup
+>javac Main.java
+
+To run:
+>java Main test.txt
+
+
+Files:
+
+Main.java       demo of a main program
+Makefile        makefile to compile and test the example
+README          this file
+lcalc.flex      the lexer spec
+output.good     how the output should look like for the test
+ycalc.cup       the parser spec
+test.txt        sample input for testing
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/lcalc.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/lcalc.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/lcalc.flex	(revision 25584)
@@ -0,0 +1,142 @@
+/*
+  This example comes from a short article series in the Linux 
+  Gazette by Richard A. Sevenich and Christopher Lopes, titled
+  "Compiler Construction Tools". The article series starts at
+
+  http://www.linuxgazette.com/issue39/sevenich.html
+
+  Small changes and updates to newest JFlex+Cup versions 
+  by Gerwin Klein
+*/
+
+/*
+  Commented By: Christopher Lopes
+  File Name: lcalc.flex
+  To Create: > jflex lcalc.flex
+
+  and then after the parser is created
+  > javac Lexer.java
+*/
+   
+/* --------------------------Usercode Section------------------------ */
+   
+import java_cup.runtime.*;
+      
+%%
+   
+/* -----------------Options and Declarations Section----------------- */
+   
+/* 
+   The name of the class JFlex will create will be Lexer.
+   Will write the code to the file Lexer.java. 
+*/
+%class Lexer
+
+/*
+  The current line number can be accessed with the variable yyline
+  and the current column number with the variable yycolumn.
+*/
+%line
+%column
+    
+/* 
+   Will switch to a CUP compatibility mode to interface with a CUP
+   generated parser.
+*/
+%cup
+   
+/*
+  Declarations
+   
+  Code between %{ and %}, both of which must be at the beginning of a
+  line, will be copied letter to letter into the lexer class source.
+  Here you declare member variables and functions that are used inside
+  scanner actions.  
+*/
+%{   
+    /* To create a new java_cup.runtime.Symbol with information about
+       the current token, the token will have no value in this
+       case. */
+    private Symbol symbol(int type) {
+        return new Symbol(type, yyline, yycolumn);
+    }
+    
+    /* Also creates a new java_cup.runtime.Symbol with information
+       about the current token, but this object has a value. */
+    private Symbol symbol(int type, Object value) {
+        return new Symbol(type, yyline, yycolumn, value);
+    }
+%}
+   
+
+/*
+  Macro Declarations
+  
+  These declarations are regular expressions that will be used latter
+  in the Lexical Rules Section.  
+*/
+   
+/* A line terminator is a \r (carriage return), \n (line feed), or
+   \r\n. */
+LineTerminator = \r|\n|\r\n
+   
+/* White space is a line terminator, space, tab, or line feed. */
+WhiteSpace     = {LineTerminator} | [ \t\f]
+   
+/* A literal integer is is a number beginning with a number between
+   one and nine followed by zero or more numbers between zero and nine
+   or just a zero.  */
+dec_int_lit = 0 | [1-9][0-9]*
+   
+/* A identifier integer is a word beginning a letter between A and
+   Z, a and z, or an underscore followed by zero or more letters
+   between A and Z, a and z, zero and nine, or an underscore. */
+dec_int_id = [A-Za-z_][A-Za-z_0-9]*
+   
+%%
+/* ------------------------Lexical Rules Section---------------------- */
+   
+/*
+   This section contains regular expressions and actions, i.e. Java
+   code, that will be executed when the scanner matches the associated
+   regular expression. */
+   
+   /* YYINITIAL is the state at which the lexer begins scanning.  So
+   these regular expressions will only be matched if the scanner is in
+   the start state YYINITIAL. */
+   
+<YYINITIAL> {
+   
+    /* Return the token SEMI declared in the class sym that was found. */
+    ";"                { return symbol(sym.SEMI); }
+   
+    /* Print the token found that was declared in the class sym and then
+       return it. */
+    "+"                { System.out.print(" + "); return symbol(sym.PLUS); }
+    "-"                { System.out.print(" - "); return symbol(sym.MINUS); }
+    "*"                { System.out.print(" * "); return symbol(sym.TIMES); }
+    "/"                { System.out.print(" / "); return symbol(sym.DIVIDE); }
+    "("                { System.out.print(" ( "); return symbol(sym.LPAREN); }
+    ")"                { System.out.print(" ) "); return symbol(sym.RPAREN); }
+   
+    /* If an integer is found print it out, return the token NUMBER
+       that represents an integer and the value of the integer that is
+       held in the string yytext which will get turned into an integer
+       before returning */
+    {dec_int_lit}      { System.out.print(yytext());
+                         return symbol(sym.NUMBER, new Integer(yytext())); }
+   
+    /* If an identifier is found print it out, return the token ID
+       that represents an identifier and the default value one that is
+       given to all identifiers. */
+    {dec_int_id}       { System.out.print(yytext());
+                         return symbol(sym.ID, new Integer(1));}
+   
+    /* Don't do anything if whitespace is found */
+    {WhiteSpace}       { /* just skip what was found, do nothing */ }   
+}
+
+
+/* No token was found for the input so through an error.  Print out an
+   Illegal character message with the illegal character that was found. */
+[^]                    { throw new Error("Illegal character <"+yytext()+">"); }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/output.good
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/output.good	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/output.good	(revision 25584)
@@ -0,0 +1,5 @@
+2 + 4 = 6
+5 *  ( 6 - 3 )  + 1 = 16
+6 / 3 * 5 + 20 = 30
+4 * 76 / 31 = 9
+1 - 1 - 1 = -1
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/test.txt
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/test.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/test.txt	(revision 25584)
@@ -0,0 +1,5 @@
+2+4; 
+5*(6-3)+1; 
+6/3*5+20; 
+4*76/31;
+1-1-1;
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/ycalc.cup
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/ycalc.cup	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/cup/ycalc.cup	(revision 25584)
@@ -0,0 +1,234 @@
+/*
+  This example comes from a short article series in the Linux 
+  Gazette by Richard A. Sevenich and Christopher Lopes, titled
+  "Compiler Construction Tools". The article series starts at
+
+  http://www.linuxgazette.com/issue39/sevenich.html
+
+  Small changes and updates to newest JFlex+Cup versions 
+  by Gerwin Klein
+*/
+
+/*
+  Commented By: Christopher Lopes
+  File Name: ycalc.cup
+  To Create: > java java_cup.Main < ycalc.cup
+*/
+   
+   
+/* ----------------------Preliminary Declarations Section--------------------*/
+   
+/* Import the class java_cup.runtime.*  */
+import java_cup.runtime.*;
+   
+/* Parser code to change the way the parser reports errors (include
+   line and column number of the error). */
+parser code {:
+    
+    /* Change the method report_error so it will display the line and
+       column of where the error occurred in the input as well as the
+       reason for the error which is passed into the method in the
+       String 'message'. */
+    public void report_error(String message, Object info) {
+   
+        /* Create a StringBuffer called 'm' with the string 'Error' in it. */
+        StringBuffer m = new StringBuffer("Error");
+   
+        /* Check if the information passed to the method is the same
+           type as the type java_cup.runtime.Symbol. */
+        if (info instanceof java_cup.runtime.Symbol) {
+            /* Declare a java_cup.runtime.Symbol object 's' with the
+               information in the object info that is being typecasted
+               as a java_cup.runtime.Symbol object. */
+            java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info);
+   
+            /* Check if the line number in the input is greater or
+               equal to zero. */
+            if (s.left >= 0) {                
+                /* Add to the end of the StringBuffer error message
+                   the line number of the error in the input. */
+                m.append(" in line "+(s.left+1));   
+                /* Check if the column number in the input is greater
+                   or equal to zero. */
+                if (s.right >= 0)                    
+                    /* Add to the end of the StringBuffer error message
+                       the column number of the error in the input. */
+                    m.append(", column "+(s.right+1));
+            }
+        }
+   
+        /* Add to the end of the StringBuffer error message created in
+           this method the message that was passed into this method. */
+        m.append(" : "+message);
+   
+        /* Print the contents of the StringBuffer 'm', which contains
+           an error message, out on a line. */
+        System.err.println(m);
+    }
+   
+    /* Change the method report_fatal_error so when it reports a fatal
+       error it will display the line and column number of where the
+       fatal error occurred in the input as well as the reason for the
+       fatal error which is passed into the method in the object
+       'message' and then exit.*/
+    public void report_fatal_error(String message, Object info) {
+        report_error(message, info);
+        System.exit(1);
+    }
+:};
+   
+
+   
+/* ------------Declaration of Terminals and Non Terminals Section----------- */
+   
+/* Terminals (tokens returned by the scanner).  
+
+   Terminals that have no value are listed first and then terminals
+   that do have an value, in this case an integer value, are listed on
+   the next line down. */
+terminal           SEMI, PLUS, MINUS, TIMES, DIVIDE, LPAREN, RPAREN;
+terminal Integer   NUMBER, ID;
+   
+/* Non terminals used in the grammar section.  
+
+   Non terminals that have an object value are listed first and then
+   non terminals that have an integer value are listed.  An object
+   value means that it can be any type, it isn't set to a specific
+   type.  So it could be an Integer or a String or whatever. */
+non terminal Object     expr_list, expr_part;
+non terminal Integer    expr, factor, term;
+   
+
+/* -------------Precedence and Associatively of Terminals Section----------- */
+   
+/*
+  Precedence of non terminals could be defined here.  If you do define
+  precedence here you won't need to worry about precedence in the
+  Grammar Section, i.e. that TIMES should have a higher precedence
+  than PLUS.
+  
+  The precedence defined here would look something like this where the
+  lower line always will have higher precedence than the line before it.
+   
+  precedence left PLUS, MINUS; 
+  precedence left TIMES, DIVIDE; 
+*/
+
+
+/* ----------------------------Grammar Section-------------------- */
+   
+/* The grammar for our parser.
+   
+   expr_list ::=   expr_list expr_part
+                 | expr_part
+   expr_part ::=   expr SEMI
+   expr      ::=   expr PLUS factor
+                 | expr MINUS factor
+                 | factor
+   factor    ::=   factor TIMES term
+                 | factor DIVIDE term
+                 | term
+   term     ::=    LPAREN expr RPAREN
+                 | NUMBER
+                 | ID     
+*/
+   
+/* 'expr_list' is the start of our grammar.  It can lead to another
+   'expr_list' followed by an 'expr_part' or it can just lead to an
+   'expr_part'.  The lhs of the non terminals 'expr_list' and
+   'expr_part' that are in the rhs side of the production below need
+   to be found.  Then the rhs sides of those non terminals need to be
+   followed in a similar manner, i.e. if there are any non terminals
+   in the rhs of those productions then the productions with those non
+   terminals need to be found and those rhs's followed.  This process
+   keeps continuing until only terminals are found in the rhs of a
+   production.  Then we can work our way back up the grammar bringing
+   any values that might have been assigned from a terminal. */
+   
+   expr_list ::= expr_list expr_part
+                 |
+                 expr_part;
+   
+/* 'expr_part' is an 'expr' followed by the terminal 'SEMI'.  The ':e'
+   after the non terminal 'expr' is a label an is used to access the
+   value of 'expr' which will be an integer.  The action for the
+   production lies between {: and :}.  This action will print out the
+   line " = + e" where e is the value of 'expr'.  Before the action
+   takes places we need to go deeper into the grammar since 'expr' is
+   a non terminal.  Whenever a non terminal is encountered on the rhs
+   of a production we need to find the rhs of that non terminal until
+   there are no more non terminals in the rhs.  So when we finish
+   going through the grammar and don't encounter any more non
+   terminals in the rhs productions will return until we get back to
+   'expr' and at that point 'expr' will contain an integer value. */
+   
+   expr_part ::= expr:e
+                 {: System.out.println(" = " + e); :}
+                 SEMI
+                 ;
+   
+/* 'expr' can lead to 'expr PLUS factor', 'expr MINUS factor', or
+   'factor'.  The 'TIMES' and 'DIVIDE' productions are not at this
+   level.  They are at a lower level in the grammar which in affect
+   makes them have higher precedence.  Actions for the rhs of the non
+   terminal 'expr' return a value to 'expr'.  This value that is
+   created is an integer and gets stored in 'RESULT' in the action.
+   RESULT is the label that is assigned automatically to the rhs, in
+   this case 'expr'.  If the rhs is just 'factor' then 'f' refers to
+   the non terminal 'factor'.  The value of 'f' is retrieved with the
+   function 'intValue()' and will be stored in 'RESULT'.  In the other
+   two cases 'f' and 'e' refers to the non terminals 'factor' and
+   'expr' respectively with a terminal between them, either 'PLUS' or
+   'MINUS'.  The value of each is retrieved with the same function
+   'intValue'.  The values will be added or subtracted and then the
+   new integer will be stored in 'RESULT'.*/
+   
+   expr      ::= expr:e PLUS factor:f
+                 {: RESULT = new Integer(e.intValue() + f.intValue()); :}
+                 |
+                 expr:e MINUS factor:f
+                 {: RESULT = new Integer(e.intValue() - f.intValue()); :}
+                 |
+                 factor:f
+                 {: RESULT = new Integer(f.intValue()); :}
+                 ;
+   
+/* 'factor' can lead to 'factor TIMES term', 'factor DIVIDE term', or
+   'term'.  Since the productions for TIMES and DIVIDE are lower in
+   the grammar than 'PLUS' and 'MINUS' they will have higher
+   precedence.  The same sort of actions take place in the rhs of
+   'factor' as in 'expr'.  The only difference is the operations that
+   takes place on the values retrieved with 'intValue()', 'TIMES' and
+   'DIVIDE' here instead of 'PLUS' and 'MINUS'.  */
+   
+   factor    ::= factor:f TIMES term:t
+                 {: RESULT = new Integer(f.intValue() * t.intValue()); :}
+                 |
+                 factor:f DIVIDE term:t
+                 {: RESULT = new Integer(f.intValue() / t.intValue()); :}
+                 |
+                 term:t
+                 {: RESULT = new Integer(t.intValue()); :}
+                 ;
+   
+/* 'term' can lead to 'LPAREN expr RPAREN', 'NUMBER', or 'ID'.  The
+   first production has the non terminal 'expr' in it so the
+   production with its lhs side needs to be found and followed.  The
+   next rhs has no non terminals.  So the grammar ends here and can go
+   back up.  When it goes back up it will bring the value that was
+   retrieved when the scanner encounter the token 'NUMBER'.  'RESULT'
+   is assigned 'n', which refers to 'NUMBER', as the action for this
+   production.  The same action occurs for 'ID', except the 'i' is
+   used to refer to 'ID'.  'ID' is also the only thing on the rhs of
+   the production.  And since 'ID' is a terminal the grammar will end
+   here and go back up. */
+   
+   term      ::= LPAREN expr:e RPAREN
+                 {: RESULT = e; :}
+                 |
+                 NUMBER:n
+                 {: RESULT = n; :}
+                 |
+                 ID:i
+                 {: RESULT = i; :}
+                 ;
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/AST.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/AST.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/AST.java	(revision 25584)
@@ -0,0 +1,30 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/**
+ * General interface for nodes in the abstract syntax tree. Contains   
+ * only the method toString which is already inherited from Object,   
+ * so the interface doesn't add any functionality. It only provides   
+ * a common super type for all elements in the AST.                   
+ */
+interface AST {
+  public String toString();   // already inherited from Object
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Main.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Main.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Main.java	(revision 25584)
@@ -0,0 +1,85 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+import java.io.*;
+
+/**
+ * Main program of the interpreter for the AS programming language.
+ * Based on JFlex/CUP.
+ * 
+ * Steps:
+ * - scanning                               (Yylex)
+ * - context free parsing and AST building  (yyparse)
+ * - build up symbol table                  (setSymtabs)
+ * - check context conditions               (checkcontext)
+ * - prepare interpretation                 (prepInterp)
+ * - start interpretation                   (interpret)
+ */ 
+public class Main {
+
+  public static void main(String [] args) throws Exception {
+    Reader reader = null;
+    
+    if (args.length == 1) {
+      File input = new File(args[0]);
+      if (!input.canRead()) {
+        System.out.println("Error: could not read ["+input+"]");
+      }
+      reader = new FileReader(input);
+    }
+    else {  
+     reader = new InputStreamReader(System.in);
+    }
+
+    Yylex scanner = new Yylex(reader);   // create scanner
+    SymTab symtab = new SymTab();        // set global symbol table    
+    scanner.setSymtab(symtab);
+
+    parser parser = new parser(scanner); // create parser
+    Tprogram syntaxbaum = null;
+
+    try { 
+      syntaxbaum = (Tprogram) parser.parse().value;  // parse
+    }    
+    catch (Exception e) { 
+      e.printStackTrace(); 
+    }
+
+    // System.out.println(symtab);
+    System.out.println(syntaxbaum);
+
+    syntaxbaum.setSymtabs();          // set symbol table
+    // syntaxbaum.printSymtabs();       // print symbol table
+
+    syntaxbaum.checkcontext();        // CoCo (DefVar, DefFun, Arity)
+    if(contexterror>0) return;
+
+    syntaxbaum.prepInterp();          // var. indices and function pointers
+    // im Syntaxbaum setzen
+    syntaxbaum.interpret();           // interpretation
+  }
+
+  static int contexterror = 0;        // number of errors in context conditions
+
+  public static void error(String s) { 
+    System.out.println((contexterror++)+". "+s); 
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Makefile
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Makefile	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Makefile	(revision 25584)
@@ -0,0 +1,42 @@
+# uses JFlex >= 1.3.2, and CUP >= 0.10j
+#
+# targets:
+#
+# make all                                                            
+#    generates lexer, and parser, and compiles all *.java files
+#                                                                     
+# make run (or just: make)                                           
+#    starts the program on a test example
+#                                                                     
+
+
+
+.SUFFIXES: $(SUFFIXES) .class .java
+
+.java.class:
+	javac $*.java
+
+FILE=	Yylex.java      parser.java    sym.java \
+	SymTab.java	AST.java \
+	Tnumber.java	Tident.java	Texp.java	\
+	Tfun.java	Texpinfix.java	Tuminus.java	\
+	Tboolexp.java	Tifthenelse.java		\
+	Tdekl.java	Tdekllist.java			\
+	Tparlist.java   Texplist.java	Tprogram.java	\
+	Main.java \
+	SymtabEntry.java STEfun.java	STEvar.java
+
+
+run: all
+	java Main < example.as
+
+all: Yylex.java parser.java $(FILE:java=class)
+
+clean:
+	rm -f *.class *~ *.bak Yylex.java parser.java sym.java
+
+Yylex.java: scanner.flex
+	jflex scanner.flex
+
+parser.java: parser.cup
+	java java_cup.Main -interface < parser.cup
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/README	(revision 25584)
@@ -0,0 +1,31 @@
+This directory contains an interpreter for a small functional
+programming language (called "AS"). It uses JFlex and CUP.
+
+Directory contents:
+
+- Main.java is the main program. It reads an AS program from
+  std in and interprets it.
+
+- Makefile runs jflex, cup, javac and the compiled interpreter
+
+- Classes beginning with "T" implement the abstract syntax tree.
+  They also contain context condition checking and the interpreter.
+
+- Symtab.java, SymtabEntry.java, STEfun.java, STEvar.java implement
+  the symbol table.
+
+- scanner.lex and parser.cup contain the scanner and parser.
+
+- example.as is an example program in AS
+
+
+The language is described in:
+Manfred Broy: Einfuehrung in die Informatik, Springer Verlag 
+
+The files are a solution to excercise 3.40 in the book:
+Manfred Broy,Bernhard Rumpe: 
+Uebungen zur Einfuehrung in die Informatik --                      
+Strukturierte Aufgabensammlung mit Musterloesungen, 
+Springer Verlag, 2001
+
+Both books are only available in German. Sorry.
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/STEfun.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/STEfun.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/STEfun.java	(revision 25584)
@@ -0,0 +1,54 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * Symbol table entry for functions.
+ * 
+ * Contains arity and reference to location of definition
+ */ 
+class STEfun extends SymtabEntry {
+  int arity;
+  Tdekl dekl; // location of definition
+  
+  public STEfun(String f, Tdekl d, int a) { 
+    super(f);
+    dekl=d;
+    arity=a;
+  }
+  
+  public int kind() { 
+    return SymtabEntry.FUN; 
+  }
+
+  public String toString() { 
+    return "function    "+name+", arity "+arity; 
+  }
+
+  public int arity() { 
+    return arity; 
+  }
+
+  public Tdekl getDekl() { 
+    return dekl; 
+  }
+}
+
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/STEvar.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/STEvar.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/STEvar.java	(revision 25584)
@@ -0,0 +1,57 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * Symbol table entry for variables.
+ * 
+ * Contains index in the parameter list and a flag if it
+ * is an input variable.
+ */ 
+class STEvar extends SymtabEntry {
+  boolean is_input;           
+  int index;                  
+
+  public STEvar(String v, boolean ii, int ind) {
+    super(v);
+    is_input=ii;
+    index=ind;
+  }
+
+  public int kind() {
+    return SymtabEntry.VAR; 
+  }
+
+  public String toString() {
+    if (is_input) 
+      return "input var "+name+"  ("+index+")";
+    else 
+      return "parameter "+name+"  ("+index+")";
+  }
+
+  public int getIndex() {
+    return index; 
+  }
+
+  public boolean isInput() {
+    return is_input; 
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/SymTab.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/SymTab.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/SymTab.java	(revision 25584)
@@ -0,0 +1,78 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+import java.util.*;
+
+/**
+ * Symbol table for the interpreter, contains information about
+ * variables and functions.
+ * 
+ * For every binding location of a name a symbol will be created.
+ * The symbol tables are connected hierarchically by pointers to
+ * the predecessor. Lookup takes predecessors into account.
+ */ 
+public class SymTab {
+  Hashtable h;        // contains the liste of words
+                      // key: String, value: SymtabEntry
+  
+  SymTab pred;  // predecessor symbol table (if exists)
+
+  public SymTab() {
+    this(null); 
+  }
+
+  public SymTab(SymTab p) {
+    h    = new Hashtable();
+    pred = p;
+  }
+
+  public boolean enter(String s, SymtabEntry e) {
+    Object value = lookup(s);
+    h.put(s, e);
+    return(value==null);
+  }
+
+  public SymtabEntry lookup(String s) {
+    Object value = h.get(s);
+    if (value==null && pred!=null)
+      value = pred.lookup(s);
+    return ((SymtabEntry)value);
+  }
+
+  public String toString() {    // for output with print
+    String res    = "symbol table\n=============\n";
+    Enumeration e = h.keys();
+    String key;
+    
+    while(e.hasMoreElements()) {
+      key = (String)e.nextElement();
+      res += key+"   \t"+h.get(key)+"\n";
+    }
+
+    if (pred!=null) res+="++ predecessor!\n";
+    return(res);
+  }
+
+  public int size() {
+    return(h.size()); 
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/SymtabEntry.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/SymtabEntry.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/SymtabEntry.java	(revision 25584)
@@ -0,0 +1,48 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * Symbol table entry for names, there are subclasses for
+ * variables and functions.
+ * 
+ * Defines constants UNKNOWN, VAR und FUN as kinds of
+ * symbol table entries.
+ */ 
+class SymtabEntry {
+  String name;
+
+  public SymtabEntry(String v) {
+    name=v; 
+  }
+
+  public int kind() {
+    return UNKNOWN; 
+  }
+
+  public String toString() {
+    return("unknown "+name); 
+  }
+
+  static final int UNKNOWN = 12;
+  static final int VAR = 13;
+  static final int FUN = 14;
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tboolexp.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tboolexp.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tboolexp.java	(revision 25584)
@@ -0,0 +1,64 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for bool expressions
+ */ 
+class Tboolexp implements AST {
+  Texp exp1, exp2;            // left and right subexpression 
+  char kind;                  // '=', '<' and '!' for "<="
+
+  public Tboolexp(Texp e1, char k, Texp e2) {
+    exp1=e1;
+    kind=k;
+    exp2=e2;
+  }
+
+  public String toString() {
+    if (kind!='!') 
+      return(""+exp1+kind+exp2);
+    else 
+      return(exp1+"<="+exp2);
+  }
+
+  public void checkcontext(SymTab st) { // context conditions 
+    exp1.checkcontext(st);
+    exp2.checkcontext(st);
+  }
+
+  public void prepInterp(SymTab st) {   // set pointers and indices
+    exp1.prepInterp(st);
+    exp2.prepInterp(st);
+  }
+
+  public boolean interpret(int[] in, int[] par) {
+    int e1 = exp1.interpret(in,par);
+    int e2 = exp2.interpret(in,par);
+    switch(kind) {
+    case '=': return(e1==e2);
+    case '<': return(e1<e2);
+    case '!': return(e1<=e2);
+    }
+
+    return(false);     // error
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tdekl.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tdekl.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tdekl.java	(revision 25584)
@@ -0,0 +1,75 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for function declarations.
+ * 
+ * Also contains a reference to the symbol table of 
+ * the paramaters and their arity.
+ */ 
+class Tdekl implements AST {
+  Tident ident;               // identifier
+  Tparlist parlist;           // liste of parameter
+  Texp exp;                   // function body
+
+  public Tdekl(Tident i, Tparlist p, Texp e) {
+    parlist=p;
+    ident=i;
+    exp=e;
+  }
+
+  public String toString() {
+    return(ident+"("+parlist+") = \n  "+exp); 
+  }
+
+  SymTab params;              // symbol table of the parameters 
+  int arity;                  
+
+  public void setSymtab(SymTab st) {
+    params = new SymTab(st);
+    parlist.setSymtab(params,false,0);
+    arity = params.size();
+    
+    boolean isNew = st.enter(ident.toString(),
+                             new STEfun(ident.toString(),this,arity));
+    // CoCo (Fun)
+    if(!isNew) Main.error("funktion "+ident+" defined twice!");
+  }
+
+  public void printSymtabs() {
+    System.out.print("funktion "+ident.toString()+"\n"+params); 
+  }
+
+  public void checkcontext() {        
+    exp.checkcontext(params);         // CoCo (DefFun,DefVar,Arity)
+  }
+    
+  public void prepInterp(SymTab st) {   // set pointers and indices
+    exp.prepInterp(params);
+  }
+
+  public int interpret(int[] in, int[] par) {    
+    return(exp.interpret(in,par)); 
+  }
+
+  public int arity() { return(arity); }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tdekllist.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tdekllist.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tdekllist.java	(revision 25584)
@@ -0,0 +1,69 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for declaration lists of functions
+ */ 
+class Tdekllist implements AST {
+  Tdekllist dekllist;         // rest list (optional null)
+  Tdekl dekl;                 // declaration
+
+  public Tdekllist(Tdekllist p, Tdekl e) {
+    dekllist=p;
+    dekl=e;
+  }
+
+  public Tdekllist(Tdekl e) {
+    dekllist=null;
+    dekl=e;
+  }
+
+  public String toString() {
+    if (dekllist!=null) 
+      return(dekllist+",\n"+dekl);
+    else 
+      return(dekl.toString());
+  }
+
+  public void setSymtab(SymTab st) {
+    if (dekllist!=null) 
+      dekllist.setSymtab(st);
+    dekl.setSymtab(st);
+  }
+
+  public void printSymtabs() {
+    if (dekllist!=null) 
+      dekllist.printSymtabs();
+    dekl.printSymtabs();
+  }
+  
+  public void checkcontext() {
+    if (dekllist!=null) 
+      dekllist.checkcontext();    
+    dekl.checkcontext();              // CoCo (DefFun,DefVar,Arity)
+  }                                   // in function body
+
+  public void prepInterp(SymTab st) {  // set pointers and indices
+    dekl.prepInterp(st);
+    if (dekllist!=null) dekllist.prepInterp(st);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texp.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texp.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texp.java	(revision 25584)
@@ -0,0 +1,43 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for an integer expression.
+ * 
+ * The non terminal exp is the sum of multiple variants and
+ * therefore modeled as an abstract class.
+ * 
+ * The interpretation function <tt>interpret</tt> is called with
+ * valuations of input variables <tt>in</tt> and parameters
+ * <tt>par</tt>. Before interpret can be called, pointers
+ * and variable indices must be set with <tt>prepInterp</tt>.
+ */ 
+abstract class Texp implements AST {
+  // test context conditions (DefFun,DefVar,Arity)
+  abstract public void checkcontext(SymTab st);
+  
+  // set pointers and indices for variables and functions
+  abstract public void prepInterp(SymTab st);
+  
+  // interpretation
+  abstract public int interpret(int[] in, int[] par);
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texpinfix.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texpinfix.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texpinfix.java	(revision 25584)
@@ -0,0 +1,64 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for infix expressions
+ */ 
+class Texpinfix extends Texp implements AST {
+  Texp exp1, exp2;            // left and right sub expression
+  char kind;                  // kind ('+', '-', '*', '/')
+
+  public Texpinfix(Texp e1, char k, Texp e2) {
+    exp1=e1;
+    kind=k;
+    exp2=e2;
+  }
+
+  public String toString() {
+    return("("+exp1+kind+exp2+")"); 
+  }
+
+  public void checkcontext(SymTab st) { // context conditions
+    exp1.checkcontext(st);
+    exp2.checkcontext(st);
+  }
+
+  public void prepInterp(SymTab st) {  // set pointers und indices
+    exp1.prepInterp(st);
+    exp2.prepInterp(st);
+  }
+
+  public int interpret(int[] in, int[] par) {    
+    int e1 = exp1.interpret(in,par);
+    int e2 = exp2.interpret(in,par);
+
+    switch (kind) {
+    case '+': return(e1+e2);
+    case '-': return(e1-e2);
+    case '*': return(e1*e2);
+    case '/': return(e1/e2);
+    }
+
+    return -1;        // error
+  }
+}
+
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texplist.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texplist.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Texplist.java	(revision 25584)
@@ -0,0 +1,73 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for a list of expressions.
+ * 
+ * The interpretation of a list of expressions stores the
+ * results of the expressions in an array that can be used
+ * as parameter list for function calls.
+ */ 
+class Texplist implements AST {
+  Texplist explist;           // next list element (optional null)
+  Texp exp;                   // expression of this list node
+
+  public Texplist(Texplist p, Texp e) {
+    explist=p;
+    exp=e;
+  }
+
+  public Texplist(Texp e) {
+    explist=null;
+    exp=e;
+  }
+
+  public String toString() {
+    if (explist!=null)
+      return explist+","+exp;
+    else 
+      return exp.toString();
+  }
+
+  public void checkcontext(SymTab st) {
+    if (explist!=null) 
+      explist.checkcontext(st);
+    exp.checkcontext(st);             // CoCo (DefFun,DefVar,Arity)
+  }                                   // in expression
+
+  public int length() {
+    if (explist!=null) 
+      return 1+explist.length();
+    else 
+      return 1;
+  }
+  
+  public void prepInterp(SymTab st) {  // set pointers and indices
+    exp.prepInterp(st);
+    if (explist!=null) explist.prepInterp(st);
+  }
+  
+  public void interpret(int[] in, int[] par, int[] res, int index) {
+    res[index] = exp.interpret(in,par);
+    if (explist!=null) explist.interpret(in,par,res,index+1);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tfun.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tfun.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tfun.java	(revision 25584)
@@ -0,0 +1,66 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for function application.
+ * 
+ * Also contains pointer to declaration location of the function.
+ */ 
+class Tfun extends Texp implements AST {
+  Tident ident;                       // name of the function
+  Texplist explist;                   // parameter list
+
+  public Tfun(Tident i, Texplist e) {
+    ident=i;
+    explist=e;
+  }
+
+  public String toString() {
+    return ident+"("+explist+")"; 
+  }
+
+  public void checkcontext(SymTab st) { // CoCo (DefFun,Arity)
+    explist.checkcontext(st);
+    SymtabEntry ste = st.lookup(ident.toString());
+    if (ste==null)
+      Main.error("function not defined: "+ident);
+    else if (ste.kind() != SymtabEntry.FUN)
+      Main.error("variable used as funktion: "+ident);
+    else if (((STEfun)ste).arity() != explist.length())
+      Main.error("wrong arity at function call: "+ident);
+  }
+
+  Tdekl fundekl;              // pointer to location of function declaration
+
+  // set pointers and indices 
+  public void prepInterp(SymTab st) {
+    fundekl = ((STEfun)st.lookup(ident.toString())).getDekl();
+    explist.prepInterp(st);
+  }
+
+  public int interpret(int[] in, int[] par) {
+    int[] newparams = new int[fundekl.arity()];
+    explist.interpret(in,par,newparams,0);
+    return fundekl.interpret(in,newparams);
+  }
+}
+
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tident.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tident.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tident.java	(revision 25584)
@@ -0,0 +1,62 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for an identifier
+ */ 
+class Tident extends Texp implements AST {
+  String name;                
+
+  public Tident(String s) {
+    name = s; 
+  }
+
+  public String toString() {
+    return name; 
+  }
+
+  public void checkcontext(SymTab st) {         // CoCo (DefVar)
+    SymtabEntry ste = st.lookup(name);
+
+    if (ste==null)
+      Main.error("variable not defined: "+name);
+    else if (ste.kind() != SymtabEntry.VAR)
+      Main.error("function used as variable: "+name);
+  }
+
+  int index;              // number of ident in environment
+  boolean is_input;       // is it an input variable?    
+
+  public void prepInterp(SymTab st) {  // set index for environment 
+    STEvar ste = (STEvar)st.lookup(name);
+    index = ste.getIndex();
+    is_input = ste.isInput();
+  }
+
+  public int interpret(int[] in, int[] par) {
+    if (is_input) 
+      return(in[index]); 
+    else 
+      return(par[index]);
+  }
+}
+
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tifthenelse.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tifthenelse.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tifthenelse.java	(revision 25584)
@@ -0,0 +1,59 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for if-then-else expressions
+ */ 
+class Tifthenelse extends Texp implements AST {
+  Tboolexp boolexp;           // condition
+  Texp exp1, exp2;            // then and else branch
+  
+  public Tifthenelse(Tboolexp b, Texp e1, Texp e2) {
+    boolexp=b;
+    exp1=e1;
+    exp2=e2;
+  }
+  
+  public String toString() {
+    return "if "+boolexp+" then "+exp1+" else "+exp2+" fi"; 
+  }
+
+  public void checkcontext(SymTab st) {
+    boolexp.checkcontext(st);
+    exp1.checkcontext(st);
+    exp2.checkcontext(st);
+  }
+
+  public void prepInterp(SymTab st) {
+    boolexp.prepInterp(st);
+    exp1.prepInterp(st);
+    exp2.prepInterp(st);
+  }
+
+  public int interpret(int[] in, int[] par) {
+    boolean b = boolexp.interpret(in,par);
+    if (b) 
+      return exp1.interpret(in,par);
+    else 
+      return exp2.interpret(in,par);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tnumber.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tnumber.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tnumber.java	(revision 25584)
@@ -0,0 +1,47 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for a number
+ */ 
+class Tnumber extends Texp implements AST {
+  int n;             // value of the number
+
+  public Tnumber(String s) {
+    try { n = Integer.parseInt(s); }
+    catch (NumberFormatException e) { n=-1; };
+  }
+
+  public String toString() {
+    return(""+n); 
+  }
+
+  public void checkcontext(SymTab st) { 
+  }
+
+  public void prepInterp(SymTab st) { 
+  }
+
+  public int interpret(int[] in, int[] par) {
+    return(n);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tparlist.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tparlist.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tparlist.java	(revision 25584)
@@ -0,0 +1,54 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for a parameter list.
+ */ 
+class Tparlist implements AST {
+  Tparlist parlist;           // rest of the liste (optional null)
+  Tident ident;               // identifier
+
+  public Tparlist(Tparlist p, Tident i) {
+    parlist=p;
+    ident=i;
+  }
+
+  public Tparlist(Tident i) {
+    parlist=null;
+    ident=i;
+  }
+
+  public String toString() {
+    if (parlist!=null) 
+      return parlist+","+ident;
+    else 
+      return ident.toString();
+  }
+
+  public void setSymtab(SymTab st, boolean isInput, int index) {
+    boolean isNew = st.enter(ident.toString(),
+                             new STEvar(ident.toString(), isInput, index));
+    
+    if (!isNew) Main.error("Variable "+ident+" defined twice!");
+    if (parlist!=null) parlist.setSymtab(st, isInput, index+1);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tprogram.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tprogram.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tprogram.java	(revision 25584)
@@ -0,0 +1,99 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for the whole program (top node).
+ * 
+ * Also contains two symbol tables, one for input variables,
+ * one for function names. 
+ *
+ * All operations like context check, symbol table build up
+ * etc. start here.
+ */ 
+class Tprogram implements AST {
+
+  Tparlist parlist;           // input variables
+  Tdekllist dekllist;         // function declarations 
+  Texplist explist;           // result expressions
+  Texplist arguments;         // input values  
+
+  public Tprogram(Tparlist p, Tdekllist d, Texplist e, Texplist a) {
+    parlist=p;
+    dekllist=d;
+    explist=e;
+    arguments=a;
+  }
+
+  public String toString() {
+    return("Program:\n=============\ninput "+parlist+
+           "\nfunctions\n"+dekllist+"\noutput "+explist+
+           "\narguments "+arguments+"\nend");
+  }
+
+  SymTab inputs;      // table of input variables
+  SymTab functions;   // table of functions
+
+  public void setSymtabs() {          // calculate symbol table entries
+    inputs = new SymTab();            // set input variables
+    parlist.setSymtab(inputs, true, 0);
+    functions = new SymTab(inputs);
+    dekllist.setSymtab(functions);
+  }
+
+  public void printSymtabs() {
+    System.out.print("Input variables-\n"+inputs);
+    System.out.print("Functions-\n"+functions);
+    dekllist.printSymtabs();
+  }
+
+  public void checkcontext() {
+    dekllist.checkcontext();          // CoCo (DefFun,DefVar,Arity)
+                                      // in function bodies
+    explist.checkcontext(functions);  // CoCo (DefFun,DefVar,Arity)
+                                      // in result expressions
+    arguments.checkcontext(new SymTab()); // CoCo  (constants)
+                                          // in arguments
+    if (arguments.length()!=inputs.size())
+      Main.error("Argument list and input variables list differ!");
+  }
+
+  public void prepInterp() {          // set pointers and indices
+    dekllist.prepInterp(functions);
+    explist.prepInterp(functions);
+  }
+  
+  public void interpret() {    
+    int[] inputEnv = new int[inputs.size()];      // set input 
+
+    arguments.interpret(null,null,inputEnv,0);
+
+    System.out.println("Result:\n=============");
+
+    int[] ergebnis = new int[explist.length()];
+    explist.interpret(inputEnv,null,ergebnis,0);  // calculate result
+
+    int i;
+    for (i=explist.length()-1; i > 0; i--)
+      System.out.print(ergebnis[i]+",  ");
+    System.out.println(ergebnis[i]);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tuminus.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tuminus.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/Tuminus.java	(revision 25584)
@@ -0,0 +1,49 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * AST node for unary minus expressions.
+ */ 
+class Tuminus extends Texp implements AST {
+
+  Texp exp;                           // the negated expression
+
+  public Tuminus(Texp e) {
+    exp=e; 
+  }
+
+  public String toString() {
+    return "-"+exp; 
+  }
+
+  public void checkcontext(SymTab st) {
+    exp.checkcontext(st); 
+  }
+
+  public void prepInterp(SymTab st) {  
+    exp.prepInterp(st); 
+  }
+
+  public int interpret(int[] in, int[] par) {
+    return -(exp.interpret(in,par)); 
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/build.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/build.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/build.xml	(revision 25584)
@@ -0,0 +1,38 @@
+<project name="interpreter" default="run">
+
+  <taskdef classname="JFlex.anttask.JFlexTask" name="jflex" />
+  <taskdef classname="java_cup.AntTask" name="cup" />
+
+  <target name="build" depends="realclean,compile" />
+
+  <target name="run" depends="compile">
+    <java classname="Main"> <arg line="example.as"/> </java>
+  </target>
+
+  <target name="compile" depends="jflex,cup">
+    <javac srcdir="." destdir="." />
+  </target>
+
+  <target name="jflex">
+    <jflex file="scanner.flex" />
+  </target>
+
+  <target name="cup">
+    <cup file="parser.cup" interface="yes" dir="."/>
+  </target>
+
+  <target name="genclean">
+    <delete file="Yylex.java"/>
+    <delete file="sym.java" />
+    <delete file="parser.java" />
+  </target>
+
+  <target name="clean">
+    <delete>
+      <fileset dir="." includes="**/*~"/>
+      <fileset dir="." includes="**/*.class"/>
+    </delete>
+  </target>
+
+  <target name="realclean" depends="clean,genclean" />
+</project>
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/example.as
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/example.as	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/example.as	(revision 25584)
@@ -0,0 +1,16 @@
+
+// example program for interpreter testing 
+// contains division and modulo functins 
+
+input a,b
+functions div(x,y) = if x < y
+                     then 0
+                     else div(x-y,y)+1
+                     fi,
+          mod(x,y) = if x < y
+                     then x
+                     else mod(x-y,y)
+                     fi
+output div(a,b), mod(a,b)
+arguments 324, 17
+end
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/parser.cup
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/parser.cup	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/parser.cup	(revision 25584)
@@ -0,0 +1,112 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+// definition of tokens, if applicable with token type 
+terminal INPUT, FUNCTIONS, OUTPUT, END, ARGUMENTS;
+terminal IF, THEN, ELSE, FI, ERROR;
+terminal COMMA, LPAR, RPAR;
+terminal EQ, LE, LEQ, MINUS, PLUS, TIMES, DIV, UMINUS;
+
+terminal String ID, NUMBER;
+
+non terminal Tprogram  program;
+non terminal Tparlist  parlist;
+non terminal Texplist  explist;
+non terminal Tdekllist dekllist;
+non terminal Tdekl     dekl;
+non terminal Texp      exp;
+non terminal Tboolexp  boolexp;
+non terminal Tident    ident;
+non terminal Tnumber   number;
+
+
+// precedences, left associativity
+precedence left EQ, LE, LEQ;
+precedence left MINUS, PLUS;
+precedence left TIMES, DIV;
+precedence left UMINUS;
+
+
+// here the rules start 
+program       ::= INPUT parlist:p FUNCTIONS dekllist:d OUTPUT explist:o
+                                        ARGUMENTS explist:a END
+                  {: RESULT = new Tprogram(p,d,o,a); :}
+                ;
+
+parlist       ::= ident:i
+                  {: RESULT = new Tparlist(i); :}
+                | parlist:p COMMA ident:i
+                  {: RESULT = new Tparlist(p,i); :}
+                ;
+
+explist       ::= exp:e
+                  {: RESULT = new Texplist(e); :}
+                | explist:l COMMA exp:e
+                  {: RESULT = new Texplist(l,e); :}
+                ;
+
+dekllist      ::= dekl:d
+                  {: RESULT = new Tdekllist(d);:}
+                | dekllist:l COMMA dekl:d
+                  {: RESULT = new Tdekllist(l,d); :}
+                ;
+
+dekl          ::= ident:i LPAR parlist:p RPAR EQ exp:e
+                  {: RESULT = new Tdekl(i,p,e); :}
+                ;
+
+exp           ::= number:n
+                  {: RESULT = n; :}
+                | ident:i
+                  {: RESULT = i; :}
+                | ident:i LPAR explist:e RPAR
+                  {: RESULT = new Tfun(i,e); :}
+                | LPAR exp:e RPAR
+                  {: RESULT = e; :}
+                | MINUS exp:e                
+                  {: RESULT = new Tuminus(e); :} %prec UMINUS
+                | exp:l PLUS exp:r
+                  {: RESULT = new Texpinfix(l,'+',r); :}
+                | exp:l TIMES exp:r
+                  {: RESULT = new Texpinfix(l,'*',r); :}
+                | exp:l DIV exp:r
+                  {: RESULT = new Texpinfix(l,'/',r); :}
+                | exp:l MINUS exp:r
+                  {: RESULT = new Texpinfix(l,'-',r); :}
+                | IF boolexp:b THEN exp:t ELSE exp:e FI
+                  {: RESULT = new Tifthenelse(b,t,e); :}
+                ;
+
+boolexp       ::= exp:l EQ exp:r
+                  {: RESULT = new Tboolexp(l,'=',r); :}
+                | exp:l LE exp:r
+                  {: RESULT = new Tboolexp(l,'<',r); :}
+                | exp:l LEQ exp:r
+                  {: RESULT = new Tboolexp(l,'!',r); :}
+                ;
+
+ident         ::= ID:n
+                  {: RESULT = new Tident(n); :}
+                ;
+
+number        ::= NUMBER:z
+                  {: RESULT = new Tnumber(z); :}
+                ;
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/scanner.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/scanner.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/interpreter/scanner.flex	(revision 25584)
@@ -0,0 +1,71 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2001       Gerwin Klein <lsf@jflex.de>                    *
+ * Copyright (C) 2001       Bernhard Rumpe <rumpe@in.tum.de>               *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+import java_cup.runtime.Symbol;
+
+%%
+
+%cup
+%implements sym
+
+%{ 
+  SymTab symtab;          // externe symbol table
+
+  public void setSymtab(SymTab symtab) {
+    this.symtab = symtab; 
+  }
+
+  private Symbol sym(int sym) {
+    return new Symbol(sym);
+  }
+
+  private Symbol sym(int sym, Object val) {
+    return new Symbol(sym, val);
+  }
+%}
+
+%%
+
+"arguments"     { return sym(ARGUMENTS); }
+"input"         { return sym(INPUT); }
+"functions"     { return sym(FUNCTIONS); }
+"output"        { return sym(OUTPUT); }
+"end"           { return sym(END); }
+"if"            { return sym(IF); }
+"then"          { return sym(THEN); }
+"else"          { return sym(ELSE); }
+"fi"            { return sym(FI); }
+[a-z]+          { symtab.enter(yytext(),new SymtabEntry(yytext()));
+                  return sym(ID,yytext()); }
+[0-9]+          { return sym(NUMBER,yytext()); }
+","             { return sym(COMMA); }
+"("             { return sym(LPAR); }
+")"             { return sym(RPAR); }
+"="             { return sym(EQ); }
+"-"             { return sym(MINUS); }
+"+"             { return sym(PLUS); }
+"*"             { return sym(TIMES); }
+"/"             { return sym(DIV); }
+"<"             { return sym(LE); }
+"<="            { return sym(LEQ); }
+[\ \t\b\f\r\n]+ { /* eat whitespace */ }
+"//"[^\n]*      { /* one-line comment */ }
+.               { throw new Error("Unexpected character ["+yytext()+"]"); }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/JavaParser.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/JavaParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/JavaParser.java	(revision 25584)
@@ -0,0 +1,47 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+import java.io.*;
+
+
+/**
+ * Simple test driver for the java parser. Just runs it on some
+ * input files, gives no useful output.
+ */
+public class JavaParser {
+
+  public static void main(String argv[]) {
+
+    for (int i = 0; i < argv.length; i++) {
+      try {
+        System.out.println("Parsing ["+argv[i]+"]");
+        Scanner s = new Scanner(new UnicodeEscapes(new FileReader(argv[i])));
+        parser p = new parser(s);
+        p.parse();
+        
+        System.out.println("No errors.");
+      }
+      catch (Exception e) {
+        e.printStackTrace(System.out);
+        System.exit(1);
+      }
+    }
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/JavaSymbol.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/JavaSymbol.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/JavaSymbol.java	(revision 25584)
@@ -0,0 +1,31 @@
+
+public class JavaSymbol extends java_cup.runtime.Symbol {
+  private int line;
+  private int column;
+
+  public JavaSymbol(int type, int line, int column) {
+    this(type, line, column, -1, -1, null);
+  }
+
+  public JavaSymbol(int type, int line, int column, Object value) {
+    this(type, line, column, -1, -1, value);
+  }
+
+  public JavaSymbol(int type, int line, int column, int left, int right, Object value) {
+    super(type, left, right, value);
+    this.line = line;
+    this.column = column;
+  }
+
+  public int getLine() {
+    return line;
+  }
+
+  public int getColumn() {
+    return column;
+  }
+
+  public String toString() {   
+    return "line "+line+", column "+column+", sym: "+sym+(value == null ? "" : (", value: '"+value+"'"));
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/Makefile
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/Makefile	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/Makefile	(revision 25584)
@@ -0,0 +1,48 @@
+# You need CUP v0.10j (or newer) for this makefile to work (for java12.cup)
+#
+# CUP classes should be included in CLASSPATH 
+
+CUP        = java java_cup.Main -interface <
+JFLEX      = jflex
+JAVA       = java
+JAVAC      = javac
+#JAVAC      = jikes 
+JAVACFLAGS = 
+
+# --------------------------------------------------
+
+all: test
+
+test: lexer-output.txt
+	@(diff lexer-output.txt lexer-output.good && echo "Test OK!") || echo "Test failed!"
+
+lexer-output.txt: compile
+	$(JAVA) TestLexer TestLexer.java > lexer-output.txt
+
+
+compile: scanner parser unicode
+	$(JAVAC) $(JAVACFLAGS) JavaParser.java TestLexer.java
+
+parser: parser.java 
+
+parser.java: java12.cup
+	$(CUP) java12.cup
+
+scanner: Scanner.java
+
+Scanner.java: java.flex
+	$(JFLEX) java.flex
+
+unicode: UnicodeEscapes.java
+
+UnicodeEscapes.java: unicode.flex
+	$(JFLEX) unicode.flex
+
+clean:
+	rm -f *.class
+	rm -f *~
+	rm -f Scanner.java
+	rm -f parser.java
+	rm -f sym.java
+	rm -f UnicodeEscapes.java
+	rm -f lexer-output.txt
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/README	(revision 25584)
@@ -0,0 +1,41 @@
+This directory contains a scanner and parser for the Java programming language.
+
+You need the parser generator CUP v0.10j (or newer) for the parser to work.
+Use the Makefile to generate the lexer and parser, or type:
+
+jflex unicode.flex
+jflex java.flex
+java java_cup.Main -interface < java12.cup
+javac JavaParser.java TestLexer.java
+
+
+The parser can be tested with:
+java JavaParser <inputfiles>
+
+The scanner (without parser attached) can be test with:
+java TestLexer <inputfiles>
+
+
+files:
+
+unicode.flex
+  JFlex specification for the Unicode preprocessing phase
+  (see section 3.3 of the Java Language Specification).
+  Demonstrates how to implement a FilterReader with JFlex.
+
+java.flex
+  JFlex specification for the "real" Java 1.2 lexer.
+
+java12.cup
+  CUP specification for the Java 1.2 parser
+  Copyright (C) 1998 by C. Scott Ananian <cananian@alumni.princeton.edu>
+  (with small modifications to interface with the Lexer)
+
+JavaParser.java
+  a simple main class to run the parser (no other useful output though)
+
+TestLexer.java
+  a simple test driver for the scanner, produces debug output
+
+lexer-output.good
+  lexer output for input file TestLexer.java for testing
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/TestLexer.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/TestLexer.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/TestLexer.java	(revision 25584)
@@ -0,0 +1,61 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 2004-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+import java.io.*;
+import java_cup.runtime.Symbol;
+
+
+/**
+ * Simple test driver for the java lexer. Just runs it on some
+ * input files and produces debug output. Needs symbol class from
+ * parser. 
+ */
+public class TestLexer {
+
+  /** some numerals to for lexer testing */
+  int intDec = 37;
+  long longDec = 37l;
+  int intHex = 0x0001;
+  long longHex = 0xFFFFl;
+  int intOct = 0377;
+  long longOc = 007l;
+  int smallest = -2147483648;   
+
+  public static void main(String argv[]) {
+
+    for (int i = 0; i < argv.length; i++) {
+      try {
+        System.out.println("Lexing ["+argv[i]+"]");
+        Scanner scanner = new Scanner(new UnicodeEscapes(new FileReader(argv[i])));
+                
+        Symbol s;
+        do {
+          s = scanner.debug_next_token();
+          System.out.println("token: "+s);
+        } while (s.sym != sym.EOF);
+        
+        System.out.println("No errors.");
+      }
+      catch (Exception e) {
+        e.printStackTrace(System.out);
+        System.exit(1);
+      }
+    }
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/build.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/build.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/build.xml	(revision 25584)
@@ -0,0 +1,46 @@
+<project name="java scanner" default="run">
+
+  <taskdef classname="JFlex.anttask.JFlexTask" name="jflex" />
+  <taskdef classname="java_cup.AntTask" name="cup" />
+
+  <target name="build" depends="realclean,compile" />
+
+  <target name="run" depends="compile">
+    <java classname="JavaParser"> 
+      <arg line="JavaParser.java"/> 
+      <arg line="JavaSymbol.java"/> 
+      <arg line="UnicodeEscapes.java"/> 
+      <arg line="parser.java"/> 
+      <arg line="sym.java"/> 
+      <arg line="Scanner.java"/> 
+    </java>
+  </target>
+
+  <target name="compile" depends="scanner,unicode,cup">
+    <javac srcdir="." destdir="." />
+  </target>
+
+  <target name="scanner"> <jflex file="java.flex"/> </target>
+
+  <target name="unicode"> <jflex file="unicode.flex"/> </target>
+
+  <target name="cup">
+    <cup file="java12.cup" interface="yes" dir="."/>
+  </target>
+
+  <target name="genclean">
+    <delete file="Scanner.java"/>
+    <delete file="UnicodeEscapes.java"/>
+    <delete file="sym.java" />
+    <delete file="parser.java" />
+  </target>
+
+  <target name="clean">
+    <delete>
+      <fileset dir="." includes="**/*~"/>
+      <fileset dir="." includes="**/*.class"/>
+    </delete>
+  </target>
+
+  <target name="realclean" depends="clean,genclean" />
+</project>
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/java.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/java.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/java.flex	(revision 25584)
@@ -0,0 +1,316 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Java 1.2 language lexer specification */
+
+/* Use together with unicode.flex for Unicode preprocesssing */
+/* and java12.cup for a Java 1.2 parser                      */
+
+/* Note that this lexer specification is not tuned for speed.
+   It is in fact quite slow on integer and floating point literals, 
+   because the input is read twice and the methods used to parse
+   the numbers are not very fast. 
+   For a production quality application (e.g. a Java compiler) 
+   this could be optimized */
+
+
+import java_cup.runtime.*;
+
+%%
+
+%public
+%class Scanner
+%implements sym
+
+%unicode
+
+%line
+%column
+
+%cup
+%cupdebug
+
+%{
+  StringBuffer string = new StringBuffer();
+  
+  private Symbol symbol(int type) {
+    return new JavaSymbol(type, yyline+1, yycolumn+1);
+  }
+
+  private Symbol symbol(int type, Object value) {
+    return new JavaSymbol(type, yyline+1, yycolumn+1, value);
+  }
+
+  /** 
+   * assumes correct representation of a long value for 
+   * specified radix in scanner buffer from <code>start</code> 
+   * to <code>end</code> 
+   */
+  private long parseLong(int start, int end, int radix) {
+    long result = 0;
+    long digit;
+
+    for (int i = start; i < end; i++) {
+      digit  = Character.digit(yycharat(i),radix);
+      result*= radix;
+      result+= digit;
+    }
+
+    return result;
+  }
+%}
+
+/* main character classes */
+LineTerminator = \r|\n|\r\n
+InputCharacter = [^\r\n]
+
+WhiteSpace = {LineTerminator} | [ \t\f]
+
+/* comments */
+Comment = {TraditionalComment} | {EndOfLineComment} | 
+          {DocumentationComment}
+
+TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/"
+EndOfLineComment = "//" {InputCharacter}* {LineTerminator}?
+DocumentationComment = "/*" "*"+ [^/*] ~"*/"
+
+/* identifiers */
+Identifier = [:jletter:][:jletterdigit:]*
+
+/* integer literals */
+DecIntegerLiteral = 0 | [1-9][0-9]*
+DecLongLiteral    = {DecIntegerLiteral} [lL]
+
+HexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8}
+HexLongLiteral    = 0 [xX] 0* {HexDigit} {1,16} [lL]
+HexDigit          = [0-9a-fA-F]
+
+OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15}
+OctLongLiteral    = 0+ 1? {OctDigit} {1,21} [lL]
+OctDigit          = [0-7]
+    
+/* floating point literals */        
+FloatLiteral  = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? [fF]
+DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}?
+
+FLit1    = [0-9]+ \. [0-9]* 
+FLit2    = \. [0-9]+ 
+FLit3    = [0-9]+ 
+Exponent = [eE] [+-]? [0-9]+
+
+/* string and character literals */
+StringCharacter = [^\r\n\"\\]
+SingleCharacter = [^\r\n\'\\]
+
+%state STRING, CHARLITERAL
+
+%%
+
+<YYINITIAL> {
+
+  /* keywords */
+  "abstract"                     { return symbol(ABSTRACT); }
+  "boolean"                      { return symbol(BOOLEAN); }
+  "break"                        { return symbol(BREAK); }
+  "byte"                         { return symbol(BYTE); }
+  "case"                         { return symbol(CASE); }
+  "catch"                        { return symbol(CATCH); }
+  "char"                         { return symbol(CHAR); }
+  "class"                        { return symbol(CLASS); }
+  "const"                        { return symbol(CONST); }
+  "continue"                     { return symbol(CONTINUE); }
+  "do"                           { return symbol(DO); }
+  "double"                       { return symbol(DOUBLE); }
+  "else"                         { return symbol(ELSE); }
+  "extends"                      { return symbol(EXTENDS); }
+  "final"                        { return symbol(FINAL); }
+  "finally"                      { return symbol(FINALLY); }
+  "float"                        { return symbol(FLOAT); }
+  "for"                          { return symbol(FOR); }
+  "default"                      { return symbol(DEFAULT); }
+  "implements"                   { return symbol(IMPLEMENTS); }
+  "import"                       { return symbol(IMPORT); }
+  "instanceof"                   { return symbol(INSTANCEOF); }
+  "int"                          { return symbol(INT); }
+  "interface"                    { return symbol(INTERFACE); }
+  "long"                         { return symbol(LONG); }
+  "native"                       { return symbol(NATIVE); }
+  "new"                          { return symbol(NEW); }
+  "goto"                         { return symbol(GOTO); }
+  "if"                           { return symbol(IF); }
+  "public"                       { return symbol(PUBLIC); }
+  "short"                        { return symbol(SHORT); }
+  "super"                        { return symbol(SUPER); }
+  "switch"                       { return symbol(SWITCH); }
+  "synchronized"                 { return symbol(SYNCHRONIZED); }
+  "package"                      { return symbol(PACKAGE); }
+  "private"                      { return symbol(PRIVATE); }
+  "protected"                    { return symbol(PROTECTED); }
+  "transient"                    { return symbol(TRANSIENT); }
+  "return"                       { return symbol(RETURN); }
+  "void"                         { return symbol(VOID); }
+  "static"                       { return symbol(STATIC); }
+  "while"                        { return symbol(WHILE); }
+  "this"                         { return symbol(THIS); }
+  "throw"                        { return symbol(THROW); }
+  "throws"                       { return symbol(THROWS); }
+  "try"                          { return symbol(TRY); }
+  "volatile"                     { return symbol(VOLATILE); }
+  "strictfp"                     { return symbol(STRICTFP); }
+  
+  /* boolean literals */
+  "true"                         { return symbol(BOOLEAN_LITERAL, new Boolean(true)); }
+  "false"                        { return symbol(BOOLEAN_LITERAL, new Boolean(false)); }
+  
+  /* null literal */
+  "null"                         { return symbol(NULL_LITERAL); }
+  
+  
+  /* separators */
+  "("                            { return symbol(LPAREN); }
+  ")"                            { return symbol(RPAREN); }
+  "{"                            { return symbol(LBRACE); }
+  "}"                            { return symbol(RBRACE); }
+  "["                            { return symbol(LBRACK); }
+  "]"                            { return symbol(RBRACK); }
+  ";"                            { return symbol(SEMICOLON); }
+  ","                            { return symbol(COMMA); }
+  "."                            { return symbol(DOT); }
+  
+  /* operators */
+  "="                            { return symbol(EQ); }
+  ">"                            { return symbol(GT); }
+  "<"                            { return symbol(LT); }
+  "!"                            { return symbol(NOT); }
+  "~"                            { return symbol(COMP); }
+  "?"                            { return symbol(QUESTION); }
+  ":"                            { return symbol(COLON); }
+  "=="                           { return symbol(EQEQ); }
+  "<="                           { return symbol(LTEQ); }
+  ">="                           { return symbol(GTEQ); }
+  "!="                           { return symbol(NOTEQ); }
+  "&&"                           { return symbol(ANDAND); }
+  "||"                           { return symbol(OROR); }
+  "++"                           { return symbol(PLUSPLUS); }
+  "--"                           { return symbol(MINUSMINUS); }
+  "+"                            { return symbol(PLUS); }
+  "-"                            { return symbol(MINUS); }
+  "*"                            { return symbol(MULT); }
+  "/"                            { return symbol(DIV); }
+  "&"                            { return symbol(AND); }
+  "|"                            { return symbol(OR); }
+  "^"                            { return symbol(XOR); }
+  "%"                            { return symbol(MOD); }
+  "<<"                           { return symbol(LSHIFT); }
+  ">>"                           { return symbol(RSHIFT); }
+  ">>>"                          { return symbol(URSHIFT); }
+  "+="                           { return symbol(PLUSEQ); }
+  "-="                           { return symbol(MINUSEQ); }
+  "*="                           { return symbol(MULTEQ); }
+  "/="                           { return symbol(DIVEQ); }
+  "&="                           { return symbol(ANDEQ); }
+  "|="                           { return symbol(OREQ); }
+  "^="                           { return symbol(XOREQ); }
+  "%="                           { return symbol(MODEQ); }
+  "<<="                          { return symbol(LSHIFTEQ); }
+  ">>="                          { return symbol(RSHIFTEQ); }
+  ">>>="                         { return symbol(URSHIFTEQ); }
+  
+  /* string literal */
+  \"                             { yybegin(STRING); string.setLength(0); }
+
+  /* character literal */
+  \'                             { yybegin(CHARLITERAL); }
+
+  /* numeric literals */
+
+  /* This is matched together with the minus, because the number is too big to 
+     be represented by a positive integer. */
+  "-2147483648"                  { return symbol(INTEGER_LITERAL, new Integer(Integer.MIN_VALUE)); }
+  
+  {DecIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer(yytext())); }
+  {DecLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(yytext().substring(0,yylength()-1))); }
+  
+  {HexIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(2, yylength(), 16))); }
+  {HexLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(parseLong(2, yylength()-1, 16))); }
+ 
+  {OctIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(0, yylength(), 8))); }  
+  {OctLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(parseLong(0, yylength()-1, 8))); }
+  
+  {FloatLiteral}                 { return symbol(FLOATING_POINT_LITERAL, new Float(yytext().substring(0,yylength()-1))); }
+  {DoubleLiteral}                { return symbol(FLOATING_POINT_LITERAL, new Double(yytext())); }
+  {DoubleLiteral}[dD]            { return symbol(FLOATING_POINT_LITERAL, new Double(yytext().substring(0,yylength()-1))); }
+  
+  /* comments */
+  {Comment}                      { /* ignore */ }
+
+  /* whitespace */
+  {WhiteSpace}                   { /* ignore */ }
+
+  /* identifiers */ 
+  {Identifier}                   { return symbol(IDENTIFIER, yytext()); }  
+}
+
+<STRING> {
+  \"                             { yybegin(YYINITIAL); return symbol(STRING_LITERAL, string.toString()); }
+  
+  {StringCharacter}+             { string.append( yytext() ); }
+  
+  /* escape sequences */
+  "\\b"                          { string.append( '\b' ); }
+  "\\t"                          { string.append( '\t' ); }
+  "\\n"                          { string.append( '\n' ); }
+  "\\f"                          { string.append( '\f' ); }
+  "\\r"                          { string.append( '\r' ); }
+  "\\\""                         { string.append( '\"' ); }
+  "\\'"                          { string.append( '\'' ); }
+  "\\\\"                         { string.append( '\\' ); }
+  \\[0-3]?{OctDigit}?{OctDigit}  { char val = (char) Integer.parseInt(yytext().substring(1),8);
+                        				   string.append( val ); }
+  
+  /* error cases */
+  \\.                            { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); }
+  {LineTerminator}               { throw new RuntimeException("Unterminated string at end of line"); }
+}
+
+<CHARLITERAL> {
+  {SingleCharacter}\'            { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character(yytext().charAt(0))); }
+  
+  /* escape sequences */
+  "\\b"\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\b'));}
+  "\\t"\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\t'));}
+  "\\n"\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\n'));}
+  "\\f"\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\f'));}
+  "\\r"\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\r'));}
+  "\\\""\'                       { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\"'));}
+  "\\'"\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\''));}
+  "\\\\"\'                       { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\\')); }
+  \\[0-3]?{OctDigit}?{OctDigit}\' { yybegin(YYINITIAL); 
+			                              int val = Integer.parseInt(yytext().substring(1,yylength()-1),8);
+			                            return symbol(CHARACTER_LITERAL, new Character((char)val)); }
+  
+  /* error cases */
+  \\.                            { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); }
+  {LineTerminator}               { throw new RuntimeException("Unterminated character literal at end of line"); }
+}
+
+/* error fallback */
+.|\n                             { throw new RuntimeException("Illegal character \""+yytext()+
+                                                              "\" at line "+yyline+", column "+yycolumn); }
+<<EOF>>                          { return symbol(EOF); }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/java12.cup
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/java12.cup	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/java12.cup	(revision 25584)
@@ -0,0 +1,885 @@
+import java_cup.runtime.*;
+
+
+/* August 1999 - modified by Gerwin Klein <lsf@jflex.de>
+                 to interface with JFlex scanners,
+                 allows empty semicolon in class decls.
+  
+  changed productions:
+
+  class_member_declaration ::=
+	  	field_declaration
+  	|	method_declaration
+    [..]
+  	|	interface_declaration
+    | SEMICOLON
+  	;
+
+  interface_member_declaration ::=
+  		constant_declaration
+	  |	abstract_method_declaration
+  	|	class_declaration
+  	|	interface_declaration
+    | SEMICOLON
+	  ;
+
+*/
+
+
+/* Java 1.2 parser for CUP.  
+ * Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
+ * This program is released under the terms of the GPL; see the file
+ * COPYING for more details.  There is NO WARRANTY on this code.
+ */
+
+/*
+JDK 1.2 Features added:
+  strictfp modifier.
+  explicit_constructor_invocation ::= ...
+        | primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON ;
+  field_access ::= ...
+        |       name DOT SUPER DOT IDENTIFIER ;
+  method_invocation ::= ...
+        |       name DOT SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN ;
+*/
+
+parser code  {: 
+  public void report_error(String message, Object info) {
+    StringBuffer m = new StringBuffer("Error ");
+
+    if (info instanceof java_cup.runtime.Symbol) 
+      m.append( "("+info.toString()+")" );
+     
+    m.append(" : "+message);
+   
+    System.out.println(m);
+  }
+   
+  public void report_fatal_error(String message, Object info) {
+    report_error(message, info);
+    throw new RuntimeException("Fatal Syntax Error");
+  }
+:};
+
+terminal BOOLEAN; // primitive_type
+terminal BYTE, SHORT, INT, LONG, CHAR; // integral_type
+terminal FLOAT, DOUBLE; // floating_point_type
+terminal LBRACK, RBRACK; // array_type
+terminal DOT; // qualified_name
+terminal SEMICOLON, MULT, COMMA, LBRACE, RBRACE, EQ, LPAREN, RPAREN, COLON;
+terminal PACKAGE; // package_declaration
+terminal IMPORT; // import_declaration
+terminal PUBLIC, PROTECTED, PRIVATE; // modifier
+terminal STATIC; // modifier
+terminal ABSTRACT, FINAL, NATIVE, SYNCHRONIZED, TRANSIENT, VOLATILE;
+terminal CLASS; // class_declaration
+terminal EXTENDS; // super
+terminal IMPLEMENTS; // interfaces
+terminal VOID; // method_header
+terminal THROWS; // throws
+terminal THIS, SUPER; // explicit_constructor_invocation
+terminal INTERFACE; // interface_declaration
+terminal IF, ELSE; // if_then_statement, if_then_else_statement
+terminal SWITCH; // switch_statement
+terminal CASE, DEFAULT; // switch_label
+terminal DO, WHILE; // while_statement, do_statement
+terminal FOR; // for_statement
+terminal BREAK; // break_statement
+terminal CONTINUE; // continue_statement
+terminal RETURN; // return_statement
+terminal THROW; // throw_statement
+terminal TRY; // try_statement
+terminal CATCH; // catch_clause
+terminal FINALLY; // finally
+terminal NEW; // class_instance_creation_expression
+terminal PLUSPLUS; // postincrement_expression
+terminal MINUSMINUS; // postdecrement_expression
+terminal PLUS, MINUS, COMP, NOT, DIV, MOD;
+terminal LSHIFT, RSHIFT, URSHIFT; // shift_expression
+terminal LT, GT, LTEQ, GTEQ, INSTANCEOF; // relational_expression
+terminal EQEQ, NOTEQ; // equality_expression
+terminal AND; // and_expression
+terminal XOR; // exclusive_or_expression
+terminal OR;  // inclusive_or_expression
+terminal ANDAND; // conditional_and_expression
+terminal OROR; // conditional_or_expression
+terminal QUESTION; // conditional_expression
+terminal MULTEQ, DIVEQ, MODEQ, PLUSEQ, MINUSEQ; // assignment_operator
+terminal LSHIFTEQ, RSHIFTEQ, URSHIFTEQ; // assignment_operator
+terminal ANDEQ, XOREQ, OREQ; // assignment_operator
+
+terminal java.lang.Number INTEGER_LITERAL;
+terminal java.lang.Number FLOATING_POINT_LITERAL;
+terminal java.lang.Boolean BOOLEAN_LITERAL;
+terminal java.lang.Character CHARACTER_LITERAL;
+terminal java.lang.String STRING_LITERAL;
+terminal java.lang.String IDENTIFIER; // name
+terminal NULL_LITERAL;
+
+// strictfp keyword, new in Java 1.2
+terminal STRICTFP;
+
+// Reserved but unused:
+terminal CONST, GOTO;
+
+// 19.2) The Syntactic Grammar
+non terminal goal;
+// 19.3) Lexical Structure
+non terminal literal;
+// 19.4) Types, Values, and Variables
+non terminal type, primitive_type, numeric_type;
+non terminal integral_type, floating_point_type;
+non terminal reference_type;
+non terminal class_or_interface_type;
+non terminal class_type, interface_type;
+non terminal array_type;
+// 19.5) Names
+non terminal name, simple_name, qualified_name;
+// 19.6) Packages
+non terminal compilation_unit;
+non terminal package_declaration_opt, package_declaration;
+non terminal import_declarations_opt, import_declarations;
+non terminal type_declarations_opt, type_declarations;
+non terminal import_declaration;
+non terminal single_type_import_declaration;
+non terminal type_import_on_demand_declaration;
+non terminal type_declaration;
+// 19.7) Productions used only in the LALR(1) grammar
+non terminal modifiers_opt, modifiers, modifier;
+// 19.8.1) Class Declaration
+non terminal class_declaration, super_cl, super_opt;
+non terminal interfaces, interfaces_opt, interface_type_list;
+non terminal class_body;
+non terminal class_body_declarations, class_body_declarations_opt;
+non terminal class_body_declaration, class_member_declaration;
+// 19.8.2) Field Declarations
+non terminal field_declaration, variable_declarators, variable_declarator;
+non terminal variable_declarator_id, variable_initializer;
+// 19.8.3) Method Declarations
+non terminal method_declaration, method_header, method_declarator;
+non terminal formal_parameter_list_opt, formal_parameter_list;
+non terminal formal_parameter;
+non terminal throws_opt, throws;
+non terminal class_type_list, method_body;
+// 19.8.4) Static Initializers
+non terminal static_initializer;
+// 19.8.5) Constructor Declarations
+non terminal constructor_declaration, constructor_declarator;
+non terminal constructor_body;
+non terminal explicit_constructor_invocation;
+// 19.9.1) Interface Declarations
+non terminal interface_declaration;
+non terminal extends_interfaces_opt, extends_interfaces;
+non terminal interface_body;
+non terminal interface_member_declarations_opt, interface_member_declarations;
+non terminal interface_member_declaration, constant_declaration;
+non terminal abstract_method_declaration;
+// 19.10) Arrays
+non terminal array_initializer;
+non terminal variable_initializers;
+// 19.11) Blocks and Statements
+non terminal block;
+non terminal block_statements_opt, block_statements, block_statement;
+non terminal local_variable_declaration_statement, local_variable_declaration;
+non terminal statement, statement_no_short_if;
+non terminal statement_without_trailing_substatement;
+non terminal empty_statement;
+non terminal labeled_statement, labeled_statement_no_short_if;
+non terminal expression_statement, statement_expression;
+non terminal if_then_statement;
+non terminal if_then_else_statement, if_then_else_statement_no_short_if;
+non terminal switch_statement, switch_block;
+non terminal switch_block_statement_groups;
+non terminal switch_block_statement_group;
+non terminal switch_labels, switch_label;
+non terminal while_statement, while_statement_no_short_if;
+non terminal do_statement;
+non terminal for_statement, for_statement_no_short_if;
+non terminal for_init_opt, for_init;
+non terminal for_update_opt, for_update;
+non terminal statement_expression_list;
+non terminal identifier_opt;
+non terminal break_statement, continue_statement;
+non terminal return_statement, throw_statement;
+non terminal synchronized_statement, try_statement;
+non terminal catches_opt, catches, catch_clause;
+non terminal finally;
+// 19.12) Expressions
+non terminal primary, primary_no_new_array;
+non terminal class_instance_creation_expression;
+non terminal argument_list_opt, argument_list;
+non terminal array_creation_expression;
+non terminal dim_exprs, dim_expr, dims_opt, dims;
+non terminal field_access, method_invocation, array_access;
+non terminal postfix_expression;
+non terminal postincrement_expression, postdecrement_expression;
+non terminal unary_expression, unary_expression_not_plus_minus;
+non terminal preincrement_expression, predecrement_expression;
+non terminal cast_expression;
+non terminal multiplicative_expression, additive_expression;
+non terminal shift_expression, relational_expression, equality_expression;
+non terminal and_expression, exclusive_or_expression, inclusive_or_expression;
+non terminal conditional_and_expression, conditional_or_expression;
+non terminal conditional_expression, assignment_expression;
+non terminal assignment;
+non terminal left_hand_side;
+non terminal assignment_operator;
+non terminal expression_opt, expression;
+non terminal constant_expression;
+
+
+start with goal;
+
+// 19.2) The Syntactic Grammar
+goal ::=	compilation_unit
+	;
+
+// 19.3) Lexical Structure.
+literal ::=	INTEGER_LITERAL
+	|	FLOATING_POINT_LITERAL
+	|	BOOLEAN_LITERAL
+	|	CHARACTER_LITERAL
+	|	STRING_LITERAL
+	|	NULL_LITERAL
+	;
+
+// 19.4) Types, Values, and Variables
+type	::=	primitive_type
+	|	reference_type
+	;
+primitive_type ::=
+		numeric_type
+	|	BOOLEAN
+	;
+numeric_type::=	integral_type
+	|	floating_point_type
+	;
+integral_type ::= 
+		BYTE 
+	|	SHORT 
+	|	INT 
+	|	LONG 
+	|	CHAR 
+	;
+floating_point_type ::= 
+		FLOAT 
+	|	DOUBLE
+	;
+
+reference_type ::=
+		class_or_interface_type
+	|	array_type
+	;
+class_or_interface_type ::= name;
+
+class_type ::=	class_or_interface_type;
+interface_type ::= class_or_interface_type;		
+
+array_type ::=	primitive_type dims
+	|	name dims
+	;
+
+// 19.5) Names
+name	::=	simple_name
+	|	qualified_name
+	;
+simple_name ::=	IDENTIFIER
+	;
+qualified_name ::=
+		name DOT IDENTIFIER
+	;
+
+// 19.6) Packages
+compilation_unit ::=
+		package_declaration_opt 
+		import_declarations_opt
+		type_declarations_opt
+		;
+package_declaration_opt ::= package_declaration | ;
+import_declarations_opt ::= import_declarations | ;
+type_declarations_opt   ::= type_declarations   | ;
+
+import_declarations ::= 
+		import_declaration
+	|	import_declarations import_declaration
+	;
+type_declarations ::= 
+		type_declaration
+	|	type_declarations type_declaration
+	;
+package_declaration ::= 
+		PACKAGE name SEMICOLON
+	;
+import_declaration ::= 
+		single_type_import_declaration
+	|	type_import_on_demand_declaration
+	;
+single_type_import_declaration ::= 
+		IMPORT name SEMICOLON
+	;
+type_import_on_demand_declaration ::=
+		IMPORT name DOT MULT SEMICOLON
+	;
+type_declaration ::=
+		class_declaration
+	|	interface_declaration
+	|	SEMICOLON
+	;
+
+// 19.7) Productions used only in the LALR(1) grammar
+modifiers_opt::=
+	|	modifiers
+	;
+modifiers ::= 	modifier
+	|	modifiers modifier
+	;
+modifier ::=	PUBLIC | PROTECTED | PRIVATE
+	|	STATIC
+	|	ABSTRACT | FINAL | NATIVE | SYNCHRONIZED | TRANSIENT | VOLATILE
+	|	STRICTFP // note that semantic analysis must check that the
+	                 // context of the modifier allows strictfp.
+	;
+
+// 19.8) Classes
+
+// 19.8.1) Class Declaration:
+class_declaration ::= 
+	modifiers_opt CLASS IDENTIFIER super_opt interfaces_opt class_body
+	;
+super_cl ::=	EXTENDS class_type
+	;
+super_opt ::=	
+	|	super_cl
+	;
+interfaces ::=	IMPLEMENTS interface_type_list
+	;
+interfaces_opt::=
+	|	interfaces 
+	;
+interface_type_list ::= 
+		interface_type
+	|	interface_type_list COMMA interface_type
+	;
+class_body ::=	LBRACE class_body_declarations_opt RBRACE 
+	;
+class_body_declarations_opt ::= 
+	|	class_body_declarations ;
+class_body_declarations ::= 
+		class_body_declaration
+	|	class_body_declarations class_body_declaration
+	;
+class_body_declaration ::=
+		class_member_declaration
+	|	static_initializer
+	|	constructor_declaration
+	|	block
+	;
+class_member_declaration ::=
+		field_declaration
+	|	method_declaration
+	/* repeat the prod for 'class_declaration' here: */
+	|	modifiers_opt CLASS IDENTIFIER super_opt interfaces_opt class_body
+	|	interface_declaration
+  | SEMICOLON
+	;
+
+// 19.8.2) Field Declarations
+field_declaration ::= 
+		modifiers_opt type variable_declarators SEMICOLON
+	;
+variable_declarators ::=
+		variable_declarator
+	|	variable_declarators COMMA variable_declarator
+	;
+variable_declarator ::=
+		variable_declarator_id
+	|	variable_declarator_id EQ variable_initializer
+	;
+variable_declarator_id ::=
+		IDENTIFIER
+	|	variable_declarator_id LBRACK RBRACK
+	;
+variable_initializer ::=
+		expression
+	|	array_initializer
+	;
+
+// 19.8.3) Method Declarations
+method_declaration ::=
+		method_header method_body
+	;
+method_header ::=
+		modifiers_opt type method_declarator throws_opt
+	|	modifiers_opt VOID method_declarator throws_opt
+	;
+method_declarator ::=
+		IDENTIFIER LPAREN formal_parameter_list_opt RPAREN
+	|	method_declarator LBRACK RBRACK // deprecated
+	// be careful; the above production also allows 'void foo() []'
+	;
+formal_parameter_list_opt ::=
+	|	formal_parameter_list
+	;
+formal_parameter_list ::=
+		formal_parameter
+	|	formal_parameter_list COMMA formal_parameter
+	;
+formal_parameter ::=
+		type variable_declarator_id
+	|	FINAL type variable_declarator_id
+	;
+throws_opt ::=	
+	|	throws
+	;
+throws ::=	THROWS class_type_list
+	;
+class_type_list ::=
+		class_type
+	|	class_type_list COMMA class_type
+	;
+method_body ::=	block
+	|	SEMICOLON
+	;
+
+// 19.8.4) Static Initializers
+static_initializer ::=
+		STATIC block
+	;
+
+// 19.8.5) Constructor Declarations
+constructor_declaration ::=
+		modifiers_opt constructor_declarator throws_opt 
+			constructor_body
+	;
+constructor_declarator ::=
+		simple_name LPAREN formal_parameter_list_opt RPAREN
+	;
+constructor_body ::=
+		LBRACE explicit_constructor_invocation
+			block_statements RBRACE
+	|	LBRACE explicit_constructor_invocation RBRACE
+	|	LBRACE block_statements RBRACE
+	|	LBRACE RBRACE
+	;
+explicit_constructor_invocation ::=
+		THIS LPAREN argument_list_opt RPAREN SEMICOLON
+	|	SUPER LPAREN argument_list_opt RPAREN SEMICOLON
+	|	primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON
+	|	primary DOT SUPER LPAREN argument_list_opt RPAREN SEMICOLON
+	;
+
+// 19.9) Interfaces
+
+// 19.9.1) Interface Declarations
+interface_declaration ::=
+		modifiers_opt INTERFACE IDENTIFIER extends_interfaces_opt 
+			interface_body
+	;
+extends_interfaces_opt ::=
+	|	extends_interfaces
+	;
+extends_interfaces ::=
+		EXTENDS interface_type
+	|	extends_interfaces COMMA interface_type
+	;
+interface_body ::=
+		LBRACE interface_member_declarations_opt RBRACE
+	;
+interface_member_declarations_opt ::=
+	|	interface_member_declarations
+	;
+interface_member_declarations ::=
+		interface_member_declaration
+	|	interface_member_declarations interface_member_declaration
+	;
+interface_member_declaration ::=
+		constant_declaration
+	|	abstract_method_declaration
+	|	class_declaration
+	|	interface_declaration
+  | SEMICOLON
+	;
+constant_declaration ::=
+		field_declaration
+	;
+abstract_method_declaration ::=
+		method_header SEMICOLON
+	;
+
+// 19.10) Arrays
+array_initializer ::=
+		LBRACE variable_initializers COMMA RBRACE
+	|	LBRACE variable_initializers RBRACE
+	|	LBRACE COMMA RBRACE
+	|	LBRACE RBRACE
+	;
+variable_initializers ::=
+		variable_initializer
+	|	variable_initializers COMMA variable_initializer
+	;
+
+// 19.11) Blocks and Statements
+block ::=	LBRACE block_statements_opt RBRACE
+	;
+block_statements_opt ::=
+	|	block_statements
+	;
+block_statements ::=
+		block_statement
+	|	block_statements block_statement
+	;
+block_statement ::=
+		local_variable_declaration_statement
+	|	statement
+	|	class_declaration
+	|	interface_declaration
+	;
+local_variable_declaration_statement ::=
+		local_variable_declaration SEMICOLON
+	;
+local_variable_declaration ::=
+		type variable_declarators
+	|	FINAL type variable_declarators
+	;
+statement ::=	statement_without_trailing_substatement
+	|	labeled_statement
+	|	if_then_statement
+	|	if_then_else_statement
+	|	while_statement
+	|	for_statement
+	;
+statement_no_short_if ::=
+		statement_without_trailing_substatement
+	|	labeled_statement_no_short_if
+	|	if_then_else_statement_no_short_if
+	|	while_statement_no_short_if
+	|	for_statement_no_short_if
+	;
+statement_without_trailing_substatement ::=
+		block
+	|	empty_statement
+	|	expression_statement
+	|	switch_statement
+	|	do_statement
+	|	break_statement
+	|	continue_statement
+	|	return_statement
+	|	synchronized_statement
+	|	throw_statement
+	|	try_statement
+	;
+empty_statement ::=
+		SEMICOLON
+	;
+labeled_statement ::=
+		IDENTIFIER COLON statement
+	;
+labeled_statement_no_short_if ::=
+		IDENTIFIER COLON statement_no_short_if
+	;
+expression_statement ::=
+		statement_expression SEMICOLON
+	;
+statement_expression ::=
+		assignment
+	|	preincrement_expression
+	|	predecrement_expression
+	|	postincrement_expression
+	|	postdecrement_expression
+	|	method_invocation
+	|	class_instance_creation_expression
+	;
+if_then_statement ::=
+		IF LPAREN expression RPAREN statement
+	;
+if_then_else_statement ::=
+		IF LPAREN expression RPAREN statement_no_short_if 
+			ELSE statement
+	;
+if_then_else_statement_no_short_if ::=
+		IF LPAREN expression RPAREN statement_no_short_if
+			ELSE statement_no_short_if
+	;
+switch_statement ::=
+		SWITCH LPAREN expression RPAREN switch_block
+	;
+switch_block ::=
+		LBRACE switch_block_statement_groups switch_labels RBRACE
+	|	LBRACE switch_block_statement_groups RBRACE
+	|	LBRACE switch_labels RBRACE
+	|	LBRACE RBRACE
+	;
+switch_block_statement_groups ::=
+		switch_block_statement_group
+	|	switch_block_statement_groups switch_block_statement_group
+	;
+switch_block_statement_group ::=
+		switch_labels block_statements
+	;
+switch_labels ::=
+		switch_label
+	|	switch_labels switch_label
+	;
+switch_label ::=
+		CASE constant_expression COLON
+	|	DEFAULT COLON
+	;
+
+while_statement ::=
+		WHILE LPAREN expression RPAREN statement
+	;
+while_statement_no_short_if ::=
+		WHILE LPAREN expression RPAREN statement_no_short_if
+	;
+do_statement ::=
+		DO statement WHILE LPAREN expression RPAREN SEMICOLON
+	;
+for_statement ::=
+		FOR LPAREN for_init_opt SEMICOLON expression_opt SEMICOLON
+			for_update_opt RPAREN statement
+	;
+for_statement_no_short_if ::=
+		FOR LPAREN for_init_opt SEMICOLON expression_opt SEMICOLON
+			for_update_opt RPAREN statement_no_short_if
+	;
+for_init_opt ::=
+	|	for_init
+	;
+for_init ::=	statement_expression_list
+	|	local_variable_declaration
+	;
+for_update_opt ::=
+	|	for_update
+	;
+for_update ::=	statement_expression_list
+	;
+statement_expression_list ::=
+		statement_expression
+	|	statement_expression_list COMMA statement_expression
+	;
+
+identifier_opt ::= 
+	|	IDENTIFIER
+	;
+
+break_statement ::=
+		BREAK identifier_opt SEMICOLON
+	;
+
+continue_statement ::=
+		CONTINUE identifier_opt SEMICOLON
+	;
+return_statement ::=
+		RETURN expression_opt SEMICOLON
+	;
+throw_statement ::=
+		THROW expression SEMICOLON
+	;
+synchronized_statement ::=
+		SYNCHRONIZED LPAREN expression RPAREN block
+	;
+try_statement ::=
+		TRY block catches
+	|	TRY block catches_opt finally
+	;
+catches_opt ::=
+	|	catches
+	;
+catches ::=	catch_clause
+	|	catches catch_clause
+	;
+catch_clause ::=
+		CATCH LPAREN formal_parameter RPAREN block
+	;
+finally ::=	FINALLY block
+	;
+
+// 19.12) Expressions
+primary ::=	primary_no_new_array
+	|	array_creation_expression
+	;
+primary_no_new_array ::=
+		literal
+	|	THIS
+	|	LPAREN expression RPAREN
+	|	class_instance_creation_expression
+	|	field_access
+	|	method_invocation
+	|	array_access
+	|	primitive_type DOT CLASS
+	|	VOID DOT CLASS
+	|	array_type DOT CLASS
+	|	name DOT CLASS
+	|	name DOT THIS
+	;
+class_instance_creation_expression ::=
+		NEW class_type LPAREN argument_list_opt RPAREN
+	|	NEW class_type LPAREN argument_list_opt RPAREN class_body
+	|	primary DOT NEW IDENTIFIER
+			LPAREN argument_list_opt RPAREN
+	|	primary DOT NEW IDENTIFIER
+			LPAREN argument_list_opt RPAREN class_body
+	;
+argument_list_opt ::=
+	|	argument_list
+	;
+argument_list ::=
+		expression
+	|	argument_list COMMA expression
+	;
+array_creation_expression ::=
+		NEW primitive_type dim_exprs dims_opt
+	|	NEW class_or_interface_type dim_exprs dims_opt
+	|	NEW primitive_type dims array_initializer
+	|	NEW class_or_interface_type dims array_initializer
+	;
+dim_exprs ::=	dim_expr
+	|	dim_exprs dim_expr
+	;
+dim_expr ::=	LBRACK expression RBRACK
+	;
+dims_opt ::=
+	|	dims
+	;
+dims ::=	LBRACK RBRACK
+	|	dims LBRACK RBRACK
+	;
+field_access ::=
+		primary DOT IDENTIFIER
+	|	SUPER DOT IDENTIFIER
+	|	name DOT SUPER DOT IDENTIFIER
+	;
+method_invocation ::=
+		name LPAREN argument_list_opt RPAREN
+	|	primary DOT IDENTIFIER LPAREN argument_list_opt RPAREN
+	|	SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN
+	|	name DOT SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN
+	;
+array_access ::=
+		name LBRACK expression RBRACK
+	|	primary_no_new_array LBRACK expression RBRACK
+	;
+postfix_expression ::=
+		primary
+	|	name
+	|	postincrement_expression
+	|	postdecrement_expression
+	;
+postincrement_expression ::=
+		postfix_expression PLUSPLUS
+	;
+postdecrement_expression ::=
+		postfix_expression MINUSMINUS
+	;
+unary_expression ::=
+		preincrement_expression
+	|	predecrement_expression
+	|	PLUS unary_expression
+	|	MINUS unary_expression
+	|	unary_expression_not_plus_minus
+	;
+preincrement_expression ::=
+		PLUSPLUS unary_expression
+	;
+predecrement_expression ::=
+		MINUSMINUS unary_expression
+	;
+unary_expression_not_plus_minus ::=
+		postfix_expression
+	|	COMP unary_expression
+	|	NOT unary_expression
+	|	cast_expression
+	;
+cast_expression ::=
+		LPAREN primitive_type dims_opt RPAREN unary_expression
+	|	LPAREN expression RPAREN unary_expression_not_plus_minus
+	|	LPAREN name dims RPAREN unary_expression_not_plus_minus
+	;
+multiplicative_expression ::=
+		unary_expression
+	|	multiplicative_expression MULT unary_expression
+	|	multiplicative_expression DIV unary_expression
+	|	multiplicative_expression MOD unary_expression
+	;
+additive_expression ::=
+		multiplicative_expression
+	|	additive_expression PLUS multiplicative_expression
+	|	additive_expression MINUS multiplicative_expression
+	;
+shift_expression ::=
+		additive_expression
+	|	shift_expression LSHIFT additive_expression
+	|	shift_expression RSHIFT additive_expression
+	|	shift_expression URSHIFT additive_expression
+	;
+relational_expression ::=
+		shift_expression
+	|	relational_expression LT shift_expression
+	|	relational_expression GT shift_expression
+	|	relational_expression LTEQ shift_expression
+	|	relational_expression GTEQ shift_expression
+	|	relational_expression INSTANCEOF reference_type
+	;
+equality_expression ::=
+		relational_expression
+	|	equality_expression EQEQ relational_expression
+	|	equality_expression NOTEQ relational_expression
+	;
+and_expression ::=
+		equality_expression
+	|	and_expression AND equality_expression
+	;
+exclusive_or_expression ::=
+		and_expression
+	|	exclusive_or_expression XOR and_expression
+	;
+inclusive_or_expression ::=
+		exclusive_or_expression
+	|	inclusive_or_expression OR exclusive_or_expression
+	;
+conditional_and_expression ::=
+		inclusive_or_expression
+	|	conditional_and_expression ANDAND inclusive_or_expression
+	;
+conditional_or_expression ::=
+		conditional_and_expression
+	|	conditional_or_expression OROR conditional_and_expression
+	;
+conditional_expression ::=
+		conditional_or_expression
+	|	conditional_or_expression QUESTION expression 
+			COLON conditional_expression
+	;
+assignment_expression ::=
+		conditional_expression
+	|	assignment
+	;
+assignment ::=	left_hand_side assignment_operator assignment_expression
+	;
+left_hand_side ::=
+		name
+	|	field_access
+	|	array_access
+	;
+assignment_operator ::=
+		EQ
+	|	MULTEQ
+	|	DIVEQ
+	|	MODEQ
+	|	PLUSEQ
+	|	MINUSEQ
+	|	LSHIFTEQ
+	|	RSHIFTEQ
+	|	URSHIFTEQ
+	|	ANDEQ
+	|	XOREQ
+	|	OREQ
+	;
+expression_opt ::=
+	|	expression
+	;
+expression ::=	assignment_expression
+	;
+constant_expression ::=
+		expression
+	;
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/lexer-output.good
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/lexer-output.good	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/lexer-output.good	(revision 25584)
@@ -0,0 +1,386 @@
+Lexing [TestLexer.java]
+line:20 col:1 --import--IMPORT--
+token: line 20, column 1, sym: 23
+line:20 col:8 --java--IDENTIFIER--
+token: line 20, column 8, sym: 98, value: 'java'
+line:20 col:12 --.--DOT--
+token: line 20, column 12, sym: 12
+line:20 col:13 --io--IDENTIFIER--
+token: line 20, column 13, sym: 98, value: 'io'
+line:20 col:15 --.--DOT--
+token: line 20, column 15, sym: 12
+line:20 col:16 --*--MULT--
+token: line 20, column 16, sym: 14
+line:20 col:17 --;--SEMICOLON--
+token: line 20, column 17, sym: 13
+line:21 col:1 --import--IMPORT--
+token: line 21, column 1, sym: 23
+line:21 col:8 --java_cup--IDENTIFIER--
+token: line 21, column 8, sym: 98, value: 'java_cup'
+line:21 col:16 --.--DOT--
+token: line 21, column 16, sym: 12
+line:21 col:17 --runtime--IDENTIFIER--
+token: line 21, column 17, sym: 98, value: 'runtime'
+line:21 col:24 --.--DOT--
+token: line 21, column 24, sym: 12
+line:21 col:25 --Symbol--IDENTIFIER--
+token: line 21, column 25, sym: 98, value: 'Symbol'
+line:21 col:31 --;--SEMICOLON--
+token: line 21, column 31, sym: 13
+line:29 col:1 --public--PUBLIC--
+token: line 29, column 1, sym: 24
+line:29 col:8 --class--CLASS--
+token: line 29, column 8, sym: 34
+line:29 col:14 --TestLexer--IDENTIFIER--
+token: line 29, column 14, sym: 98, value: 'TestLexer'
+line:29 col:24 --{--LBRACE--
+token: line 29, column 24, sym: 16
+line:32 col:3 --int--INT--
+token: line 32, column 3, sym: 5
+line:32 col:7 --intDec--IDENTIFIER--
+token: line 32, column 7, sym: 98, value: 'intDec'
+line:32 col:14 --=--EQ--
+token: line 32, column 14, sym: 18
+line:32 col:16 --37--INTEGER_LITERAL--
+token: line 32, column 16, sym: 93, value: '37'
+line:32 col:18 --;--SEMICOLON--
+token: line 32, column 18, sym: 13
+line:33 col:3 --long--LONG--
+token: line 33, column 3, sym: 6
+line:33 col:8 --longDec--IDENTIFIER--
+token: line 33, column 8, sym: 98, value: 'longDec'
+line:33 col:16 --=--EQ--
+token: line 33, column 16, sym: 18
+line:33 col:18 --37l--INTEGER_LITERAL--
+token: line 33, column 18, sym: 93, value: '37'
+line:33 col:21 --;--SEMICOLON--
+token: line 33, column 21, sym: 13
+line:34 col:3 --int--INT--
+token: line 34, column 3, sym: 5
+line:34 col:7 --intHex--IDENTIFIER--
+token: line 34, column 7, sym: 98, value: 'intHex'
+line:34 col:14 --=--EQ--
+token: line 34, column 14, sym: 18
+line:34 col:16 --0x0001--INTEGER_LITERAL--
+token: line 34, column 16, sym: 93, value: '1'
+line:34 col:22 --;--SEMICOLON--
+token: line 34, column 22, sym: 13
+line:35 col:3 --long--LONG--
+token: line 35, column 3, sym: 6
+line:35 col:8 --longHex--IDENTIFIER--
+token: line 35, column 8, sym: 98, value: 'longHex'
+line:35 col:16 --=--EQ--
+token: line 35, column 16, sym: 18
+line:35 col:18 --0xFFFFl--INTEGER_LITERAL--
+token: line 35, column 18, sym: 93, value: '65535'
+line:35 col:25 --;--SEMICOLON--
+token: line 35, column 25, sym: 13
+line:36 col:3 --int--INT--
+token: line 36, column 3, sym: 5
+line:36 col:7 --intOct--IDENTIFIER--
+token: line 36, column 7, sym: 98, value: 'intOct'
+line:36 col:14 --=--EQ--
+token: line 36, column 14, sym: 18
+line:36 col:16 --0377--INTEGER_LITERAL--
+token: line 36, column 16, sym: 93, value: '255'
+line:36 col:20 --;--SEMICOLON--
+token: line 36, column 20, sym: 13
+line:37 col:3 --long--LONG--
+token: line 37, column 3, sym: 6
+line:37 col:8 --longOc--IDENTIFIER--
+token: line 37, column 8, sym: 98, value: 'longOc'
+line:37 col:15 --=--EQ--
+token: line 37, column 15, sym: 18
+line:37 col:17 --007l--INTEGER_LITERAL--
+token: line 37, column 17, sym: 93, value: '7'
+line:37 col:21 --;--SEMICOLON--
+token: line 37, column 21, sym: 13
+line:38 col:3 --int--INT--
+token: line 38, column 3, sym: 5
+line:38 col:7 --smallest--IDENTIFIER--
+token: line 38, column 7, sym: 98, value: 'smallest'
+line:38 col:16 --=--EQ--
+token: line 38, column 16, sym: 18
+line:38 col:18 ---2147483648--INTEGER_LITERAL--
+token: line 38, column 18, sym: 93, value: '-2147483648'
+line:38 col:29 --;--SEMICOLON--
+token: line 38, column 29, sym: 13
+line:40 col:3 --public--PUBLIC--
+token: line 40, column 3, sym: 24
+line:40 col:10 --static--STATIC--
+token: line 40, column 10, sym: 27
+line:40 col:17 --void--VOID--
+token: line 40, column 17, sym: 37
+line:40 col:22 --main--IDENTIFIER--
+token: line 40, column 22, sym: 98, value: 'main'
+line:40 col:26 --(--LPAREN--
+token: line 40, column 26, sym: 19
+line:40 col:27 --String--IDENTIFIER--
+token: line 40, column 27, sym: 98, value: 'String'
+line:40 col:34 --argv--IDENTIFIER--
+token: line 40, column 34, sym: 98, value: 'argv'
+line:40 col:38 --[--LBRACK--
+token: line 40, column 38, sym: 10
+line:40 col:39 --]--RBRACK--
+token: line 40, column 39, sym: 11
+line:40 col:40 --)--RPAREN--
+token: line 40, column 40, sym: 20
+line:40 col:42 --{--LBRACE--
+token: line 40, column 42, sym: 16
+line:42 col:5 --for--FOR--
+token: line 42, column 5, sym: 49
+line:42 col:9 --(--LPAREN--
+token: line 42, column 9, sym: 19
+line:42 col:10 --int--INT--
+token: line 42, column 10, sym: 5
+line:42 col:14 --i--IDENTIFIER--
+token: line 42, column 14, sym: 98, value: 'i'
+line:42 col:16 --=--EQ--
+token: line 42, column 16, sym: 18
+line:42 col:18 --0--INTEGER_LITERAL--
+token: line 42, column 18, sym: 93, value: '0'
+line:42 col:19 --;--SEMICOLON--
+token: line 42, column 19, sym: 13
+line:42 col:21 --i--IDENTIFIER--
+token: line 42, column 21, sym: 98, value: 'i'
+line:42 col:23 --<--LT--
+token: line 42, column 23, sym: 69
+line:42 col:25 --argv--IDENTIFIER--
+token: line 42, column 25, sym: 98, value: 'argv'
+line:42 col:29 --.--DOT--
+token: line 42, column 29, sym: 12
+line:42 col:30 --length--IDENTIFIER--
+token: line 42, column 30, sym: 98, value: 'length'
+line:42 col:36 --;--SEMICOLON--
+token: line 42, column 36, sym: 13
+line:42 col:38 --i--IDENTIFIER--
+token: line 42, column 38, sym: 98, value: 'i'
+line:42 col:39 --++--PLUSPLUS--
+token: line 42, column 39, sym: 58
+line:42 col:41 --)--RPAREN--
+token: line 42, column 41, sym: 20
+line:42 col:43 --{--LBRACE--
+token: line 42, column 43, sym: 16
+line:43 col:7 --try--TRY--
+token: line 43, column 7, sym: 54
+line:43 col:11 --{--LBRACE--
+token: line 43, column 11, sym: 16
+line:44 col:9 --System--IDENTIFIER--
+token: line 44, column 9, sym: 98, value: 'System'
+line:44 col:15 --.--DOT--
+token: line 44, column 15, sym: 12
+line:44 col:16 --out--IDENTIFIER--
+token: line 44, column 16, sym: 98, value: 'out'
+line:44 col:19 --.--DOT--
+token: line 44, column 19, sym: 12
+line:44 col:20 --println--IDENTIFIER--
+token: line 44, column 20, sym: 98, value: 'println'
+line:44 col:27 --(--LPAREN--
+token: line 44, column 27, sym: 19
+line:44 col:37 --"--STRING_LITERAL--
+token: line 44, column 37, sym: 97, value: 'Lexing ['
+line:44 col:38 --+--PLUS--
+token: line 44, column 38, sym: 60
+line:44 col:39 --argv--IDENTIFIER--
+token: line 44, column 39, sym: 98, value: 'argv'
+line:44 col:43 --[--LBRACK--
+token: line 44, column 43, sym: 10
+line:44 col:44 --i--IDENTIFIER--
+token: line 44, column 44, sym: 98, value: 'i'
+line:44 col:45 --]--RBRACK--
+token: line 44, column 45, sym: 11
+line:44 col:46 --+--PLUS--
+token: line 44, column 46, sym: 60
+line:44 col:49 --"--STRING_LITERAL--
+token: line 44, column 49, sym: 97, value: ']'
+line:44 col:50 --)--RPAREN--
+token: line 44, column 50, sym: 20
+line:44 col:51 --;--SEMICOLON--
+token: line 44, column 51, sym: 13
+line:45 col:9 --Scanner--IDENTIFIER--
+token: line 45, column 9, sym: 98, value: 'Scanner'
+line:45 col:17 --scanner--IDENTIFIER--
+token: line 45, column 17, sym: 98, value: 'scanner'
+line:45 col:25 --=--EQ--
+token: line 45, column 25, sym: 18
+line:45 col:27 --new--NEW--
+token: line 45, column 27, sym: 57
+line:45 col:31 --Scanner--IDENTIFIER--
+token: line 45, column 31, sym: 98, value: 'Scanner'
+line:45 col:38 --(--LPAREN--
+token: line 45, column 38, sym: 19
+line:45 col:39 --new--NEW--
+token: line 45, column 39, sym: 57
+line:45 col:43 --UnicodeEscapes--IDENTIFIER--
+token: line 45, column 43, sym: 98, value: 'UnicodeEscapes'
+line:45 col:57 --(--LPAREN--
+token: line 45, column 57, sym: 19
+line:45 col:58 --new--NEW--
+token: line 45, column 58, sym: 57
+line:45 col:62 --FileReader--IDENTIFIER--
+token: line 45, column 62, sym: 98, value: 'FileReader'
+line:45 col:72 --(--LPAREN--
+token: line 45, column 72, sym: 19
+line:45 col:73 --argv--IDENTIFIER--
+token: line 45, column 73, sym: 98, value: 'argv'
+line:45 col:77 --[--LBRACK--
+token: line 45, column 77, sym: 10
+line:45 col:78 --i--IDENTIFIER--
+token: line 45, column 78, sym: 98, value: 'i'
+line:45 col:79 --]--RBRACK--
+token: line 45, column 79, sym: 11
+line:45 col:80 --)--RPAREN--
+token: line 45, column 80, sym: 20
+line:45 col:81 --)--RPAREN--
+token: line 45, column 81, sym: 20
+line:45 col:82 --)--RPAREN--
+token: line 45, column 82, sym: 20
+line:45 col:83 --;--SEMICOLON--
+token: line 45, column 83, sym: 13
+line:47 col:9 --Symbol--IDENTIFIER--
+token: line 47, column 9, sym: 98, value: 'Symbol'
+line:47 col:16 --s--IDENTIFIER--
+token: line 47, column 16, sym: 98, value: 's'
+line:47 col:17 --;--SEMICOLON--
+token: line 47, column 17, sym: 13
+line:48 col:9 --do--DO--
+token: line 48, column 9, sym: 47
+line:48 col:12 --{--LBRACE--
+token: line 48, column 12, sym: 16
+line:49 col:11 --s--IDENTIFIER--
+token: line 49, column 11, sym: 98, value: 's'
+line:49 col:13 --=--EQ--
+token: line 49, column 13, sym: 18
+line:49 col:15 --scanner--IDENTIFIER--
+token: line 49, column 15, sym: 98, value: 'scanner'
+line:49 col:22 --.--DOT--
+token: line 49, column 22, sym: 12
+line:49 col:23 --debug_next_token--IDENTIFIER--
+token: line 49, column 23, sym: 98, value: 'debug_next_token'
+line:49 col:39 --(--LPAREN--
+token: line 49, column 39, sym: 19
+line:49 col:40 --)--RPAREN--
+token: line 49, column 40, sym: 20
+line:49 col:41 --;--SEMICOLON--
+token: line 49, column 41, sym: 13
+line:50 col:11 --System--IDENTIFIER--
+token: line 50, column 11, sym: 98, value: 'System'
+line:50 col:17 --.--DOT--
+token: line 50, column 17, sym: 12
+line:50 col:18 --out--IDENTIFIER--
+token: line 50, column 18, sym: 98, value: 'out'
+line:50 col:21 --.--DOT--
+token: line 50, column 21, sym: 12
+line:50 col:22 --println--IDENTIFIER--
+token: line 50, column 22, sym: 98, value: 'println'
+line:50 col:29 --(--LPAREN--
+token: line 50, column 29, sym: 19
+line:50 col:38 --"--STRING_LITERAL--
+token: line 50, column 38, sym: 97, value: 'token: '
+line:50 col:39 --+--PLUS--
+token: line 50, column 39, sym: 60
+line:50 col:40 --s--IDENTIFIER--
+token: line 50, column 40, sym: 98, value: 's'
+line:50 col:41 --)--RPAREN--
+token: line 50, column 41, sym: 20
+line:50 col:42 --;--SEMICOLON--
+token: line 50, column 42, sym: 13
+line:51 col:9 --}--RBRACE--
+token: line 51, column 9, sym: 17
+line:51 col:11 --while--WHILE--
+token: line 51, column 11, sym: 48
+line:51 col:17 --(--LPAREN--
+token: line 51, column 17, sym: 19
+line:51 col:18 --s--IDENTIFIER--
+token: line 51, column 18, sym: 98, value: 's'
+line:51 col:19 --.--DOT--
+token: line 51, column 19, sym: 12
+line:51 col:20 --sym--IDENTIFIER--
+token: line 51, column 20, sym: 98, value: 'sym'
+line:51 col:24 --!=--NOTEQ--
+token: line 51, column 24, sym: 75
+line:51 col:27 --sym--IDENTIFIER--
+token: line 51, column 27, sym: 98, value: 'sym'
+line:51 col:30 --.--DOT--
+token: line 51, column 30, sym: 12
+line:51 col:31 --EOF--IDENTIFIER--
+token: line 51, column 31, sym: 98, value: 'EOF'
+line:51 col:34 --)--RPAREN--
+token: line 51, column 34, sym: 20
+line:51 col:35 --;--SEMICOLON--
+token: line 51, column 35, sym: 13
+line:53 col:9 --System--IDENTIFIER--
+token: line 53, column 9, sym: 98, value: 'System'
+line:53 col:15 --.--DOT--
+token: line 53, column 15, sym: 12
+line:53 col:16 --out--IDENTIFIER--
+token: line 53, column 16, sym: 98, value: 'out'
+line:53 col:19 --.--DOT--
+token: line 53, column 19, sym: 12
+line:53 col:20 --println--IDENTIFIER--
+token: line 53, column 20, sym: 98, value: 'println'
+line:53 col:27 --(--LPAREN--
+token: line 53, column 27, sym: 19
+line:53 col:39 --"--STRING_LITERAL--
+token: line 53, column 39, sym: 97, value: 'No errors.'
+line:53 col:40 --)--RPAREN--
+token: line 53, column 40, sym: 20
+line:53 col:41 --;--SEMICOLON--
+token: line 53, column 41, sym: 13
+line:54 col:7 --}--RBRACE--
+token: line 54, column 7, sym: 17
+line:55 col:7 --catch--CATCH--
+token: line 55, column 7, sym: 55
+line:55 col:13 --(--LPAREN--
+token: line 55, column 13, sym: 19
+line:55 col:14 --Exception--IDENTIFIER--
+token: line 55, column 14, sym: 98, value: 'Exception'
+line:55 col:24 --e--IDENTIFIER--
+token: line 55, column 24, sym: 98, value: 'e'
+line:55 col:25 --)--RPAREN--
+token: line 55, column 25, sym: 20
+line:55 col:27 --{--LBRACE--
+token: line 55, column 27, sym: 16
+line:56 col:9 --e--IDENTIFIER--
+token: line 56, column 9, sym: 98, value: 'e'
+line:56 col:10 --.--DOT--
+token: line 56, column 10, sym: 12
+line:56 col:11 --printStackTrace--IDENTIFIER--
+token: line 56, column 11, sym: 98, value: 'printStackTrace'
+line:56 col:26 --(--LPAREN--
+token: line 56, column 26, sym: 19
+line:56 col:27 --System--IDENTIFIER--
+token: line 56, column 27, sym: 98, value: 'System'
+line:56 col:33 --.--DOT--
+token: line 56, column 33, sym: 12
+line:56 col:34 --out--IDENTIFIER--
+token: line 56, column 34, sym: 98, value: 'out'
+line:56 col:37 --)--RPAREN--
+token: line 56, column 37, sym: 20
+line:56 col:38 --;--SEMICOLON--
+token: line 56, column 38, sym: 13
+line:57 col:9 --System--IDENTIFIER--
+token: line 57, column 9, sym: 98, value: 'System'
+line:57 col:15 --.--DOT--
+token: line 57, column 15, sym: 12
+line:57 col:16 --exit--IDENTIFIER--
+token: line 57, column 16, sym: 98, value: 'exit'
+line:57 col:20 --(--LPAREN--
+token: line 57, column 20, sym: 19
+line:57 col:21 --1--INTEGER_LITERAL--
+token: line 57, column 21, sym: 93, value: '1'
+line:57 col:22 --)--RPAREN--
+token: line 57, column 22, sym: 20
+line:57 col:23 --;--SEMICOLON--
+token: line 57, column 23, sym: 13
+line:58 col:7 --}--RBRACE--
+token: line 58, column 7, sym: 17
+line:59 col:5 --}--RBRACE--
+token: line 59, column 5, sym: 17
+line:60 col:3 --}--RBRACE--
+token: line 60, column 3, sym: 17
+line:61 col:1 --}--RBRACE--
+token: line 61, column 1, sym: 17
+line:62 col:1 ----EOF--
+token: line 62, column 1, sym: 0
+No errors.
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/unicode.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/unicode.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/java/unicode.flex	(revision 25584)
@@ -0,0 +1,149 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 1998-2009 Gerwin Klein <lsf@jflex.de>                     *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* §3.3 of the Java Language Specification :
+
+UnicodeInputCharacter:
+
+             UnicodeEscape
+
+             RawInputCharacter
+
+     UnicodeEscape:
+
+             \ UnicodeMarker HexDigit HexDigit HexDigit HexDigit
+
+     UnicodeMarker:
+
+             u
+
+             UnicodeMarker u
+
+     RawInputCharacter:
+
+             any Unicode character
+
+     HexDigit: one of
+
+             0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
+
+only an even number of '\' is eligible to start a Unicode escape sequence
+
+*/
+
+import java.io.*;
+
+%%
+
+%public
+%final
+%class UnicodeEscapes
+%extends FilterReader
+
+%int
+%function read
+
+%switch
+%16bit
+
+UnicodeEscape   = {UnicodeMarker} {HexDigit} {4}
+UnicodeMarker   = "u"+
+HexDigit        = [0-9a-fA-F]
+
+%state DIGITS
+
+%init{
+  super(in);
+%init}
+
+%{
+  private boolean even;
+ 
+  private int value() {
+    int r = 0;
+
+    for (int k = zzMarkedPos-4; k < zzMarkedPos; k++) {
+      int c = zzBuffer[k];
+
+      if (c >= 'a') 
+        c-= 'a'-10;
+      else if (c >= 'A')
+        c-= 'A'-10;
+      else
+        c-= '0';
+
+      r <<= 4;
+      r += c;
+    }
+   
+    return r;
+  }
+
+  public int read(char cbuf[], int off, int len) throws IOException {
+    if ( !ready() ) return -1;
+
+    len+= off;
+
+    for (int i=off; i<len; i++) {
+      int c = read();
+
+      if (c < 0) 
+        return i-off;
+      else 
+        cbuf[i] = (char) c;
+    }
+
+    return len-off;
+  }
+
+  public boolean markSupported() { 
+    return false; 
+  }
+
+  public boolean ready() throws IOException {
+    return !zzAtEOF && (zzCurrentPos < zzEndRead || zzReader.ready());
+  }
+
+%}
+
+%%
+
+<YYINITIAL> {
+  \\               { even = false; return '\\'; }
+  \\ / \\          { even = !even; return '\\'; }
+  \\ / "u"         { 
+                     if (even) {
+                       even = false;
+                       return '\\';
+                     }
+                     else
+                       yybegin(DIGITS);
+                   } 
+  .|\n             { return zzBuffer[zzStartRead]; }
+
+  <<EOF>>          { return -1; }
+}
+
+<DIGITS> {
+  {UnicodeEscape}  { yybegin(YYINITIAL); return value();  }
+  .|\n             { throw new Error("incorrect Unicode escape"); }
+
+  <<EOF>>          { throw new Error("EOF in Unicode escape"); }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/pom.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/pom.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/pom.xml	(revision 25584)
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>de.flex.examples</groupId>
+	<artifactId>parent</artifactId>
+	<version>1</version>
+	<name>examples</name>
+	<description>
+		Examples on how to use JFlex and maven-jflex-plugin
+	</description>
+	<packaging>pom</packaging>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>de.jflex.maven.plugin</groupId>
+				<artifactId>maven-jflex-plugin</artifactId>
+				<version>0.3</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>generate</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+	<pluginRepositories>
+		<pluginRepository>
+			<id>jflex</id>
+			<name>JFlex repository</name>
+			<url>http://jflex.sourceforge.net/repo/</url>
+		</pluginRepository>
+	</pluginRepositories>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>3.8.2</version>
+				<scope>test</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+	<modules>
+		<module>simple-maven</module>
+		<module>standalone-maven</module>
+	</modules>
+</project>
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/README.txt
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/README.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/README.txt	(revision 25584)
@@ -0,0 +1,1 @@
+link src/site/apt/usage.apt
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/pom.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/pom.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/pom.xml	(revision 25584)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>de.flex.examples</groupId>
+    <artifactId>parent</artifactId>
+    <version>1</version>
+  </parent>
+  <artifactId>simple-maven</artifactId>
+  <version>0.1</version>
+  <name>A scanner for a toy programming language.</name>
+  <description>It is the example from the JLex website with some small
+		modifications, to make it a bit more readable.
+
+		It does nothing really useful, because there is no parser for
+		the toy programming language. It's just a demonstration how a
+		small simple scanner looks like.</description>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/README	(revision 25584)
@@ -0,0 +1,10 @@
+This is a small Maven project that demeonstrates the use of maven-jflex-plugin.
+
+main/flex/simple.flex:
+  the example specification
+
+test/resources/test.txt:
+  sample input
+
+test/resources/output.good:
+  expected output matching the sample input from test.txt
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/java/Utility.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/java/Utility.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/java/Utility.java	(revision 25584)
@@ -0,0 +1,23 @@
+/**
+ * A small utility class.
+ * TODO: use reosurce bundle
+ */
+class Utility {
+  
+  private static final String errorMsg[] = {
+    "Error: Unmatched end-of-comment punctuation.",
+    "Error: Unmatched start-of-comment punctuation.",
+    "Error: Unclosed string.",
+    "Error: Illegal character."
+    };
+  
+  public static final int E_ENDCOMMENT = 0; 
+  public static final int E_STARTCOMMENT = 1; 
+  public static final int E_UNCLOSEDSTR = 2; 
+  public static final int E_UNMATCHED = 3; 
+
+  public static void error(int code) {
+	  System.out.println(errorMsg[code]);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/java/Yytoken.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/java/Yytoken.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/java/Yytoken.java	(revision 25584)
@@ -0,0 +1,28 @@
+/**
+ * The tokens returned by the scanner.
+ * 
+ */
+class Yytoken {
+  public int m_index;
+  public String m_text;
+  public int m_line;
+  public int m_charBegin;
+  public int m_charEnd;
+  
+  Yytoken (int index, String text, int line, int charBegin, int charEnd) {
+     m_index = index;
+    m_text = text;
+    m_line = line;
+    m_charBegin = charBegin;
+    m_charEnd = charEnd;
+  }
+
+  public String toString() {
+    return "Text   : "+m_text+
+           "\nindex : "+m_index+
+           "\nline  : "+m_line+
+           "\ncBeg. : "+m_charBegin+
+           "\ncEnd. : "+m_charEnd;
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/jflex/simple.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/jflex/simple.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/main/jflex/simple.flex	(revision 25584)
@@ -0,0 +1,86 @@
+/* this is the scanner example from the JLex website 
+   (with small modifications to make it more readable) */
+
+%%
+
+%{
+  private int comment_count = 0;
+%} 
+
+%line
+%char
+%state COMMENT
+%full
+
+%debug
+
+ALPHA=[A-Za-z]
+DIGIT=[0-9]
+NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012]
+NEWLINE=\r|\n|\r\n
+WHITE_SPACE_CHAR=[\n\r\ \t\b\012]
+STRING_TEXT=(\\\"|[^\n\r\"]|\\{WHITE_SPACE_CHAR}+\\)*
+COMMENT_TEXT=([^*/\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])*
+Ident = {ALPHA}({ALPHA}|{DIGIT}|_)*
+
+%% 
+
+<YYINITIAL> {
+  "," { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+  ":" { return (new Yytoken(1,yytext(),yyline,yychar,yychar+1)); }
+  ";" { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+  "(" { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); }
+  ")" { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); }
+  "[" { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); }
+  "]" { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); }
+  "{" { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+  "}" { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+  "." { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); }
+  "+" { return (new Yytoken(10,yytext(),yyline,yychar,yychar+1)); }
+  "-" { return (new Yytoken(11,yytext(),yyline,yychar,yychar+1)); }
+  "*" { return (new Yytoken(12,yytext(),yyline,yychar,yychar+1)); }
+  "/" { return (new Yytoken(13,yytext(),yyline,yychar,yychar+1)); }
+  "=" { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+  "<>" { return (new Yytoken(15,yytext(),yyline,yychar,yychar+2)); }
+  "<"  { return (new Yytoken(16,yytext(),yyline,yychar,yychar+1)); }
+  "<=" { return (new Yytoken(17,yytext(),yyline,yychar,yychar+2)); }
+  ">"  { return (new Yytoken(18,yytext(),yyline,yychar,yychar+1)); }
+  ">=" { return (new Yytoken(19,yytext(),yyline,yychar,yychar+2)); }
+  "&"  { return (new Yytoken(20,yytext(),yyline,yychar,yychar+1)); }
+  "|"  { return (new Yytoken(21,yytext(),yyline,yychar,yychar+1)); }
+  ":=" { return (new Yytoken(22,yytext(),yyline,yychar,yychar+2)); }
+
+  {NONNEWLINE_WHITE_SPACE_CHAR}+ { }
+
+  "/*" { yybegin(COMMENT); comment_count++; }
+
+  \"{STRING_TEXT}\" {
+    String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength()));
+  }
+  
+  \"{STRING_TEXT} {
+    String str =  yytext().substring(1,yytext().length());
+    Utility.error(Utility.E_UNCLOSEDSTR);
+    return (new Yytoken(41,str,yyline,yychar,yychar + str.length()));
+  } 
+  
+  {DIGIT}+ { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }  
+
+  {Ident} { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }  
+}
+
+<COMMENT> {
+  "/*" { comment_count++; }
+  "*/" { if (--comment_count == 0) yybegin(YYINITIAL); }
+  {COMMENT_TEXT} { }
+}
+
+
+{NEWLINE} { }
+
+. {
+  System.out.println("Illegal character: <" + yytext() + ">");
+	Utility.error(Utility.E_UNMATCHED);
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/site/apt/usage.apt
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/site/apt/usage.apt	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/site/apt/usage.apt	(revision 25584)
@@ -0,0 +1,100 @@
+ ------
+ Usage 
+ ------
+ Gerwin Klein <lsf37@users.sf.net>
+ RÃ©gis DÃ©camps <decamps@users.sf.net>
+ ------
+ November 2, 2007
+ ------
+ 
+
+About this project
+	
+	This sample project parses a grammar with JFlex.
+	
+	The project management is done with Maven.
+	
+	The project contains a simple grammar for the "Toy programming language".
+	It is the example from the JLex web site with some small
+	modifications, to make it a bit more readable.
+	It does nothing really useful, because there is no parser for
+	the toy programming language. It's just a demonstration how a
+	small simple scanner looks like.
+	
+	
+* JFlex
+	
+	JFlex is a parser generator. Given a grammar,  JFlex generate
+	Java (TM) code to parse documents that follow this grammar.
+	
+* Maven
+
+	Maven is a project management framework.
+	The project is described in as a POM (project object model, 
+	stored into <<<pom.xml>>>).
+	This document isn't intended to be a tutorial on the use of Maven 2,
+	you should consult the {{{http://maven.apache.org/}Maven web site}}.
+	
+	The integration of JFlex and Maven is done with 
+	{{{http://jflex.sourceforge.net/maven-flex-plugin/}maven-flex-plugin}}.
+	
+
+Usage
+	 
+* mvn generate-sources
+
+	The maven-jflex-plugin will read the grammar 
+	<<<src/main/jflex/simple.jflex>>>
+	and generate a Java scanner <<<Yylex.java>>>
+	in <<<target/generated-sources/flex>>>
+
+	This is defined by the following section
+	
++---------
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>de.jflex.maven.plugin</groupId>
+        <artifactId>maven-jflex-plugin</artifactId>
+        <version>0.2</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
++------------
+
+	By default, the maven-jflex-plugin generates a scanner/parser for every file
+	in <<<src/main/jflex/>>>.
+
+
+* mvn test
+
+	This goal test the generated scanner (if required, the lexer will be 
+	generated and all Java classes will be compiled)
+	by running all tests in <<<src/test/java>>>.
+	
+	There is only one test in <<<src/test/java/YylexTest.java>>>.
+	In this test, 
+	the scanner is run with the input file <<<src/test/resources/test.txt>>>.
+	
+	By default, the scanner outputs debugging information about each 
+	returned token to <<<System.out>>> until the end of file is reached, 
+	or an error occurs.
+	But in the test, the output is redirected into <<<target/output.actual>>>.
+	
+	The test is successful if every line match
+	with <<<src/test/resources/output.good>>>,
+	which is the expected scanner debugging information.
+	
+
+References
+
+    * {{{http://jflex.sourceforge.net/maven-flex-plugin/}maven-flex-plugin}}
+    
+    * {{{http://maven.apache.org/}Maven web site}}.
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/site/site.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/site/site.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/site/site.xml	(revision 25584)
@@ -0,0 +1,9 @@
+<project>
+	<body>
+		<menu name="Overview" href="index.html" >
+			<item name="Summary" href="project-summary.html" />
+			<item name="Usage" href="usage.html" />
+		</menu>
+		<menu ref="reports" />
+	</body>
+</project>
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/java/YylexTest.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/java/YylexTest.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/java/YylexTest.java	(revision 25584)
@@ -0,0 +1,59 @@
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import junit.framework.TestCase;
+
+/**
+ * This is an integration test.
+ * 
+ * The class Yylex is generated by JFLex from
+ * <code>src/main/jflex/simple.flex</code>.
+ * 
+ * @author regis
+ * 
+ */
+public class YylexTest extends TestCase {
+
+	private static final String OUTPUT_FILE = "target/output.actual";
+
+	/**
+	 * Test that Yylex parser behaves like expected.
+	 * 
+	 * @throws IOException
+	 */
+	public void testOutput() throws IOException {
+		String[] argv = new String[1];
+		argv[0] = "src/test/resources/test.txt";
+
+		// the Yylex prints status on stdout
+		File actual = new File("target/output.actual");
+		actual.delete();
+		FileOutputStream fos = new FileOutputStream(OUTPUT_FILE, true);
+		System.setOut(new PrintStream(fos));
+
+		Yylex.main(argv);
+		
+		fos.close();
+		
+		// test actual is expected
+		File expected = new File("src/test/resources/output.good");
+		assertTrue(expected.isFile());
+		assertTrue(actual.isFile());
+
+		BufferedReader actualContent = new BufferedReader(
+				new FileReader(actual));
+		BufferedReader expectedContent = new BufferedReader(new FileReader(
+				expected));
+
+		for (int lineNumber = 1;lineNumber!=-1; lineNumber++) {
+			String expectedLine = expectedContent.readLine();
+			String actualLine = actualContent.readLine();			
+			assertEquals("Line "+lineNumber, expectedLine, actualLine);
+			if (expectedLine==null) lineNumber=-2; //EOF
+		}
+	}
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/resources/output.good
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/resources/output.good	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/resources/output.good	(revision 25584)
@@ -0,0 +1,660 @@
+line: 1 match: --class--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : class
+index : 43
+line  : 0
+cBeg. : 0
+cEnd. : 5
+line: 1 match: -- --
+action [76] {  }
+line: 1 match: --Utility--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : Utility
+index : 43
+line  : 0
+cBeg. : 6
+cEnd. : 13
+line: 1 match: -- --
+action [76] {  }
+line: 1 match: --{--
+action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+Text   : {
+index : 7
+line  : 0
+cBeg. : 14
+cEnd. : 15
+line: 1 match: --
+  
+  --
+action [76] {  }
+line: 3 match: --private--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : private
+index : 43
+line  : 2
+cBeg. : 21
+cEnd. : 28
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 2
+cBeg. : 29
+cEnd. : 35
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 2
+cBeg. : 36
+cEnd. : 41
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --String--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : String
+index : 43
+line  : 2
+cBeg. : 42
+cEnd. : 48
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --errorMsg--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : errorMsg
+index : 43
+line  : 2
+cBeg. : 49
+cEnd. : 57
+line: 3 match: --[--
+action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); }
+Text   : [
+index : 5
+line  : 2
+cBeg. : 57
+cEnd. : 58
+line: 3 match: --]--
+action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); }
+Text   : ]
+index : 6
+line  : 2
+cBeg. : 58
+cEnd. : 59
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 2
+cBeg. : 60
+cEnd. : 61
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --{--
+action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+Text   : {
+index : 7
+line  : 2
+cBeg. : 62
+cEnd. : 63
+line: 3 match: --
+    --
+action [76] {  }
+line: 4 match: --"Error: Unmatched end-of-comment punctuation."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Unmatched end-of-comment punctuation.
+index : 40
+line  : 3
+cBeg. : 68
+cEnd. : 114
+line: 4 match: --,--
+action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+Text   : ,
+index : 0
+line  : 3
+cBeg. : 114
+cEnd. : 115
+line: 4 match: --
+    --
+action [76] {  }
+line: 5 match: --"Error: Unmatched start-of-comment punctuation."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Unmatched start-of-comment punctuation.
+index : 40
+line  : 4
+cBeg. : 120
+cEnd. : 168
+line: 5 match: --,--
+action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+Text   : ,
+index : 0
+line  : 4
+cBeg. : 168
+cEnd. : 169
+line: 5 match: --
+    --
+action [76] {  }
+line: 6 match: --"Error: Unclosed string."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Unclosed string.
+index : 40
+line  : 5
+cBeg. : 174
+cEnd. : 199
+line: 6 match: --,--
+action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+Text   : ,
+index : 0
+line  : 5
+cBeg. : 199
+cEnd. : 200
+line: 6 match: --
+    --
+action [76] {  }
+line: 7 match: --"Error: Illegal character."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Illegal character.
+index : 40
+line  : 6
+cBeg. : 205
+cEnd. : 232
+line: 7 match: --
+    --
+action [76] {  }
+line: 8 match: --}--
+action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+Text   : }
+index : 8
+line  : 7
+cBeg. : 237
+cEnd. : 238
+line: 8 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 7
+cBeg. : 238
+cEnd. : 239
+line: 8 match: --
+  
+  --
+action [76] {  }
+line: 10 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 9
+cBeg. : 245
+cEnd. : 251
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 9
+cBeg. : 252
+cEnd. : 258
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 9
+cBeg. : 259
+cEnd. : 264
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 9
+cBeg. : 265
+cEnd. : 268
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --E_ENDCOMMENT--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_ENDCOMMENT
+index : 43
+line  : 9
+cBeg. : 269
+cEnd. : 281
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 9
+cBeg. : 282
+cEnd. : 283
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --0--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 0
+index : 42
+line  : 9
+cBeg. : 284
+cEnd. : 285
+line: 10 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 9
+cBeg. : 285
+cEnd. : 286
+line: 10 match: -- 
+  --
+action [76] {  }
+line: 11 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 10
+cBeg. : 290
+cEnd. : 296
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 10
+cBeg. : 297
+cEnd. : 303
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 10
+cBeg. : 304
+cEnd. : 309
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 10
+cBeg. : 310
+cEnd. : 313
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --E_STARTCOMMENT--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_STARTCOMMENT
+index : 43
+line  : 10
+cBeg. : 314
+cEnd. : 328
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 10
+cBeg. : 329
+cEnd. : 330
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --1--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 1
+index : 42
+line  : 10
+cBeg. : 331
+cEnd. : 332
+line: 11 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 10
+cBeg. : 332
+cEnd. : 333
+line: 11 match: -- 
+  --
+action [76] {  }
+line: 12 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 11
+cBeg. : 337
+cEnd. : 343
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 11
+cBeg. : 344
+cEnd. : 350
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 11
+cBeg. : 351
+cEnd. : 356
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 11
+cBeg. : 357
+cEnd. : 360
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --E_UNCLOSEDSTR--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_UNCLOSEDSTR
+index : 43
+line  : 11
+cBeg. : 361
+cEnd. : 374
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 11
+cBeg. : 375
+cEnd. : 376
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --2--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 2
+index : 42
+line  : 11
+cBeg. : 377
+cEnd. : 378
+line: 12 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 11
+cBeg. : 378
+cEnd. : 379
+line: 12 match: -- 
+  --
+action [76] {  }
+line: 13 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 12
+cBeg. : 383
+cEnd. : 389
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 12
+cBeg. : 390
+cEnd. : 396
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 12
+cBeg. : 397
+cEnd. : 402
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 12
+cBeg. : 403
+cEnd. : 406
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --E_UNMATCHED--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_UNMATCHED
+index : 43
+line  : 12
+cBeg. : 407
+cEnd. : 418
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 12
+cBeg. : 419
+cEnd. : 420
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --3--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 3
+index : 42
+line  : 12
+cBeg. : 421
+cEnd. : 422
+line: 13 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 12
+cBeg. : 422
+cEnd. : 423
+line: 13 match: -- 
+
+  --
+action [76] {  }
+line: 15 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 14
+cBeg. : 428
+cEnd. : 434
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 14
+cBeg. : 435
+cEnd. : 441
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --void--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : void
+index : 43
+line  : 14
+cBeg. : 442
+cEnd. : 446
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --error--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : error
+index : 43
+line  : 14
+cBeg. : 447
+cEnd. : 452
+line: 15 match: --(--
+action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); }
+Text   : (
+index : 3
+line  : 14
+cBeg. : 452
+cEnd. : 453
+line: 15 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 14
+cBeg. : 453
+cEnd. : 456
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --code--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : code
+index : 43
+line  : 14
+cBeg. : 457
+cEnd. : 461
+line: 15 match: --)--
+action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); }
+Text   : )
+index : 4
+line  : 14
+cBeg. : 461
+cEnd. : 462
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --{--
+action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+Text   : {
+index : 7
+line  : 14
+cBeg. : 463
+cEnd. : 464
+line: 15 match: --
+	  --
+action [76] {  }
+line: 16 match: --System--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : System
+index : 43
+line  : 15
+cBeg. : 468
+cEnd. : 474
+line: 16 match: --.--
+action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); }
+Text   : .
+index : 9
+line  : 15
+cBeg. : 474
+cEnd. : 475
+line: 16 match: --out--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : out
+index : 43
+line  : 15
+cBeg. : 475
+cEnd. : 478
+line: 16 match: --.--
+action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); }
+Text   : .
+index : 9
+line  : 15
+cBeg. : 478
+cEnd. : 479
+line: 16 match: --println--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : println
+index : 43
+line  : 15
+cBeg. : 479
+cEnd. : 486
+line: 16 match: --(--
+action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); }
+Text   : (
+index : 3
+line  : 15
+cBeg. : 486
+cEnd. : 487
+line: 16 match: --errorMsg--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : errorMsg
+index : 43
+line  : 15
+cBeg. : 487
+cEnd. : 495
+line: 16 match: --[--
+action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); }
+Text   : [
+index : 5
+line  : 15
+cBeg. : 495
+cEnd. : 496
+line: 16 match: --code--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : code
+index : 43
+line  : 15
+cBeg. : 496
+cEnd. : 500
+line: 16 match: --]--
+action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); }
+Text   : ]
+index : 6
+line  : 15
+cBeg. : 500
+cEnd. : 501
+line: 16 match: --)--
+action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); }
+Text   : )
+index : 4
+line  : 15
+cBeg. : 501
+cEnd. : 502
+line: 16 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 15
+cBeg. : 502
+cEnd. : 503
+line: 16 match: --
+  --
+action [76] {  }
+line: 17 match: --}--
+action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+Text   : }
+index : 8
+line  : 16
+cBeg. : 506
+cEnd. : 507
+line: 17 match: --
+--
+action [76] {  }
+line: 18 match: --}--
+action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+Text   : }
+index : 8
+line  : 17
+cBeg. : 508
+cEnd. : 509
+line: 18 match: --
+
+--
+action [76] {  }
+null
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/resources/test.txt
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/resources/test.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple-maven/src/test/resources/test.txt	(revision 25584)
@@ -0,0 +1,19 @@
+class Utility {
+  
+  private static final String errorMsg[] = {
+    "Error: Unmatched end-of-comment punctuation.",
+    "Error: Unmatched start-of-comment punctuation.",
+    "Error: Unclosed string.",
+    "Error: Illegal character."
+    };
+  
+  public static final int E_ENDCOMMENT = 0; 
+  public static final int E_STARTCOMMENT = 1; 
+  public static final int E_UNCLOSEDSTR = 2; 
+  public static final int E_UNMATCHED = 3; 
+
+  public static void error(int code) {
+	  System.out.println(errorMsg[code]);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Makefile
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Makefile	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Makefile	(revision 25584)
@@ -0,0 +1,23 @@
+JAVA=java
+JAVAC=javac
+JFLEX=jflex
+CUP=$(JAVA) java_cup.Main <
+
+all: test
+
+test: output.txt
+	@(diff output.txt output.good && echo "Test OK!") || echo "Test failed!"
+
+output.txt: Yylex.class test.txt
+	$(JAVA) Yylex test.txt > output.txt
+
+Yylex.class: Yylex.java Yytoken.java Utility.java
+
+%.class: %.java
+	$(JAVAC) $^
+
+Yylex.java: simple.flex
+	$(JFLEX) simple.flex
+
+clean:
+	rm -f Yylex.java output.txt *.class *~
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/README	(revision 25584)
@@ -0,0 +1,29 @@
+This directory contains a scanner for a toy programming language.
+
+It is the example from the JLex website with some small modifications,
+to make it a bit more readable.
+
+It does nothing really useful, because there is no parser for the
+toy programming language. It's just a demonstatration how a small simple
+scanner looks like.
+
+files:
+
+YYtoken.java:
+  the tokens returned by the scanner
+
+Utility.java:
+  small class collecting some utility functions
+
+simple.flex:
+  the example specification
+
+test.txt:
+  sample input
+
+output.good:
+  output matching the sample input from test.txt
+
+Makefile: (for Unix only)
+  make          to generate scanner and run test
+  make clean    to remove generated files
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Utility.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Utility.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Utility.java	(revision 25584)
@@ -0,0 +1,19 @@
+class Utility {
+  
+  private static final String errorMsg[] = {
+    "Error: Unmatched end-of-comment punctuation.",
+    "Error: Unmatched start-of-comment punctuation.",
+    "Error: Unclosed string.",
+    "Error: Illegal character."
+    };
+  
+  public static final int E_ENDCOMMENT = 0; 
+  public static final int E_STARTCOMMENT = 1; 
+  public static final int E_UNCLOSEDSTR = 2; 
+  public static final int E_UNMATCHED = 3; 
+
+  public static void error(int code) {
+	  System.out.println(errorMsg[code]);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Yytoken.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Yytoken.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/Yytoken.java	(revision 25584)
@@ -0,0 +1,24 @@
+class Yytoken {
+  public int m_index;
+  public String m_text;
+  public int m_line;
+  public int m_charBegin;
+  public int m_charEnd;
+  
+  Yytoken (int index, String text, int line, int charBegin, int charEnd) {
+     m_index = index;
+    m_text = text;
+    m_line = line;
+    m_charBegin = charBegin;
+    m_charEnd = charEnd;
+  }
+
+  public String toString() {
+    return "Text   : "+m_text+
+           "\nindex : "+m_index+
+           "\nline  : "+m_line+
+           "\ncBeg. : "+m_charBegin+
+           "\ncEnd. : "+m_charEnd;
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/output.good
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/output.good	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/output.good	(revision 25584)
@@ -0,0 +1,660 @@
+line: 1 match: --class--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : class
+index : 43
+line  : 0
+cBeg. : 0
+cEnd. : 5
+line: 1 match: -- --
+action [76] {  }
+line: 1 match: --Utility--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : Utility
+index : 43
+line  : 0
+cBeg. : 6
+cEnd. : 13
+line: 1 match: -- --
+action [76] {  }
+line: 1 match: --{--
+action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+Text   : {
+index : 7
+line  : 0
+cBeg. : 14
+cEnd. : 15
+line: 1 match: --
+  
+  --
+action [76] {  }
+line: 3 match: --private--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : private
+index : 43
+line  : 2
+cBeg. : 21
+cEnd. : 28
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 2
+cBeg. : 29
+cEnd. : 35
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 2
+cBeg. : 36
+cEnd. : 41
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --String--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : String
+index : 43
+line  : 2
+cBeg. : 42
+cEnd. : 48
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --errorMsg--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : errorMsg
+index : 43
+line  : 2
+cBeg. : 49
+cEnd. : 57
+line: 3 match: --[--
+action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); }
+Text   : [
+index : 5
+line  : 2
+cBeg. : 57
+cEnd. : 58
+line: 3 match: --]--
+action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); }
+Text   : ]
+index : 6
+line  : 2
+cBeg. : 58
+cEnd. : 59
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 2
+cBeg. : 60
+cEnd. : 61
+line: 3 match: -- --
+action [76] {  }
+line: 3 match: --{--
+action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+Text   : {
+index : 7
+line  : 2
+cBeg. : 62
+cEnd. : 63
+line: 3 match: --
+    --
+action [76] {  }
+line: 4 match: --"Error: Unmatched end-of-comment punctuation."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Unmatched end-of-comment punctuation.
+index : 40
+line  : 3
+cBeg. : 68
+cEnd. : 114
+line: 4 match: --,--
+action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+Text   : ,
+index : 0
+line  : 3
+cBeg. : 114
+cEnd. : 115
+line: 4 match: --
+    --
+action [76] {  }
+line: 5 match: --"Error: Unmatched start-of-comment punctuation."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Unmatched start-of-comment punctuation.
+index : 40
+line  : 4
+cBeg. : 120
+cEnd. : 168
+line: 5 match: --,--
+action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+Text   : ,
+index : 0
+line  : 4
+cBeg. : 168
+cEnd. : 169
+line: 5 match: --
+    --
+action [76] {  }
+line: 6 match: --"Error: Unclosed string."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Unclosed string.
+index : 40
+line  : 5
+cBeg. : 174
+cEnd. : 199
+line: 6 match: --,--
+action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+Text   : ,
+index : 0
+line  : 5
+cBeg. : 199
+cEnd. : 200
+line: 6 match: --
+    --
+action [76] {  }
+line: 7 match: --"Error: Illegal character."--
+action [57] { String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); }
+Text   : Error: Illegal character.
+index : 40
+line  : 6
+cBeg. : 205
+cEnd. : 232
+line: 7 match: --
+    --
+action [76] {  }
+line: 8 match: --}--
+action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+Text   : }
+index : 8
+line  : 7
+cBeg. : 237
+cEnd. : 238
+line: 8 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 7
+cBeg. : 238
+cEnd. : 239
+line: 8 match: --
+  
+  --
+action [76] {  }
+line: 10 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 9
+cBeg. : 245
+cEnd. : 251
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 9
+cBeg. : 252
+cEnd. : 258
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 9
+cBeg. : 259
+cEnd. : 264
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 9
+cBeg. : 265
+cEnd. : 268
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --E_ENDCOMMENT--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_ENDCOMMENT
+index : 43
+line  : 9
+cBeg. : 269
+cEnd. : 281
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 9
+cBeg. : 282
+cEnd. : 283
+line: 10 match: -- --
+action [76] {  }
+line: 10 match: --0--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 0
+index : 42
+line  : 9
+cBeg. : 284
+cEnd. : 285
+line: 10 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 9
+cBeg. : 285
+cEnd. : 286
+line: 10 match: -- 
+  --
+action [76] {  }
+line: 11 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 10
+cBeg. : 290
+cEnd. : 296
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 10
+cBeg. : 297
+cEnd. : 303
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 10
+cBeg. : 304
+cEnd. : 309
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 10
+cBeg. : 310
+cEnd. : 313
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --E_STARTCOMMENT--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_STARTCOMMENT
+index : 43
+line  : 10
+cBeg. : 314
+cEnd. : 328
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 10
+cBeg. : 329
+cEnd. : 330
+line: 11 match: -- --
+action [76] {  }
+line: 11 match: --1--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 1
+index : 42
+line  : 10
+cBeg. : 331
+cEnd. : 332
+line: 11 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 10
+cBeg. : 332
+cEnd. : 333
+line: 11 match: -- 
+  --
+action [76] {  }
+line: 12 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 11
+cBeg. : 337
+cEnd. : 343
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 11
+cBeg. : 344
+cEnd. : 350
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 11
+cBeg. : 351
+cEnd. : 356
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 11
+cBeg. : 357
+cEnd. : 360
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --E_UNCLOSEDSTR--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_UNCLOSEDSTR
+index : 43
+line  : 11
+cBeg. : 361
+cEnd. : 374
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 11
+cBeg. : 375
+cEnd. : 376
+line: 12 match: -- --
+action [76] {  }
+line: 12 match: --2--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 2
+index : 42
+line  : 11
+cBeg. : 377
+cEnd. : 378
+line: 12 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 11
+cBeg. : 378
+cEnd. : 379
+line: 12 match: -- 
+  --
+action [76] {  }
+line: 13 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 12
+cBeg. : 383
+cEnd. : 389
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 12
+cBeg. : 390
+cEnd. : 396
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --final--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : final
+index : 43
+line  : 12
+cBeg. : 397
+cEnd. : 402
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 12
+cBeg. : 403
+cEnd. : 406
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --E_UNMATCHED--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : E_UNMATCHED
+index : 43
+line  : 12
+cBeg. : 407
+cEnd. : 418
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --=--
+action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+Text   : =
+index : 14
+line  : 12
+cBeg. : 419
+cEnd. : 420
+line: 13 match: -- --
+action [76] {  }
+line: 13 match: --3--
+action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : 3
+index : 42
+line  : 12
+cBeg. : 421
+cEnd. : 422
+line: 13 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 12
+cBeg. : 422
+cEnd. : 423
+line: 13 match: -- 
+
+  --
+action [76] {  }
+line: 15 match: --public--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : public
+index : 43
+line  : 14
+cBeg. : 428
+cEnd. : 434
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --static--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : static
+index : 43
+line  : 14
+cBeg. : 435
+cEnd. : 441
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --void--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : void
+index : 43
+line  : 14
+cBeg. : 442
+cEnd. : 446
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --error--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : error
+index : 43
+line  : 14
+cBeg. : 447
+cEnd. : 452
+line: 15 match: --(--
+action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); }
+Text   : (
+index : 3
+line  : 14
+cBeg. : 452
+cEnd. : 453
+line: 15 match: --int--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : int
+index : 43
+line  : 14
+cBeg. : 453
+cEnd. : 456
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --code--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : code
+index : 43
+line  : 14
+cBeg. : 457
+cEnd. : 461
+line: 15 match: --)--
+action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); }
+Text   : )
+index : 4
+line  : 14
+cBeg. : 461
+cEnd. : 462
+line: 15 match: -- --
+action [76] {  }
+line: 15 match: --{--
+action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+Text   : {
+index : 7
+line  : 14
+cBeg. : 463
+cEnd. : 464
+line: 15 match: --
+	  --
+action [76] {  }
+line: 16 match: --System--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : System
+index : 43
+line  : 15
+cBeg. : 468
+cEnd. : 474
+line: 16 match: --.--
+action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); }
+Text   : .
+index : 9
+line  : 15
+cBeg. : 474
+cEnd. : 475
+line: 16 match: --out--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : out
+index : 43
+line  : 15
+cBeg. : 475
+cEnd. : 478
+line: 16 match: --.--
+action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); }
+Text   : .
+index : 9
+line  : 15
+cBeg. : 478
+cEnd. : 479
+line: 16 match: --println--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : println
+index : 43
+line  : 15
+cBeg. : 479
+cEnd. : 486
+line: 16 match: --(--
+action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); }
+Text   : (
+index : 3
+line  : 15
+cBeg. : 486
+cEnd. : 487
+line: 16 match: --errorMsg--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : errorMsg
+index : 43
+line  : 15
+cBeg. : 487
+cEnd. : 495
+line: 16 match: --[--
+action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); }
+Text   : [
+index : 5
+line  : 15
+cBeg. : 495
+cEnd. : 496
+line: 16 match: --code--
+action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }
+Text   : code
+index : 43
+line  : 15
+cBeg. : 496
+cEnd. : 500
+line: 16 match: --]--
+action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); }
+Text   : ]
+index : 6
+line  : 15
+cBeg. : 500
+cEnd. : 501
+line: 16 match: --)--
+action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); }
+Text   : )
+index : 4
+line  : 15
+cBeg. : 501
+cEnd. : 502
+line: 16 match: --;--
+action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+Text   : ;
+index : 2
+line  : 15
+cBeg. : 502
+cEnd. : 503
+line: 16 match: --
+  --
+action [76] {  }
+line: 17 match: --}--
+action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+Text   : }
+index : 8
+line  : 16
+cBeg. : 506
+cEnd. : 507
+line: 17 match: --
+--
+action [76] {  }
+line: 18 match: --}--
+action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+Text   : }
+index : 8
+line  : 17
+cBeg. : 508
+cEnd. : 509
+line: 18 match: --
+
+--
+action [76] {  }
+null
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/simple.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/simple.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/simple.flex	(revision 25584)
@@ -0,0 +1,86 @@
+/* this is the scanner example from the JLex website 
+   (with small modifications to make it more readable) */
+
+%%
+
+%{
+  private int comment_count = 0;
+%} 
+
+%line
+%char
+%state COMMENT
+%full
+
+%debug
+
+ALPHA=[A-Za-z]
+DIGIT=[0-9]
+NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012]
+NEWLINE=\r|\n|\r\n
+WHITE_SPACE_CHAR=[\n\r\ \t\b\012]
+STRING_TEXT=(\\\"|[^\n\r\"]|\\{WHITE_SPACE_CHAR}+\\)*
+COMMENT_TEXT=([^*/\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])*
+Ident = {ALPHA}({ALPHA}|{DIGIT}|_)*
+
+%% 
+
+<YYINITIAL> {
+  "," { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); }
+  ":" { return (new Yytoken(1,yytext(),yyline,yychar,yychar+1)); }
+  ";" { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); }
+  "(" { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); }
+  ")" { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); }
+  "[" { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); }
+  "]" { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); }
+  "{" { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); }
+  "}" { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); }
+  "." { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); }
+  "+" { return (new Yytoken(10,yytext(),yyline,yychar,yychar+1)); }
+  "-" { return (new Yytoken(11,yytext(),yyline,yychar,yychar+1)); }
+  "*" { return (new Yytoken(12,yytext(),yyline,yychar,yychar+1)); }
+  "/" { return (new Yytoken(13,yytext(),yyline,yychar,yychar+1)); }
+  "=" { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); }
+  "<>" { return (new Yytoken(15,yytext(),yyline,yychar,yychar+2)); }
+  "<"  { return (new Yytoken(16,yytext(),yyline,yychar,yychar+1)); }
+  "<=" { return (new Yytoken(17,yytext(),yyline,yychar,yychar+2)); }
+  ">"  { return (new Yytoken(18,yytext(),yyline,yychar,yychar+1)); }
+  ">=" { return (new Yytoken(19,yytext(),yyline,yychar,yychar+2)); }
+  "&"  { return (new Yytoken(20,yytext(),yyline,yychar,yychar+1)); }
+  "|"  { return (new Yytoken(21,yytext(),yyline,yychar,yychar+1)); }
+  ":=" { return (new Yytoken(22,yytext(),yyline,yychar,yychar+2)); }
+
+  {NONNEWLINE_WHITE_SPACE_CHAR}+ { }
+
+  "/*" { yybegin(COMMENT); comment_count++; }
+
+  \"{STRING_TEXT}\" {
+    String str =  yytext().substring(1,yylength()-1);
+    return (new Yytoken(40,str,yyline,yychar,yychar+yylength()));
+  }
+  
+  \"{STRING_TEXT} {
+    String str =  yytext().substring(1,yytext().length());
+    Utility.error(Utility.E_UNCLOSEDSTR);
+    return (new Yytoken(41,str,yyline,yychar,yychar + str.length()));
+  } 
+  
+  {DIGIT}+ { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); }  
+
+  {Ident} { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); }  
+}
+
+<COMMENT> {
+  "/*" { comment_count++; }
+  "*/" { if (--comment_count == 0) yybegin(YYINITIAL); }
+  {COMMENT_TEXT} { }
+}
+
+
+{NEWLINE} { }
+
+. {
+  System.out.println("Illegal character: <" + yytext() + ">");
+	Utility.error(Utility.E_UNMATCHED);
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/test.txt
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/test.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/simple/test.txt	(revision 25584)
@@ -0,0 +1,19 @@
+class Utility {
+  
+  private static final String errorMsg[] = {
+    "Error: Unmatched end-of-comment punctuation.",
+    "Error: Unmatched start-of-comment punctuation.",
+    "Error: Unclosed string.",
+    "Error: Illegal character."
+    };
+  
+  public static final int E_ENDCOMMENT = 0; 
+  public static final int E_STARTCOMMENT = 1; 
+  public static final int E_UNCLOSEDSTR = 2; 
+  public static final int E_UNMATCHED = 3; 
+
+  public static void error(int code) {
+	  System.out.println(errorMsg[code]);
+  }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/pom.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/pom.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/pom.xml	(revision 25584)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>de.flex.examples</groupId>
+    <artifactId>parent</artifactId>
+    <version>1</version>
+  </parent>
+  <artifactId>standalone-maven</artifactId>
+  <version>0.1</version>
+  <name>A standalone test substitution scanner</name>
+  <description>This is a small example of a standalone text substitution scanner.
+
+It reads a name after the keyword name and replaces all occurences
+of "hello" by "hello &lt;name&gt; !".&lt;/name&gt;</description>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/main/jflex/standalone.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/main/jflex/standalone.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/main/jflex/standalone.flex	(revision 25584)
@@ -0,0 +1,45 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+   This is a small example of a standalone text substitution scanner 
+   It reads a name after the keyword name and substitutes all occurences 
+   of "hello" with "hello <name>!". There is a sample input file 
+   "sample.inp" provided in this directory 
+*/
+
+package de.jflex.example.standalone;
+
+%%
+
+%public
+%class Subst
+%standalone
+
+%unicode
+
+%{
+  String name;
+%}
+
+%%
+
+"name " [a-zA-Z]+  { name = yytext().substring(5); }
+[Hh] "ello"        { System.out.print(yytext()+" "+name+"!"); }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/java/de/jflex/example/standalone/SubstTest.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/java/de/jflex/example/standalone/SubstTest.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/java/de/jflex/example/standalone/SubstTest.java	(revision 25584)
@@ -0,0 +1,46 @@
+package de.jflex.example.standalone;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.Reader;
+import junit.framework.TestCase;
+
+
+
+public class SubstTest extends TestCase {
+	private static final String OUTPUT_FILE = "target/sample.out";
+
+	public void testSample() throws IOException {
+		// the standalon Subst prints status on stdout
+		// redirecte it into a file
+		String[] argv = new String[1];
+		argv[0] = "src/test/resources/sample.in";
+		File actual = new File(OUTPUT_FILE);
+		actual.delete();
+		FileOutputStream fos = new FileOutputStream(OUTPUT_FILE, true);
+		System.setOut(new PrintStream(fos));
+
+		Subst.main(argv);
+
+		fos.close();
+
+		BufferedReader actualContent = new BufferedReader(new FileReader(
+				actual));
+
+		// the expected result is in a file
+		Reader expected = new FileReader("src/test/resources/sample.expected");
+		BufferedReader expectedContent = new BufferedReader(expected);
+
+		String expectedLine, actualLine;
+		do {
+			expectedLine = expectedContent.readLine();
+			actualLine = actualContent.readLine();
+
+			assertEquals(expectedLine, actualLine);
+		} while (expectedLine != null);
+	}
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/resources/sample.expected
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/resources/sample.expected	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/resources/sample.expected	(revision 25584)
@@ -0,0 +1,8 @@
+
+
+Hello someone!
+This is a sample input file for the
+standalone example scanner.
+
+Have a nice day!
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/resources/sample.in
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/resources/sample.in	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone-maven/src/test/resources/sample.in	(revision 25584)
@@ -0,0 +1,8 @@
+name someone
+
+Hello
+This is a sample input file for the
+standalone example scanner.
+
+Have a nice day!
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/Makefile
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/Makefile	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/Makefile	(revision 25584)
@@ -0,0 +1,13 @@
+all: run
+
+run: Subst.class
+	java Subst sample.inp
+
+Subst.class: Subst.java
+	javac Subst.java
+
+Subst.java: standalone.flex
+	jflex standalone.flex
+
+clean:
+	rm -rf *.class *~ *.java
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/README	(revision 25584)
@@ -0,0 +1,20 @@
+This is a small example of a standalone text substitution scanner.
+
+It reads a name after the keyword name and replaces all occurences
+of "hello" by "hello <name> !". 
+
+sample.inp
+  contains a sample input for the scanner
+
+standalone.flex
+  the lexical specification for the scanner
+
+build.xml
+  ant build file
+
+to run the example use ant or type:
+
+jflex standalone.flex
+javac Subst.java
+java Subst sample.inp
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/build.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/build.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/build.xml	(revision 25584)
@@ -0,0 +1,23 @@
+<project name="standalone" default="run">
+
+  <taskdef classname="JFlex.anttask.JFlexTask" name="jflex" />
+
+  <target name="run" depends="compile">
+    <java classname="Subst"> <arg line="sample.inp"/> </java>
+  </target>
+
+  <target name="compile" depends="jflex"> 
+  	<javac srcdir="." destdir="."/>  
+  </target>
+
+  <target name="jflex"> <jflex file="standalone.flex"/> </target>
+
+  <target name="clean">
+    <delete file="Subst.java"/>
+    <delete>      
+      <fileset dir="." includes="**/*~"/>
+      <fileset dir="." includes="**/*.class"/>
+    </delete>
+  </target>
+
+</project>
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/sample.inp
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/sample.inp	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/sample.inp	(revision 25584)
@@ -0,0 +1,8 @@
+name someone
+
+Hello
+This is a sample input file for the
+standalone example scanner.
+
+Have a nice day!
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/standalone.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/standalone.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/examples/standalone/standalone.flex	(revision 25584)
@@ -0,0 +1,44 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+   This is a small example of a standalone text substitution scanner 
+   It reads a name after the keyword name and substitutes all occurences 
+   of "hello" with "hello <name>!". There is a sample input file 
+   "sample.inp" provided in this directory 
+*/
+
+%%
+
+%public
+%class Subst
+%standalone
+
+%unicode
+
+%{
+  String name;
+%}
+
+%%
+
+"name " [a-zA-Z]+  { name = yytext().substring(5); }
+[Hh] "ello"        { System.out.print(yytext()+" "+name+"!"); }
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/lib/jflex-mode.el
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/lib/jflex-mode.el	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/lib/jflex-mode.el	(revision 25584)
@@ -0,0 +1,114 @@
+; -*- Mode: Emacs-Lisp; -*- 
+
+;;;  jflex-mode
+
+;;;  author: Gerwin Klein <lsf@jflex.de>
+;;;  $Revision: 50 $, $Date: 2003-06-08 21:01:12 +1000 (Sun, 08 Jun 2003) $
+
+(require 'derived)
+(require 'font-lock)
+
+(define-derived-mode jflex-mode java-mode "JFlex"
+  "Major mode for editing JFlex files"
+  
+  ;; set the indentation 
+  (setq c-basic-offset 2)
+
+  (c-set-offset 'knr-argdecl-intro 0)
+  (c-set-offset 'topmost-intro-cont 0)
+
+  ;; remove auto and hungry anything
+  (c-toggle-auto-hungry-state -1)
+  (c-toggle-auto-state -1)
+  (c-toggle-hungry-state -1)
+
+  (use-local-map jflex-mode-map)
+
+  ;; get rid of that damn electric-brace
+  (define-key jflex-mode-map "{"	'self-insert-command)
+  (define-key jflex-mode-map "}"	'self-insert-command)
+
+  (define-key jflex-mode-map [tab] 'jflex-indent-command)
+
+  )
+
+(defalias 'jflex-indent-command 'c-indent-command)
+
+(defconst jflex-font-lock-keywords
+  (append 
+   '( 
+     ("^%%" . font-lock-reference-face) 
+     "^%{"
+     "^%init{"
+     "^%initthrow{"
+     "^%eof{"
+     "^%eofthrow{"
+     "^%yylexthrow{"
+     "^%eofval{"
+     "^%}"
+     "^%init}"
+     "^%initthrow}"
+     "^%eof}"
+     "^%eofthrow}"
+     "^%yylexthrow}"
+     "^%eofval}"
+     "^%standalone"        
+     "^%scanerror"
+     "^%switch"
+     "^%states" ; fixme: state identifiers
+     "^%state"
+     "^%s"
+     "^%xstates"
+     "^%xstate"
+     "^%x"
+     "^%char"  
+     "^%line"     
+     "^%column"
+     "^%byaccj"
+     "^%cupsym"
+     "^%cupdebug" 
+     "^%cup"
+     "^%eofclose"    
+     "^%class"
+     "^%function"
+     "^%type"
+     "^%integer"
+     "^%intwrap"         
+     "^%int"
+     "^%yyeof"
+     "^%notunix"
+     "^%7bit"      
+     "^%full"
+     "^%8bit"
+     "^%unicode"
+     "^%16bit"
+     "^%caseless"
+     "^%ignorecase"
+     "^%implements"
+     "^%extends"
+     "^%public"
+     "^%apiprivate"
+     "^%final"    
+     "^%abstract"    
+     "^%debug"          
+     "^%table"
+     "^%pack"
+     "^%include"
+     "^%buffer"
+     "^%initthrow"
+     "^%eofthrow"
+     "^%yylexthrow"
+     "^%throws"
+     ("%[%{}0-9a-zA-Z]+" . font-lock-warning-face) ; errors
+     ("{[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*}" . font-lock-variable-name-face) ; macro uses
+     "<<EOF>>" ; special <<EOF>> symbol
+     ("<[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\(,[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\)*>" . font-lock-type-face) ; lex state list
+     )
+   java-font-lock-keywords-2)
+  "JFlex keywords for font-lock mode")
+
+(put 'jflex-mode 'font-lock-defaults
+	 '(jflex-font-lock-keywords      
+	   nil nil ((?_ . "w")) beginning-of-defun))
+
+(provide 'jflex-mode)
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/lib/jflex.vim
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/lib/jflex.vim	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/lib/jflex.vim	(revision 25584)
@@ -0,0 +1,149 @@
+" Vim syntax file
+" Language:         JFlex
+" Maintainer:       Gerwin Klein <lsf@jflex.de>
+" Last Change:      $Revision: 50 $, $Date: 2003-06-08 21:01:12 +1000 (Sun, 08 Jun 2003) $
+
+" Thanks to Michael Brailsford for help and suggestions
+
+" Quit when a syntax file was already loaded	{{{
+if exists("b:current_syntax")
+	finish
+endif
+"}}}
+
+" Include java syntax {{{
+if version >= 600
+	runtime! syntax/java.vim
+	unlet b:current_syntax 
+else
+	so $VIMRUNTIME/syntax/java.vim
+endif
+"}}}
+
+syn cluster jflexOptions contains=jflexOption,jflexCodeInclude,jflexComment,jflexMacroIdent,jflexMacroRegExp,jflexOptionError
+syn cluster jflexRules contains=jflexRule,jflexComment,jflexActionCode,jflexRuleStates,jflexRegExp
+
+" java code section
+syn region jflexStart start="/\*\|//\|import\|package\|class"me=s end="^%%"me=e-2 contains=@javaTop nextgroup=jflexOptionReg
+
+" %% 
+" options 
+syn region jflexOptionReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexOptions nextgroup=jflexRulesReg
+
+syn match jflexOptionError "%\i*" contained
+
+syn match jflexOption "^\(%s\|%x\)" contained
+syn match jflexOption "^%state" contained
+syn match jflexOption "^%states" contained
+syn match jflexOption "^%xstate" contained
+syn match jflexOption "^%xstates" contained
+syn match jflexOption "^%char" contained
+syn match jflexOption "^%line" contained
+syn match jflexOption "^%column" contained
+syn match jflexOption "^%byaccj" contained
+syn match jflexOption "^%cup" contained
+syn match jflexOption "^%cupsym" contained
+syn match jflexOption "^%cupdebug" contained
+syn match jflexOption "^%eofclose" contained
+syn match jflexOption "^%class" contained
+syn match jflexOption "^%function" contained
+syn match jflexOption "^%type" contained
+syn match jflexOption "^%integer" contained
+syn match jflexOption "^%int" contained
+syn match jflexOption "^%intwrap" contained
+syn match jflexOption "^%yyeof" contained
+syn match jflexOption "^%notunix" contained
+syn match jflexOption "^%7bit" contained
+syn match jflexOption "^%8bit" contained
+syn match jflexOption "^%full" contained
+syn match jflexOption "^%16bit" contained
+syn match jflexOption "^%unicode" contained
+syn match jflexOption "^%caseless" contained
+syn match jflexOption "^%ignorecase" contained
+syn match jflexOption "^%implements" contained
+syn match jflexOption "^%extends" contained
+syn match jflexOption "^%public" contained
+syn match jflexOption "^%apiprivate" contained
+syn match jflexOption "^%final" contained
+syn match jflexOption "^%abstract" contained
+syn match jflexOption "^%debug" contained
+syn match jflexOption "^%standalone" contained
+syn match jflexOption "^%switch" contained
+syn match jflexOption "^%table" contained
+syn match jflexOption "^%pack" contained
+syn match jflexOption "^%include" contained
+syn match jflexOption "^%buffer" contained
+syn match jflexOption "^%initthrow" contained
+syn match jflexOption "^%eofthrow" contained
+syn match jflexOption "^%yylexthrow" contained
+syn match jflexOption "^%throws" contained
+syn match jflexOption "^%scannerror" contained
+
+syn match jflexMacroIdent "\I\i*\s*="me=e-1 contained nextgroup=jflexMacroRegExp
+
+syn region jflexMacroRegExp matchgroup=jflexOperator start="=" end="^\(%\|\I\|\i\|/\)"me=e-1 contains=NONE contained
+
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%{" end="^%}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%init{" end="^%init}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%initthrow{" end="^%initthrow}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eof{" end="^%eof}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofthrow{" end="^%eofthrow}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%yylexthrow{" end="^%yylexthrow}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofval{" end="^%eofval}" contains=@javaTop contained
+
+" rules (end pattern shouldn't occur, if it does anyway we just stay in jflexRulesReg)
+syn region jflexRulesReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexRules 
+
+" at first everything but strings is a regexp
+syn match jflexRegExp "\([^\" \t]\|\\\"\)\+" contained
+
+" take out comments
+syn match jflexComment "//.*" contained
+syn region jflexComment start="/\*" end="\*/" contained contains=jflexComment
+
+" lex states
+syn match jflexRuleStates "<\s*\I\i*\(\s*,\s*\I\i*\)*\s*>" contained skipnl skipwhite nextgroup=jflexStateGroup
+
+" action code (only after states braces and macro use)
+syn region jflexActionCode matchgroup=Delimiter start="{" end="}" contained contains=@javaTop,jflexJavaBraces
+
+" macro use
+syn match jflexRegExp "{\s*\I\i*\s*}" contained
+
+" state braces (only active after <state>)
+syn region jflexStateGroup matchgroup=jflexRuleStates start="{$" start="{\s" end="}" contained contains=@jflexRules
+
+" string
+syn region jflexRegExp matchgroup=String start=+"+ skip=+\\\\\|\\"+ end=+"+ contained
+
+" not to be confused with a state
+syn match jflexRegExp "<<EOF>>" contained
+
+" escape sequence
+syn match jflexRegExp "\\." contained
+
+
+" keep braces in actions balanced
+syn region jflexJavaBraces start="{" end="}" contained contains=@javaTop,jflexJavaBraces
+
+
+" syncing
+syn sync clear
+syn sync minlines=10
+syn sync match jflexSync grouphere jflexOptionReg "^%[a-z]"
+syn sync match jflexSync grouphere jflexRulesReg "^<"
+
+
+" highlighting
+hi link jflexOption      Special
+hi link jflexMacroIdent  Ident
+hi link jflexMacroRegExp Macro
+hi link jflexOptionError Error
+hi link jflexComment     Comment
+hi link jflexOperator    Operator
+hi link jflexRuleStates  Special
+hi link jflexRegExp      Function
+hi jflexSectionSep guifg=yellow ctermfg=yellow guibg=blue ctermbg=blue gui=bold cterm=bold
+hi link jflexCodeIncludeMark jflexSectionSep
+
+let b:current_syntax="jflex"
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Action.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Action.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Action.java	(revision 25584)
@@ -0,0 +1,261 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * Encapsulates an action in the specification.
+ *
+ * It stores the Java code as String together with a priority (line number in the specification).
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class Action {
+
+  /** A normal action */
+  public final static int NORMAL = 0;
+  /** Action of a lookahead expression r1/r2 with fixed length r1 */
+  public final static int FIXED_BASE = 1;
+  /** Action of a lookahead expression r1/r2 with fixed length r2 */
+  public final static int FIXED_LOOK = 2;
+  /** Action of a lookahead expression r1/r2 with a finite choice of 
+   *  fixed lengths in r2 */
+  public final static int FINITE_CHOICE = 3;
+  /** Action of a general lookahead expression */
+  public final static int GENERAL_LOOK = 4;
+  /** Action of the 2nd forward pass for lookahead */  
+  public final static int FORWARD_ACTION = 5;
+  /** Action of the backward pass for lookahead */  
+  public final static int BACKWARD_ACTION = 6;
+  
+  /**
+   * The Java code this Action represents
+   */
+  String content;
+
+  /**
+   * The priority (i.e. line number in the specification) of this Action. 
+   */
+  int priority;
+
+  /**
+   * Which kind of action this is.
+   * (normal, <code>a/b</code> with fixed length a, fixed length b, etc)
+   */
+  private int kind = NORMAL;
+
+  /** The length of the lookahead (if fixed) */ 
+  private int len;
+  
+  /** The entry state of the corresponding forward DFA (if general lookahead) */
+  private int entryState;
+
+  /**
+   * Creates a new Action object with specified content and line number.
+   * 
+   * @param content    java code
+   * @param priority   line number
+   */
+  public Action(String content, int priority) {
+    this.content = content.trim();
+    this.priority = priority;
+  }  
+
+  /**
+   * Creates a new Action object of the specified kind. Only
+   * accepts FORWARD_ACTION or BACKWARD_ACTION.
+   * 
+   * @param kind   the kind of action
+   * 
+   * @see #FORWARD_ACTION
+   * @see #BACKWARD_ACTION
+   */
+  public Action(int kind) {
+    if (kind != FORWARD_ACTION && kind != BACKWARD_ACTION)
+      throw new GeneratorException();
+    this.content = "";
+    this.priority = Integer.MAX_VALUE;
+    this.kind = kind;
+  }  
+
+  /**
+   * Compares the priority value of this Action with the specified action.
+   *
+   * @param other  the other Action to compare this Action with.
+   *
+   * @return this Action if it has higher priority - the specified one, if not.
+   */
+  public Action getHigherPriority(Action other) {
+    if (other == null) return this;
+
+    // the smaller the number the higher the priority
+    if (other.priority > this.priority) 
+      return this;
+    else
+      return other;
+  }
+
+
+  /**
+   * Returns the String representation of this object.
+   * 
+   * @return string representation of the action
+   */
+  public String toString() {
+    return "Action (priority "+priority+", lookahead "+kind+") :" +
+      Out.NL+content; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  }
+
+
+  /**
+   * Returns <code>true</code> iff the parameter is an
+   * Action with the same content as this one.
+   *
+   * @param a   the object to compare this Action with
+   * @return    true if the action strings are equal
+   */
+  public boolean isEquiv(Action a) {
+    return this == a || 
+           (this.content.equals(a.content) &&
+           this.kind == a.kind && 
+           this.len == a.len && 
+           this.entryState == a.entryState);
+  }
+
+
+  /**
+   * Calculate hash value.
+   * 
+   * @return a hash value for this Action
+   */
+  public int hashCode() {
+    return content.hashCode();
+  }
+
+
+  /**
+   * Test for equality to another object.
+   * 
+   * This action equals another object if the other 
+   * object is an equivalent action. 
+   * 
+   * @param o  the other object.
+   * 
+   * @see Action#isEquiv(Action)
+   */
+  public boolean equals(Object o) {
+    if (o instanceof Action) 
+      return isEquiv((Action) o);
+    else
+      return false;    
+  }
+  
+  /**
+   * Return true iff this is action belongs to a general lookahead rule.
+   * 
+   * @return true if this actions belongs to a general lookahead rule.
+   */
+  public boolean isGenLookAction() {
+    return kind == GENERAL_LOOK;
+  }
+  
+  /**
+   * Return true if code for this is action should be emitted, false
+   * if it is a BACK/FORWARD lookahead action.
+   * 
+   * @return true if code should be emitted for this action.
+   */
+  public boolean isEmittable() {
+    return kind != BACKWARD_ACTION && kind != FORWARD_ACTION;
+  }
+  
+  /**
+   * Return kind of lookahead.
+   */
+  public int lookAhead() {
+    return kind;
+  }
+
+  /**
+   * Sets the lookahead kind and data for this action
+   * 
+   * @param kind   which kind of lookahead it is
+   * @param data   the length for fixed length look aheads.
+   *   
+   */
+  public void setLookAction(int kind, int data) {
+    this.kind = kind;
+    this.len = data;
+  }
+  
+  /**
+   * The length of the lookahead or base if this is a fixed length
+   * lookahead action. 
+   */
+  public int getLookLength() {
+    return len;
+  }
+  
+  /**
+   * Return the corresponding entry state for the forward DFA (if this
+   * is a general lookahead expression) 
+   * 
+   * @return the forward DFA entry state (+1 is the backward DFA) 
+   */
+  public int getEntryState() {
+    return entryState;
+  }
+
+  /**
+   * Set the corresponding entry state for the forward DFA of this action
+   * (if this is a general lookahead expression) 
+   * 
+   * @param the entry state for the forward DFA of this action
+   */
+  public void setEntryState(int entryState) {
+    this.entryState = entryState;
+  }
+ 
+  public Action copyChoice(int length) {
+    Action a = new Action(this.content, this.priority);
+    a.setLookAction(FINITE_CHOICE, length);
+    return a;
+  }
+  
+  /**
+   * String representation of the lookahead kind of this action.
+   * 
+   * @return the string representation
+   */
+  public String lookString() {
+    switch (kind) {
+    case NORMAL: return "";
+    case BACKWARD_ACTION: return "LOOK_BACK";
+    case FIXED_BASE: return "FIXED_BASE";
+    case FIXED_LOOK: return "FIXED_LOOK";
+    case FINITE_CHOICE: return "FINITE_CHOICE";
+    case FORWARD_ACTION: return "LOOK_FORWARD";
+    case GENERAL_LOOK: return "LOOK_ACTION";
+    default: return "unknown lookahead type";
+    }
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClassException.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClassException.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClassException.java	(revision 25584)
@@ -0,0 +1,49 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+
+/**
+ * This Exception is used in class CharClasses.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class CharClassException extends RuntimeException {
+
+  /**
+   * Creates a new CharClassException without message
+   */
+  public CharClassException() {
+  }
+
+
+  /**
+   * Creates a new CharClassException with the specified message
+   *
+   * @param message   the error description presented to the user.
+   */
+  public CharClassException(String message) {
+    super(message);
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClassInterval.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClassInterval.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClassInterval.java	(revision 25584)
@@ -0,0 +1,73 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+/**
+ * Stores an interval of characters together with the character class
+ *
+ * A character belongs to an interval, if its Unicode value is greater than or equal
+ * to the Unicode value of <CODE>start</code> and smaller than or euqal to the Unicode
+ * value of <CODE>end</code>.
+ *
+ * All characters of the interval must belong to the same character class.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class CharClassInterval {
+
+  /**
+   * The first character of the interval
+   */
+  int start;
+
+  /**
+   * The last character of the interval
+   */
+  int end;
+
+  /**
+   * The code of the class all characters of this interval belong to.
+   */
+  int charClass;
+  
+
+  /**
+   * Creates a new CharClassInterval from <CODE>start</code> to <CODE>end</code>
+   * that belongs to character class <CODE>charClass</code>.
+   *
+   * @param start         The first character of the interval
+   * @param end           The last character of the interval  
+   * @param charClass     The code of the class all characters of this interval belong to.
+   */
+  public CharClassInterval(int start, int end, int charClass) {
+    this.start = start;
+    this.end = end;
+    this.charClass = charClass;
+  }
+
+  /**
+   * returns string representation of this class interval
+   */
+  public String toString() {
+    return "["+start+"-"+end+"="+charClass+"]";
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClasses.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClasses.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharClasses.java	(revision 25584)
@@ -0,0 +1,388 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.util.*;
+
+
+/**
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class CharClasses {
+
+  /** debug flag (for char classes only) */
+  private static final boolean DEBUG = false;
+
+  /** the largest character that can be used in char classes */
+  public static final char maxChar = '\uFFFF';
+
+  /** the char classes */
+  private Vector /* of IntCharSet */ classes;
+
+  /** the largest character actually used in a specification */
+  private char maxCharUsed;
+
+  /**
+   * Constructs a new CharClass object that provides space for 
+   * classes of characters from 0 to maxCharCode.
+   *
+   * Initially all characters are in class 0.
+   *
+   * @param maxCharCode the last character code to be
+   *                    considered. (127 for 7bit Lexers, 
+   *                    255 for 8bit Lexers and 0xFFFF
+   *                    for Unicode Lexers).
+   */
+  public CharClasses(int maxCharCode) {
+    if (maxCharCode < 0 || maxCharCode > 0xFFFF) 
+      throw new IllegalArgumentException();
+
+    maxCharUsed = (char) maxCharCode;
+
+    classes = new Vector();
+    classes.addElement(new IntCharSet(new Interval((char) 0, maxChar)));
+  }
+
+
+  /**
+   * Returns the greatest Unicode value of the current input character set.
+   */
+  public char getMaxCharCode() {
+    return maxCharUsed;
+  }
+  
+
+  /**
+   * Sets the largest Unicode value of the current input character set.
+   *
+   * @param charCode   the largest character code, used for the scanner 
+   *                   (i.e. %7bit, %8bit, %16bit etc.)
+   */
+  public void setMaxCharCode(int charCode) {
+    if (charCode < 0 || charCode > 0xFFFF) 
+      throw new IllegalArgumentException();
+
+    maxCharUsed = (char) charCode;
+  }
+  
+
+  /**
+   * Returns the current number of character classes.
+   */
+  public int getNumClasses() {
+    return classes.size();
+  }
+
+
+
+  /**
+   * Updates the current partition, so that the specified set of characters
+   * gets a new character class.
+   *
+   * Characters that are elements of <code>set</code> are not in the same
+   * equivalence class with characters that are not elements of <code>set</code>.
+   *
+   * @param set       the set of characters to distinguish from the rest    
+   * @param caseless  if true upper/lower/title case are considered equivalent  
+   */
+  public void makeClass(IntCharSet set, boolean caseless) {
+    if (caseless) set = set.getCaseless();
+    
+    if ( DEBUG ) {
+      Out.dump("makeClass("+set+")");
+      dump();
+    }
+
+    int oldSize = classes.size();
+    for (int i = 0; i < oldSize; i++) {
+      IntCharSet x  = (IntCharSet) classes.elementAt(i);
+
+      if (x.equals(set)) return;
+
+      IntCharSet and = x.and(set);
+
+      if ( and.containsElements() ) {
+        if ( x.equals(and) ) {          
+          set.sub(and);
+          continue;
+        }
+        else if ( set.equals(and) ) {
+          x.sub(and);
+          classes.addElement(and);
+          if (DEBUG) {
+            Out.dump("makeClass(..) finished");
+            dump();
+          }
+          return;
+        }
+
+        set.sub(and);
+        x.sub(and);
+        classes.addElement(and);
+      }
+    }
+    
+    if (DEBUG) {
+      Out.dump("makeClass(..) finished");
+      dump();
+    }
+  }
+  
+
+  /**
+   * Returns the code of the character class the specified character belongs to.
+   */
+  public int getClassCode(char letter) {
+    int i = -1;
+    while (true) {
+      IntCharSet x = (IntCharSet) classes.elementAt(++i);
+      if ( x.contains(letter) ) return i;      
+    }
+  }
+
+  /**
+   * Dump charclasses to the dump output stream
+   */
+  public void dump() {
+    Out.dump(toString());
+  }  
+
+  
+  /**
+   * Return a string representation of one char class
+   *
+   * @param theClass  the index of the class to
+   */
+  public String toString(int theClass) {
+    return classes.elementAt(theClass).toString();
+  }
+
+
+  /**
+   * Return a string representation of the char classes
+   * stored in this class. 
+   *
+   * Enumerates the classes by index.
+   */
+  public String toString() {
+    StringBuffer result = new StringBuffer("CharClasses:");
+
+    result.append(Out.NL);
+
+    for (int i = 0; i < classes.size(); i++) 
+      result.append("class "+i+":"+Out.NL+classes.elementAt(i)+Out.NL);    
+    
+    return result.toString();
+  }
+
+  
+  /**
+   * Creates a new character class for the single character <code>singleChar</code>.
+   *    
+   * @param caseless  if true upper/lower/title case are considered equivalent  
+   */
+  public void makeClass(char singleChar, boolean caseless) {
+    makeClass(new IntCharSet(singleChar), caseless);
+  }
+
+
+  /**
+   * Creates a new character class for each character of the specified String.
+   *    
+   * @param caseless  if true upper/lower/title case are considered equivalent  
+   */
+  public void makeClass(String str, boolean caseless) {
+    for (int i = 0; i < str.length(); i++) makeClass(str.charAt(i), caseless);
+  }  
+
+
+  /**
+   * Updates the current partition, so that the specified set of characters
+   * gets a new character class.
+   *
+   * Characters that are elements of the set <code>v</code> are not in the same
+   * equivalence class with characters that are not elements of the set <code>v</code>.
+   *
+   * @param v   a Vector of Interval objects. 
+   *            This Vector represents a set of characters. The set of characters is
+   *            the union of all intervals in the Vector.
+   *    
+   * @param caseless  if true upper/lower/title case are considered equivalent  
+   */
+  public void makeClass(Vector /* Interval */ v, boolean caseless) {
+    makeClass(new IntCharSet(v), caseless);
+  }
+  
+
+  /**
+   * Updates the current partition, so that the set of all characters not contained in the specified 
+   * set of characters gets a new character class.
+   *
+   * Characters that are elements of the set <code>v</code> are not in the same
+   * equivalence class with characters that are not elements of the set <code>v</code>.
+   *
+   * This method is equivalent to <code>makeClass(v)</code>
+   * 
+   * @param v   a Vector of Interval objects. 
+   *            This Vector represents a set of characters. The set of characters is
+   *            the union of all intervals in the Vector.
+   * 
+   * @param caseless  if true upper/lower/title case are considered equivalent  
+   */
+  public void makeClassNot(Vector v, boolean caseless) {
+    makeClass(new IntCharSet(v), caseless);
+  }
+
+
+  /**
+   * Returns an array that contains the character class codes of all characters
+   * in the specified set of input characters.
+   */
+  private int [] getClassCodes(IntCharSet set, boolean negate) {
+
+    if (DEBUG) {
+      Out.dump("getting class codes for "+set);
+      if (negate)
+        Out.dump("[negated]");
+    }
+
+    int size = classes.size();
+
+    // [fixme: optimize]
+    int temp [] = new int [size];
+    int length  = 0;
+
+    for (int i = 0; i < size; i++) {
+      IntCharSet x = (IntCharSet) classes.elementAt(i);
+      if ( negate ) {
+        if ( !set.and(x).containsElements() ) {
+          temp[length++] = i;
+          if (DEBUG) Out.dump("code "+i);
+        }
+      }
+      else {
+        if ( set.and(x).containsElements() ) {
+          temp[length++] = i;
+          if (DEBUG) Out.dump("code "+i);
+        }
+      }
+    }
+
+    int result [] = new int [length];
+    System.arraycopy(temp, 0, result, 0, length);
+    
+    return result;
+  }
+
+
+  /**
+   * Returns an array that contains the character class codes of all characters
+   * in the specified set of input characters.
+   * 
+   * @param intervallVec   a Vector of Intervals, the set of characters to get
+   *                       the class codes for
+   *
+   * @return an array with the class codes for intervallVec
+   */
+  public int [] getClassCodes(Vector /* Interval */ intervallVec) {
+    return getClassCodes(new IntCharSet(intervallVec), false);
+  }
+
+
+  /**
+   * Returns an array that contains the character class codes of all characters
+   * that are <strong>not</strong> in the specified set of input characters.
+   * 
+   * @param intervallVec   a Vector of Intervals, the complement of the
+   *                       set of characters to get the class codes for
+   *
+   * @return an array with the class codes for the complement of intervallVec
+   */
+  public int [] getNotClassCodes(Vector /* Interval */ intervallVec) {
+    return getClassCodes(new IntCharSet(intervallVec), true);
+  }
+
+
+  /**
+   * Check consistency of the stored classes [debug].
+   *
+   * all classes must be disjoint, checks if all characters
+   * have a class assigned.
+   */
+  public void check() {
+    for (int i = 0; i < classes.size(); i++)
+      for (int j = i+1; j < classes.size(); j++) {
+        IntCharSet x = (IntCharSet) classes.elementAt(i);
+        IntCharSet y = (IntCharSet) classes.elementAt(j);
+        if ( x.and(y).containsElements() ) {
+          System.out.println("Error: non disjoint char classes "+i+" and "+j);
+          System.out.println("class "+i+": "+x);
+          System.out.println("class "+j+": "+y);
+        }
+      }
+
+    // check if each character has a classcode 
+    // (= if getClassCode terminates)
+    for (char c = 0; c < maxChar; c++) {
+      getClassCode(c);
+      if (c % 100 == 0) System.out.print(".");
+    }
+    
+    getClassCode(maxChar);   
+  }
+
+
+  /**
+   * Returns an array of all CharClassIntervalls in this
+   * char class collection. 
+   *
+   * The array is ordered by char code, i.e.
+   * <code>result[i+1].start = result[i].end+1</code>
+   *
+   * Each CharClassInterval contains the number of the
+   * char class it belongs to.
+   */
+  public CharClassInterval [] getIntervals() {
+    int i, c;
+    int size = classes.size();
+    int numIntervalls = 0;   
+
+    for (i = 0; i < size; i++) 
+      numIntervalls+= ((IntCharSet) classes.elementAt(i)).numIntervalls();    
+
+    CharClassInterval [] result = new CharClassInterval[numIntervalls];
+    
+    i = 0; 
+    c = 0;
+    while (i < numIntervalls) {
+      int       code = getClassCode((char) c);
+      IntCharSet set = (IntCharSet) classes.elementAt(code);
+      Interval  iv  = set.getNext();
+      
+      result[i++]    = new CharClassInterval(iv.start, iv.end, code);
+      c              = iv.end+1;
+    }
+
+    return result;
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharSet.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharSet.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharSet.java	(revision 25584)
@@ -0,0 +1,112 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * 
+ * @author Gerwin Klein 
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ 
+ */
+public final class CharSet {
+
+  final static int BITS = 6;           // the number of bits to shift (2^6 = 64)
+  final static int MOD = (1<<BITS)-1;  // modulus
+  
+  long bits[];
+
+  private int numElements;
+  
+  
+  public CharSet() {
+    bits = new long[1];
+  }
+
+
+  public CharSet(int initialSize, int character) {
+    bits = new long[(initialSize >> BITS)+1];
+    add(character);
+  }
+
+
+  public void add(int character) {
+    resize(character);
+
+    if ( (bits[character >> BITS] & (1L << (character & MOD))) == 0) numElements++;
+
+    bits[character >> BITS] |= (1L << (character & MOD));    
+  }
+
+
+  private int nbits2size (int nbits) {
+    return ((nbits >> BITS) + 1);
+  }
+
+
+  private void resize(int nbits) {
+    int needed = nbits2size(nbits);
+
+    if (needed < bits.length) return;
+         
+    long newbits[] = new long[Math.max(bits.length*2,needed)];
+    System.arraycopy(bits, 0, newbits, 0, bits.length);
+    
+    bits = newbits;
+  }
+
+
+  public boolean isElement(int character) {
+    int index = character >> BITS;
+    if (index >= bits.length)  return false;
+    return (bits[index] & (1L << (character & MOD))) != 0;
+  }
+
+
+  public CharSetEnumerator characters() {
+    return new CharSetEnumerator(this);
+  }
+
+
+  public boolean containsElements() {
+    return numElements > 0;
+  }
+
+  public int size() {
+    return numElements;
+  }
+  
+  public String toString() {
+    CharSetEnumerator set = characters();
+
+    StringBuffer result = new StringBuffer("{");
+
+    if ( set.hasMoreElements() ) result.append(""+set.nextElement());
+
+    while ( set.hasMoreElements() ) {
+      int i = set.nextElement();
+      result.append( ", "+i);
+    }
+
+    result.append("}");
+
+    return result.toString();
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharSetEnumerator.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharSetEnumerator.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CharSetEnumerator.java	(revision 25584)
@@ -0,0 +1,88 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * Enumerator for the elements of a CharSet.
+ *
+ * Does not implement java.util.Enumeration, but supports the same protocol.
+ *  
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class CharSetEnumerator {
+
+  private int index;
+  private int offset;
+  private long mask = 1;
+
+  private CharSet set;
+  
+  public CharSetEnumerator(CharSet characters) {
+    set = characters;
+
+    while (index < set.bits.length && set.bits[index] == 0) 
+      index++;
+
+    if (index >= set.bits.length) return;
+        
+    while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)) {
+      mask<<= 1;
+      offset++;
+    }
+  }
+
+  private void advance() {
+    do {
+      offset++;
+      mask<<= 1;
+    } while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0));
+
+    if (offset > CharSet.MOD) {
+      do 
+        index++;
+      while (index < set.bits.length && set.bits[index] == 0);
+        
+      if (index >= set.bits.length) return;
+        
+      offset = 0;
+      mask = 1;
+      
+      while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)) {
+        mask<<= 1;
+        offset++;
+      } 
+    }
+  }
+
+  public boolean hasMoreElements() {
+    return index < set.bits.length;
+  }
+
+  public int nextElement() {
+    int x = (index << CharSet.BITS) + offset;
+    advance();
+    return x;
+  }
+
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CountEmitter.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CountEmitter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/CountEmitter.java	(revision 25584)
@@ -0,0 +1,115 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * jflex 1.4                                                               *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+/**
+ * An emitter for an array encoded as count/value pairs in a string.
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class CountEmitter extends PackEmitter {
+  /** number of entries in expanded array */
+  private int numEntries;
+  
+  /** translate all values by this amount */ 
+  private int translate = 0;
+
+
+  /**
+   * Create a count/value emitter for a specific field.
+   * 
+   * @param name   name of the generated array
+   */
+  protected CountEmitter(String name) {
+    super(name);
+  }
+
+  /**
+   * Emits count/value unpacking code for the generated array. 
+   * 
+   * @see JFlex.PackEmitter#emitUnPack()
+   */
+  public void emitUnpack() {
+    // close last string chunk:
+    println("\";");
+    
+    nl();
+    println("  private static int [] zzUnpack"+name+"() {");
+    println("    int [] result = new int["+numEntries+"];");
+    println("    int offset = 0;");
+
+    for (int i = 0; i < chunks; i++) {
+      println("    offset = zzUnpack"+name+"("+constName()+"_PACKED_"+i+", offset, result);");
+    }
+
+    println("    return result;");
+    println("  }");
+    nl();
+
+    println("  private static int zzUnpack"+name+"(String packed, int offset, int [] result) {");
+    println("    int i = 0;       /* index in packed string  */");
+    println("    int j = offset;  /* index in unpacked array */");
+    println("    int l = packed.length();");
+    println("    while (i < l) {");
+    println("      int count = packed.charAt(i++);");
+    println("      int value = packed.charAt(i++);");
+    if (translate == 1) {
+      println("      value--;");
+    } 
+    else if (translate != 0) {
+      println("      value-= "+translate);
+    }
+    println("      do result[j++] = value; while (--count > 0);");
+    println("    }");
+    println("    return j;");
+    println("  }");
+  }
+
+  /**
+   * Translate all values by given amount.
+   * 
+   * Use to move value interval from [0, 0xFFFF] to something different.
+   * 
+   * @param i   amount the value will be translated by. 
+   *            Example: <code>i = 1</code> allows values in [-1, 0xFFFE].
+   */
+  public void setValTranslation(int i) {
+    this.translate = i;    
+  }
+
+  /**
+   * Emit one count/value pair. 
+   * 
+   * Automatically translates value by the <code>translate</code> value. 
+   * 
+   * @param count
+   * @param value
+   * 
+   * @see CountEmitter#setValTranslation(int)
+   */
+  public void emit(int count, int value) {
+    numEntries+= count;
+    breaks();
+    emitUC(count);
+    emitUC(value+translate);        
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/DFA.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/DFA.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/DFA.java	(revision 25584)
@@ -0,0 +1,929 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+import java.io.*;
+import java.util.*;
+
+
+/**
+ * DFA representation in JFlex.
+ * Contains minimization algorithm.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class DFA { 
+
+  /**
+   * The initial number of states 
+   */
+  private static final int STATES = 500;
+  
+  /**
+   * The code for "no target state" in the transition table.
+   */
+  public static final int NO_TARGET = -1;
+
+  /**
+   * table[current_state][character] is the next state for <code>current_state</code>
+   * with input <code>character</code>, <code>NO_TARGET</code> if there is no transition for
+   * this input in <code>current_state</code>
+   */
+  int [][] table;
+
+
+  /**
+   * <code>isFinal[state] == true</code> <=> the state <code>state</code> is 
+   * a final state.
+   */
+  boolean [] isFinal;
+
+  
+  /**
+   * <code>action[state]</code> is the action that is to be carried out in
+   * state <code>state</code>, <code>null</code> if there is no action.
+   */
+  Action [] action;
+
+  /**
+   * entryState[i] is the start-state of lexical state i or 
+   * lookahead DFA i
+   */
+  int entryState [];
+
+  /**
+   * The number of states in this DFA
+   */
+  int numStates;
+
+  /**
+   * The current maximum number of input characters
+   */
+  int numInput;
+    
+  /**
+   * The number of lexical states (2*numLexStates <= entryState.length)
+   */
+  int numLexStates;
+
+  /**
+   * all actions that are used in this DFA
+   */
+  Hashtable usedActions = new Hashtable();
+
+  /** True iff this DFA contains general lookahead */
+  boolean lookaheadUsed;
+  
+  public DFA(int numEntryStates, int numInp, int numLexStates) {
+    numInput = numInp; 
+    
+    int statesNeeded = Math.max(numEntryStates, STATES);
+    
+    table       = new int [statesNeeded] [numInput];
+    action      = new Action [statesNeeded];
+    isFinal     = new boolean [statesNeeded];
+    entryState  = new int [numEntryStates];
+    numStates   = 0;
+
+    this.numLexStates = numLexStates;
+    
+    for (int i = 0; i < statesNeeded; i++) {
+      for (char j = 0; j < numInput; j++)
+	      table [i][j] = NO_TARGET;    
+    }
+  }
+
+
+  public void setEntryState(int eState, int trueState) {
+    entryState[eState] = trueState;
+  }
+
+  private void ensureStateCapacity(int newNumStates) {
+    int oldLength = isFinal.length;
+    
+    if ( newNumStates < oldLength ) return;
+      
+    int newLength = oldLength*2;
+    while ( newLength <= newNumStates ) newLength*= 2;
+
+    boolean [] newFinal    = new boolean [newLength];
+    boolean [] newPushback = new boolean [newLength];
+    Action  [] newAction   = new Action  [newLength];
+    int [] []  newTable    = new int [newLength] [numInput];
+    
+    System.arraycopy(isFinal,0,newFinal,0,numStates);
+    System.arraycopy(action,0,newAction,0,numStates);
+    System.arraycopy(table,0,newTable,0,oldLength);
+  
+    int i,j;
+  
+    for (i = oldLength; i < newLength; i++) {
+      for (j = 0; j < numInput; j++) {
+        newTable[i][j] = NO_TARGET;
+      }
+    }
+
+    isFinal    = newFinal;
+    action     = newAction;
+    table      = newTable;
+  }
+
+
+  public void setAction(int state, Action stateAction) {
+    action[state]    = stateAction;
+    if (stateAction != null) {
+      usedActions.put(stateAction,stateAction);
+      lookaheadUsed |= stateAction.isGenLookAction();
+    }
+  }
+  
+  public void setFinal(int state, boolean isFinalState) {
+    isFinal[state] = isFinalState;
+  }
+
+  public void addTransition(int start, char input, int dest) {
+    int max = Math.max(start,dest)+1;
+    ensureStateCapacity(max);
+    if (max > numStates) numStates = max;
+
+    //  Out.debug("Adding DFA transition ("+start+", "+(int)input+", "+dest+")");
+
+    table[start][input] = dest;
+  }
+
+
+  public String toString() {
+    StringBuffer result = new StringBuffer();
+
+    for (int i=0; i < numStates; i++) {
+      result.append("State ");
+      if ( isFinal[i] ) {
+        result.append("[FINAL");
+        String l = action[i].lookString();
+        if (!l.equals("")) {
+          result.append(", ");
+          result.append(l);        
+        }
+        result.append("] ");
+      }
+      result.append(i+":"+Out.NL);
+     
+      for (char j=0; j < numInput; j++) {
+	      if ( table[i][j] >= 0 ) 
+	        result.append("  with "+(int)j+" in "+table[i][j]+Out.NL);	
+      }
+    }
+    
+    return result.toString();    
+  }
+  
+  
+  public void writeDot(File file) {
+    try {
+      PrintWriter writer = new PrintWriter(new FileWriter(file));
+      writer.println(dotFormat());
+      writer.close();
+    }
+    catch (IOException e) {
+      Out.error(ErrorMessages.FILE_WRITE, file);
+      throw new GeneratorException();
+    }
+  }
+
+
+  public String dotFormat() {
+    StringBuffer result = new StringBuffer();
+
+    result.append("digraph DFA {"+Out.NL);
+    result.append("rankdir = LR"+Out.NL);
+
+    for (int i=0; i < numStates; i++) {
+      if ( isFinal[i] ) {
+        result.append(i);
+        result.append(" [shape = doublecircle]");
+        result.append(Out.NL);
+      }
+    }
+
+    for (int i=0; i < numStates; i++) {
+      for (int input = 0; input < numInput; input++) {
+	      if ( table[i][input] >= 0 ) {
+          result.append(i+" -> "+table[i][input]);
+          result.append(" [label=\"["+input+"]\"]"+Out.NL);
+          //          result.append(" [label=\"["+classes.toString(input)+"]\"]\n");
+        }
+      }
+    }
+
+    result.append("}"+Out.NL);
+
+    return result.toString();
+  }
+
+
+  /**
+   * Check that all actions can actually be matched in this DFA.
+   */ 
+  public void checkActions(LexScan scanner, LexParse parser) {
+    EOFActions eofActions = parser.getEOFActions();
+    Enumeration l = scanner.actions.elements();
+
+    while (l.hasMoreElements()) {
+      Action a = (Action) l.nextElement();
+      if ( !a.equals(usedActions.get(a)) && !eofActions.isEOFAction(a) ) {
+        Out.warning(scanner.file, ErrorMessages.NEVER_MATCH, a.priority-1, -1);
+      }
+    }
+  }
+
+
+  /**
+   * Implementation of Hopcroft's O(n log n) minimization algorithm, follows
+   * description by D. Gries.
+   *
+   * Time: O(n log n)
+   * Space: O(c n), size < 4*(5*c*n + 13*n + 3*c) byte
+   */
+  public void minimize() {
+    Out.print(numStates+" states before minimization, ");
+
+    if (numStates == 0) {
+      Out.error(ErrorMessages.ZERO_STATES);
+      throw new GeneratorException();
+    }
+
+    if (Options.no_minimize) {
+      Out.println("minimization skipped.");
+      return;
+    }
+
+    // the algorithm needs the DFA to be total, so we add an error state 0,
+    // and translate the rest of the states by +1
+    final int n = numStates+1;
+
+    // block information:
+    // [0..n-1] stores which block a state belongs to,
+    // [n..2*n-1] stores how many elements each block has
+    int [] block = new int[2*n];    
+
+    // implements a doubly linked list of states (these are the actual blocks)
+    int [] b_forward = new int[2*n];
+    int [] b_backward = new int[2*n];   
+
+    // the last of the blocks currently in use (in [n..2*n-1])
+    // (end of list marker, points to the last used block)
+    int lastBlock = n;  // at first we start with one empty block
+    final int b0 = n;   // the first block    
+
+    // the circular doubly linked list L of pairs (B_i, c)
+    // (B_i, c) in L iff l_forward[(B_i-n)*numInput+c] > 0 // numeric value of block 0 = n!
+    int [] l_forward = new int[n*numInput+1];
+    int [] l_backward = new int[n*numInput+1];
+    int anchorL = n*numInput; // list anchor
+
+    // inverse of the transition table
+    // if t = inv_delta[s][c] then { inv_delta_set[t], inv_delta_set[t+1], .. inv_delta_set[k] }
+    // is the set of states, with inv_delta_set[k] = -1 and inv_delta_set[j] >= 0 for t <= j < k  
+    int [] [] inv_delta = new int[n][numInput];
+    int [] inv_delta_set = new int [2*n*numInput]; 
+
+    // twin stores two things: 
+    // twin[0]..twin[numSplit-1] is the list of blocks that have been split
+    // twin[B_i] is the twin of block B_i
+    int [] twin = new int[2*n];
+    int numSplit;
+
+    // SD[B_i] is the the number of states s in B_i with delta(s,a) in B_j
+    // if SD[B_i] == block[B_i], there is no need to split
+    int [] SD = new int[2*n]; // [only SD[n..2*n-1] is used]
+
+
+    // for fixed (B_j,a), the D[0]..D[numD-1] are the inv_delta(B_j,a)
+    int [] D = new int[n];
+    int numD;    
+
+    
+    // initialize inverse of transition table
+    int lastDelta = 0;
+    int [] inv_lists = new int[n]; // holds a set of lists of states
+    int [] inv_list_last = new int[n]; // the last element
+    for (int c = 0; c < numInput; c++) {
+      // clear "head" and "last element" pointers
+      for (int s = 0; s < n; s++) {
+        inv_list_last[s] = -1;
+        inv_delta[s][c] = -1;
+      }
+      
+      // the error state has a transition for each character into itself
+      inv_delta[0][c] = 0;
+      inv_list_last[0] = 0;
+
+      // accumulate states of inverse delta into lists (inv_delta serves as head of list)
+      for (int s = 1; s < n; s++) {
+        int t = table[s-1][c]+1;
+
+        if (inv_list_last[t] == -1) { // if there are no elements in the list yet
+          inv_delta[t][c] = s;  // mark t as first and last element
+          inv_list_last[t] = s;
+        }
+        else {
+          inv_lists[inv_list_last[t]] = s; // link t into chain
+          inv_list_last[t] = s; // and mark as last element
+        }
+      }
+
+      // now move them to inv_delta_set in sequential order, 
+      // and update inv_delta accordingly
+      for (int s = 0; s < n; s++) {
+        int i = inv_delta[s][c];  inv_delta[s][c] = lastDelta;
+        int j = inv_list_last[s];
+        boolean go_on = (i != -1);
+        while (go_on) {
+          go_on = (i != j);
+          inv_delta_set[lastDelta++] = i;
+          i = inv_lists[i];
+        }
+        inv_delta_set[lastDelta++] = -1;
+      }
+    } // of initialize inv_delta
+
+    // printInvDelta(inv_delta, inv_delta_set);
+
+    // initialize blocks 
+    
+    // make b0 = {0}  where 0 = the additional error state
+    b_forward[b0]  = 0;
+    b_backward[b0] = 0;          
+    b_forward[0]   = b0;
+    b_backward[0]  = b0;
+    block[0]  = b0;
+    block[b0] = 1;
+
+    for (int s = 1; s < n; s++) {
+      // System.out.println("Checking state ["+(s-1)+"]");
+      // search the blocks if it fits in somewhere
+      // (fit in = same pushback behavior, same finalness, same lookahead behavior, same action)
+      int b = b0+1; // no state can be equivalent to the error state
+      boolean found = false;
+      while (!found && b <= lastBlock) {
+        // get some state out of the current block
+        int t = b_forward[b];
+        // System.out.println("  picking state ["+(t-1)+"]");
+
+        // check, if s could be equivalent with t
+        if (isFinal[s-1]) {
+          found = isFinal[t-1] && action[s-1].isEquiv(action[t-1]);
+        }
+        else {
+          found = !isFinal[t-1];
+        }
+      
+        if (found) { // found -> add state s to block b
+          // System.out.println("Found! Adding to block "+(b-b0));
+          // update block information
+          block[s] = b;
+          block[b]++;
+          
+          // chain in the new element
+          int last = b_backward[b];
+          b_forward[last] = s;
+          b_forward[s] = b;
+          b_backward[b] = s;
+          b_backward[s] = last;
+        }
+
+        b++;
+      }
+      
+      if (!found) { // fits in nowhere -> create new block
+        // System.out.println("not found, lastBlock = "+lastBlock);
+
+        // update block information
+        block[s] = b;
+        block[b]++;
+        
+        // chain in the new element
+        b_forward[b] = s;
+        b_forward[s] = b;
+        b_backward[b] = s;
+        b_backward[s] = b;
+        
+        lastBlock++;
+      }
+    } // of initialize blocks
+  
+    // printBlocks(block,b_forward,b_backward,lastBlock);
+
+    // initialize worklist L
+    // first, find the largest block B_max, then, all other (B_i,c) go into the list
+    int B_max = b0;
+    int B_i;
+    for (B_i = b0+1; B_i <= lastBlock; B_i++)
+      if (block[B_max] < block[B_i]) B_max = B_i;
+    
+    // L = empty
+    l_forward[anchorL] = anchorL;
+    l_backward[anchorL] = anchorL;
+
+    // set up the first list element
+    if (B_max == b0) B_i = b0+1; else B_i = b0; // there must be at least two blocks    
+
+    int index = (B_i-b0)*numInput;  // (B_i, 0)
+    while (index < (B_i+1-b0)*numInput) {
+      int last = l_backward[anchorL];
+      l_forward[last]     = index;
+      l_forward[index]    = anchorL;
+      l_backward[index]   = last;
+      l_backward[anchorL] = index;
+      index++;
+    }
+
+    // now do the rest of L
+    while (B_i <= lastBlock) {
+      if (B_i != B_max) {
+        index = (B_i-b0)*numInput;
+        while (index < (B_i+1-b0)*numInput) {
+          int last = l_backward[anchorL];
+          l_forward[last]     = index;
+          l_forward[index]    = anchorL;
+          l_backward[index]   = last;
+          l_backward[anchorL] = index;
+          index++;
+        }
+      }
+      B_i++;
+    } 
+    // end of setup L
+    
+    // start of "real" algorithm
+    // int step = 0;
+    // System.out.println("max_steps = "+(n*numInput));
+    // while L not empty
+    while (l_forward[anchorL] != anchorL) {
+      // System.out.println("step : "+(step++));
+      // printL(l_forward, l_backward, anchorL);
+
+      // pick and delete (B_j, a) in L:
+
+      // pick
+      int B_j_a = l_forward[anchorL];      
+      // delete 
+      l_forward[anchorL] = l_forward[B_j_a];
+      l_backward[l_forward[anchorL]] = anchorL;
+      l_forward[B_j_a] = 0;
+      // take B_j_a = (B_j-b0)*numInput+c apart into (B_j, a)
+      int B_j = b0 + B_j_a / numInput;
+      int a   = B_j_a % numInput;
+
+      // printL(l_forward, l_backward, anchorL);      
+
+      // System.out.println("picked ("+B_j+","+a+")");
+      // printL(l_forward, l_backward, anchorL);
+
+      // determine splittings of all blocks wrt (B_j, a)
+      // i.e. D = inv_delta(B_j,a)
+      numD = 0;
+      int s = b_forward[B_j];
+      while (s != B_j) {
+        // System.out.println("splitting wrt. state "+s);
+        int t = inv_delta[s][a];
+        // System.out.println("inv_delta chunk "+t);
+        while (inv_delta_set[t] != -1) {
+          // System.out.println("D+= state "+inv_delta_set[t]);
+          D[numD++] = inv_delta_set[t++];
+        }
+        s = b_forward[s];
+      }      
+
+      // clear the twin list
+      numSplit = 0;
+
+      // System.out.println("splitting blocks according to D");
+    
+      // clear SD and twins (only those B_i that occur in D)
+      for (int indexD = 0; indexD < numD; indexD++) { // for each s in D
+        s = D[indexD];
+        B_i = block[s];
+        SD[B_i] = -1; 
+        twin[B_i] = 0;
+      }
+      
+      // count how many states of each B_i occurring in D go with a into B_j
+      // Actually we only check, if *all* t in B_i go with a into B_j.
+      // In this case SD[B_i] == block[B_i] will hold.
+      for (int indexD = 0; indexD < numD; indexD++) { // for each s in D
+        s = D[indexD];
+        B_i = block[s];
+
+        // only count, if we haven't checked this block already
+        if (SD[B_i] < 0) {
+          SD[B_i] = 0;
+          int t = b_forward[B_i];
+          while (t != B_i && (t != 0 || block[0] == B_j) && 
+                 (t == 0 || block[table[t-1][a]+1] == B_j)) {
+            SD[B_i]++;
+            t = b_forward[t];
+          }
+        }
+      }
+  
+      // split each block according to D      
+      for (int indexD = 0; indexD < numD; indexD++) { // for each s in D
+        s = D[indexD];
+        B_i = block[s];
+        
+        // System.out.println("checking if block "+(B_i-b0)+" must be split because of state "+s);        
+
+        if (SD[B_i] != block[B_i]) {
+          // System.out.println("state "+(s-1)+" must be moved");
+          int B_k = twin[B_i];
+          if (B_k == 0) { 
+            // no twin for B_i yet -> generate new block B_k, make it B_i's twin            
+            B_k = ++lastBlock;
+            // System.out.println("creating block "+(B_k-n));
+            // printBlocks(block,b_forward,b_backward,lastBlock-1);
+            b_forward[B_k] = B_k;
+            b_backward[B_k] = B_k;
+            
+            twin[B_i] = B_k;
+
+            // mark B_i as split
+            twin[numSplit++] = B_i;
+          }
+          // move s from B_i to B_k
+          
+          // remove s from B_i
+          b_forward[b_backward[s]] = b_forward[s];
+          b_backward[b_forward[s]] = b_backward[s];
+
+          // add s to B_k
+          int last = b_backward[B_k];
+          b_forward[last] = s;
+          b_forward[s] = B_k;
+          b_backward[s] = last;
+          b_backward[B_k] = s;
+
+          block[s] = B_k;
+          block[B_k]++;
+          block[B_i]--;
+
+          SD[B_i]--;  // there is now one state less in B_i that goes with a into B_j
+          // printBlocks(block, b_forward, b_backward, lastBlock);
+          // System.out.println("finished move");
+        }
+      } // of block splitting
+
+      // printBlocks(block, b_forward, b_backward, lastBlock);
+
+      // System.out.println("updating L");
+
+      // update L
+      for (int indexTwin = 0; indexTwin < numSplit; indexTwin++) {
+        B_i = twin[indexTwin];
+        int B_k = twin[B_i];
+        for (int c = 0; c < numInput; c++) {
+          int B_i_c = (B_i-b0)*numInput+c;
+          int B_k_c = (B_k-b0)*numInput+c;
+          if (l_forward[B_i_c] > 0) {
+            // (B_i,c) already in L --> put (B_k,c) in L
+            int last = l_backward[anchorL];
+            l_backward[anchorL] = B_k_c;
+            l_forward[last] = B_k_c;
+            l_backward[B_k_c] = last;
+            l_forward[B_k_c] = anchorL;
+          }
+          else {
+            // put the smaller block in L
+            if (block[B_i] <= block[B_k]) {
+              int last = l_backward[anchorL];
+              l_backward[anchorL] = B_i_c;
+              l_forward[last] = B_i_c;
+              l_backward[B_i_c] = last;
+              l_forward[B_i_c] = anchorL;              
+            }
+            else {
+              int last = l_backward[anchorL];
+              l_backward[anchorL] = B_k_c;
+              l_forward[last] = B_k_c;
+              l_backward[B_k_c] = last;
+              l_forward[B_k_c] = anchorL;              
+            }
+          }
+        }
+      }
+    }
+
+    // System.out.println("Result");
+    // printBlocks(block,b_forward,b_backward,lastBlock);
+
+    /*
+    System.out.println("Old minimization:");
+    boolean [] [] equiv = old_minimize();
+
+    boolean error = false;
+    for (int i = 1; i < equiv.length; i++) {
+      for (int j = 0; j < equiv[i].length; j++) {
+        if (equiv[i][j] != (block[i+1] == block[j+1])) {
+          System.out.println("error: equiv["+i+"]["+j+"] = "+equiv[i][j]+
+                             ", block["+i+"] = "+block[i+1]+", block["+j+"] = "+block[j]);
+          error = true;
+        }
+      }
+    }
+
+    if (error) System.exit(1);
+    System.out.println("check");
+    */
+
+    // transform the transition table 
+    
+    // trans[i] is the state j that will replace state i, i.e. 
+    // states i and j are equivalent
+    int trans [] = new int [numStates];
+    
+    // kill[i] is true iff state i is redundant and can be removed
+    boolean kill [] = new boolean [numStates];
+    
+    // move[i] is the amount line i has to be moved in the transition table
+    // (because states j < i have been removed)
+    int move [] = new int [numStates];
+    
+    // fill arrays trans[] and kill[] (in O(n))
+    for (int b = b0+1; b <= lastBlock; b++) { // b0 contains the error state
+      // get the state with smallest value in current block
+      int s = b_forward[b];
+      int min_s = s; // there are no empty blocks!
+      for (; s != b; s = b_forward[s]) 
+        if (min_s > s) min_s = s;
+      // now fill trans[] and kill[] for this block 
+      // (and translate states back to partial DFA)
+      min_s--; 
+      for (s = b_forward[b]-1; s != b-1; s = b_forward[s+1]-1) {
+        trans[s] = min_s;
+        kill[s] = s != min_s;
+      }
+    }
+    
+    // fill array move[] (in O(n))
+    int amount = 0;
+    for (int i = 0; i < numStates; i++) {
+      if ( kill[i] ) 
+        amount++;
+      else
+        move[i] = amount;
+    }
+
+    int i,j;
+    // j is the index in the new transition table
+    // the transition table is transformed in place (in O(c n))
+    for (i = 0, j = 0; i < numStates; i++) {
+      
+      // we only copy lines that have not been removed
+      if ( !kill[i] ) {
+        
+        // translate the target states 
+        for (int c = 0; c < numInput; c++) {
+          if ( table[i][c] >= 0 ) {
+            table[j][c] = trans[ table[i][c] ];
+            table[j][c]-= move[ table[j][c] ];
+          }
+          else {
+            table[j][c] = table[i][c];
+          }
+        }
+
+        isFinal[j] = isFinal[i];
+        action[j] = action[i];
+        
+        j++;
+      }
+    }
+    
+    numStates = j;
+    
+    // translate lexical states
+    for (i = 0; i < entryState.length; i++) {
+      entryState[i] = trans[ entryState[i] ];
+      entryState[i]-= move[ entryState[i] ];
+    }
+  
+    Out.println(numStates+" states in minimized DFA");
+  }
+
+  public String toString(int [] a) {
+    String r = "{";
+    int i;
+    for (i = 0; i < a.length-1; i++) r += a[i]+",";
+    return r+a[i]+"}";
+  }
+
+  public void printBlocks(int [] b, int [] b_f, int [] b_b, int last) {
+    Out.dump("block     : "+toString(b));
+    Out.dump("b_forward : "+toString(b_f));
+    Out.dump("b_backward: "+toString(b_b));
+    Out.dump("lastBlock : "+last);
+    final int n = numStates+1;
+    for (int i = n; i <= last; i ++) {
+      Out.dump("Block "+(i-n)+" (size "+b[i]+"):");
+      String line = "{";
+      int s = b_f[i];
+      while (s != i) {
+        line = line+(s-1);
+        int t = s;
+        s = b_f[s];
+        if (s != i) {
+          line = line+",";
+          if (b[s] != i) Out.dump("consistency error for state "+(s-1)+" (block "+b[s]+")");
+        }
+        if (b_b[s] != t) Out.dump("consistency error for b_back in state "+(s-1)+" (back = "+b_b[s]+", should be = "+t+")");
+      }
+      Out.dump(line+"}");
+    }
+  }
+
+  public void printL(int [] l_f, int [] l_b, int anchor) {
+    String l = "L = {";
+    int bc = l_f[anchor];
+    while (bc != anchor) {
+      int b = bc / numInput;
+      int c = bc % numInput;
+      l+= "("+b+","+c+")";
+      int old_bc = bc;
+      bc = l_f[bc];
+      if (bc != anchor) l+= ",";
+      if (l_b[bc] != old_bc) Out.dump("consistency error for ("+b+","+c+")");
+    }
+    Out.dump(l+"}");
+  }
+
+
+  /**
+   * Much simpler, but slower and less memory efficient minimization algorithm.
+   * 
+   * @return the equivalence relation on states.
+   */
+  public boolean [] [] old_minimize() {
+
+    int i,j;
+    char c;
+    
+    Out.print(numStates+" states before minimization, ");
+
+    if (numStates == 0) {
+      Out.error(ErrorMessages.ZERO_STATES);
+      throw new GeneratorException();
+    }
+
+    if (Options.no_minimize) {
+      Out.println("minimization skipped.");
+      return null;
+    }
+
+    // equiv[i][j] == true <=> state i and state j are equivalent
+    boolean [] [] equiv = new boolean [numStates] [];
+
+    // list[i][j] contains all pairs of states that have to be marked "not equivalent"
+    // if states i and j are recognized to be not equivalent
+    StatePairList [] [] list = new StatePairList [numStates] [];
+
+    // construct a triangular matrix equiv[i][j] with j < i
+    // and mark pairs (final state, not final state) as not equivalent
+    for (i = 1; i < numStates; i++) {
+      list[i] = new StatePairList[i];
+      equiv[i] = new boolean [i];
+      for (j = 0; j < i; j++) {
+        // i and j are equivalent, iff :
+        // i and j are both final and their actions are equivalent and have same pushback behaviour or
+        // i and j are both not final
+
+        if ( isFinal[i] && isFinal[j] ) 
+          equiv[i][j] = action[i].isEquiv(action[j]);        
+        else
+          equiv[i][j] = !isFinal[j] && !isFinal[i];
+      }
+    }
+
+
+    for (i = 1; i < numStates; i++) {
+      
+      Out.debug("Testing state "+i);
+
+      for (j = 0; j < i; j++) {
+	
+        if ( equiv[i][j] ) {
+  
+          for (c = 0; c < numInput; c++) {
+  
+            if (equiv[i][j]) {              
+
+              int p = table[i][c]; 
+              int q = table[j][c];
+              if (p < q) {
+                int t = p;
+                p = q;
+                q = t;
+              }
+              if ( p >= 0 || q >= 0 ) {
+                // Out.debug("Testing input '"+c+"' for ("+i+","+j+")");
+                // Out.debug("Target states are ("+p+","+q+")");
+                if ( p!=q && (p == -1 || q == -1 || !equiv[p][q]) ) {
+                  equiv[i][j] = false;
+                  if (list[i][j] != null) list[i][j].markAll(list,equiv);
+                }
+                // printTable(equiv);
+              } // if (p >= 0) ..
+            } // if (equiv[i][j]
+          } // for (char c = 0; c < numInput ..
+	  	  
+          // if i and j are still marked equivalent..
+          
+          if ( equiv[i][j] ) {
+         
+            // Out.debug("("+i+","+j+") are still marked equivalent");
+      
+            for (c = 0; c < numInput; c++) {
+      
+              int p = table[i][c];
+              int q = table[j][c];
+              if (p < q) {
+                int t = p;
+                p = q;
+                q = t;
+              }
+              
+              if (p != q && p >= 0 && q >= 0) {
+                if ( list[p][q] == null ) {
+                  list[p][q] = new StatePairList();
+                }
+                list[p][q].addPair(i,j);
+              }
+            }      
+          }
+          else {
+            // Out.debug("("+i+","+j+") are not equivalent");
+          }
+          
+	      } // of first if (equiv[i][j])
+      } // of for j
+    } // of for i
+    // }
+
+    // printTable(equiv); 
+
+    return equiv;
+  }
+
+
+  public void printInvDelta(int [] [] inv_delta, int [] inv_delta_set) {
+    Out.dump("Inverse of transition table: ");
+    for (int s = 0; s < numStates+1; s++) {
+      Out.dump("State ["+(s-1)+"]");
+      for (int c = 0; c < numInput; c++) {
+        String line = "With <"+c+"> in {";
+        int t = inv_delta[s][c];
+        while (inv_delta_set[t] != -1) {
+          line += inv_delta_set[t++]-1;
+          if (inv_delta_set[t] != -1) line += ",";
+        }
+        if (inv_delta_set[inv_delta[s][c]] != -1) 
+          Out.dump(line+"}");
+      }
+    }
+  }
+
+  public void printTable(boolean [] [] equiv) {
+
+    Out.dump("Equivalence table is : ");
+    for (int i = 1; i < numStates; i++) {
+      String line = i+" :";
+      for (int j = 0; j < i; j++) {
+	      if (equiv[i][j]) 
+	        line+= " E";
+      	else
+	        line+= " x";
+      }
+      Out.dump(line);
+    }
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/EOFActions.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/EOFActions.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/EOFActions.java	(revision 25584)
@@ -0,0 +1,94 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.util.*;
+
+
+/**
+ * A simple table to store EOF actions for each lexical state.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class EOFActions {
+
+  /** maps lexical states to actions */
+  private Hashtable /* Integer -> Action */ actions = new Hashtable();
+  private Action defaultAction;
+  private int numLexStates;
+
+  public void setNumLexStates(int num) {
+    numLexStates = num;
+  }
+
+  public void add(Vector stateList, Action action) {
+
+    if (stateList != null && stateList.size() > 0) {
+      Enumeration states = stateList.elements();
+      
+      while (states.hasMoreElements()) 
+        add( (Integer) states.nextElement(), action );   
+    }
+    else {
+      defaultAction = action.getHigherPriority(defaultAction);
+      
+      for (int i = 0; i < numLexStates; i++) {
+        Integer state = new Integer(i);
+        if ( actions.get(state) != null ) {
+          Action oldAction = (Action) actions.get(state);
+          actions.put(state, oldAction.getHigherPriority(action));
+        }
+      }
+    }
+  }
+
+  public void add(Integer state, Action action) {
+    if ( actions.get(state) == null )
+      actions.put(state, action);
+    else {
+      Action oldAction = (Action) actions.get(state);
+      actions.put(state, oldAction.getHigherPriority(action));
+    }
+  }
+
+  public boolean isEOFAction(Object a) {
+    if (a == defaultAction) return true;
+
+    Enumeration e = actions.elements();
+    while ( e.hasMoreElements() ) 
+      if (a == e.nextElement()) return true;
+
+    return false;
+  }
+
+  public Action getAction(int state) {
+    return (Action) actions.get(new Integer(state));
+  }
+
+  public Action getDefault() {
+    return defaultAction;
+  }
+
+  public int numActions() {
+    return actions.size();
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Emitter.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Emitter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Emitter.java	(revision 25584)
@@ -0,0 +1,1633 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.io.*;
+import java.util.*;
+import java.text.*;
+
+/**
+ * This class manages the actual code generation, putting
+ * the scanner together, filling in skeleton sections etc.
+ *
+ * Table compression, String packing etc. is also done here.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class Emitter {
+    
+  // bit masks for state attributes
+  static final private int FINAL = 1;
+  static final private int NOLOOK = 8;
+
+  static final private String date = (new SimpleDateFormat()).format(new Date());
+
+  private File inputFile;
+
+  private PrintWriter out;
+  private Skeleton skel;
+  private LexScan scanner;
+  private LexParse parser;
+  private DFA dfa;
+
+  // for switch statement:
+  // table[i][j] is the set of input characters that leads from state i to state j
+  private CharSet table[][];
+
+  private boolean isTransition[];
+  
+  // noTarget[i] is the set of input characters that have no target state in state i
+  private CharSet noTarget[];
+      
+  // for row killing:
+  private int numRows;
+  private int [] rowMap;
+  private boolean [] rowKilled;
+  
+  // for col killing:
+  private int numCols;
+  private int [] colMap;
+  private boolean [] colKilled;
+  
+
+  /** maps actions to their switch label */
+  private Hashtable actionTable = new Hashtable();
+
+  private CharClassInterval [] intervals;
+
+  private String visibility = "public";
+
+  public Emitter(File inputFile, LexParse parser, DFA dfa) throws IOException {
+
+    String name = getBaseName(parser.scanner.className) + ".java";
+
+    File outputFile = normalize(name, inputFile);
+
+    Out.println("Writing code to \""+outputFile+"\"");
+    
+    this.out = new PrintWriter(new BufferedWriter(new FileWriter(outputFile)));
+    this.parser = parser;
+    this.scanner = parser.scanner;
+    this.visibility = scanner.visibility;
+    this.inputFile = inputFile;
+    this.dfa = dfa;
+    this.skel = new Skeleton(out);
+  }
+
+  /**
+   * Computes base name of the class name. Needs to take into account generics.
+   *
+   * @see LexScan#className
+   * @return the
+   */
+  public static String getBaseName(String className) {
+    int gen = className.indexOf('<');
+    if (gen < 0) {
+      return className;
+    }
+    else {
+      return className.substring(0, gen);
+    }
+  }
+  
+
+  /**
+   * Constructs a file in Options.getDir() or in the same directory as
+   * another file. Makes a backup if the file already exists.
+   *
+   * @param name  the name (without path) of the file
+   * @param path  the path where to construct the file
+   * @param input fall back location if path = <tt>null</tt>
+   *              (expected to be a file in the directory to write to)   
+   */
+  public static File normalize(String name, File input) {
+    File outputFile;
+
+    if ( Options.getDir() == null ) 
+      if ( input == null || input.getParent() == null )
+        outputFile = new File(name);
+      else
+        outputFile = new File(input.getParent(), name);
+    else 
+      outputFile = new File(Options.getDir(), name);
+        
+    if ( outputFile.exists() && !Options.no_backup ) {      
+      File backup = new File( outputFile.toString()+"~" );
+      
+      if ( backup.exists() ) backup.delete();
+      
+      if ( outputFile.renameTo( backup ) )
+        Out.println("Old file \""+outputFile+"\" saved as \""+backup+"\"");
+      else
+        Out.println("Couldn't save old file \""+outputFile+"\", overwriting!");
+    }
+
+    return outputFile;
+  }
+  
+  private void println() {
+    out.println();
+  }
+
+  private void println(String line) {
+    out.println(line);
+  }
+
+  private void println(int i) {
+    out.println(i);
+  }
+
+  private void print(String line) {
+    out.print(line);
+  }
+
+  private void print(int i) {
+    out.print(i);
+  }
+
+  private void print(int i, int tab) {
+    int exp;
+
+    if (i < 0) 
+      exp = 1;
+    else
+      exp = 10;
+
+    while (tab-- > 1) {
+      if (Math.abs(i) < exp) print(" ");
+      exp*= 10;
+    }
+
+    print(i);
+  }
+
+  private boolean hasGenLookAhead() {
+    return dfa.lookaheadUsed;
+  }
+  
+  private void emitLookBuffer() {
+    if (!hasGenLookAhead()) return;
+    
+    println("  /** For the backwards DFA of general lookahead statements */");
+    println("  private boolean [] zzFin = new boolean [ZZ_BUFFERSIZE+1];");
+    println();
+  }
+  
+  private void emitScanError() {
+    print("  private void zzScanError(int errorCode)");
+    
+    if (scanner.scanErrorException != null) 
+      print(" throws "+scanner.scanErrorException);
+
+    println(" {");
+
+    skel.emitNext();
+
+    if (scanner.scanErrorException == null)
+      println("    throw new Error(message);");
+    else
+      println("    throw new "+scanner.scanErrorException+"(message);");    
+
+    skel.emitNext();
+
+    print("  "+visibility+" void yypushback(int number) ");     
+    
+    if (scanner.scanErrorException == null)
+      println(" {");
+    else       
+      println(" throws "+scanner.scanErrorException+" {");
+  }
+
+  private void emitMain() {
+    if ( !(scanner.standalone || scanner.debugOption || scanner.cupDebug) ) return;
+
+    if ( scanner.cupDebug ) {
+      println("  /**");
+      println("   * Converts an int token code into the name of the");
+      println("   * token by reflection on the cup symbol class/interface "+scanner.cupSymbol);
+      println("   *");
+      println("   * This code was contributed by Karl Meissner <meissnersd@yahoo.com>"); 
+      println("   */");
+      println("  private String getTokenName(int token) {");
+      println("    try {");
+      println("      java.lang.reflect.Field [] classFields = " + scanner.cupSymbol + ".class.getFields();");
+      println("      for (int i = 0; i < classFields.length; i++) {");
+      println("        if (classFields[i].getInt(null) == token) {");
+      println("          return classFields[i].getName();");
+      println("        }");
+      println("      }");
+      println("    } catch (Exception e) {");
+      println("      e.printStackTrace(System.err);");
+      println("    }");
+      println("");
+      println("    return \"UNKNOWN TOKEN\";");
+      println("  }");
+      println("");
+      println("  /**");
+      println("   * Same as "+scanner.functionName+" but also prints the token to standard out");
+      println("   * for debugging.");
+      println("   *");
+      println("   * This code was contributed by Karl Meissner <meissnersd@yahoo.com>"); 
+      println("   */");
+
+      print("  "+visibility+" ");
+      if ( scanner.tokenType == null ) {
+        if ( scanner.isInteger )
+          print( "int" );
+        else 
+          if ( scanner.isIntWrap )
+            print( "Integer" );
+          else
+            print( "Yytoken" );
+      }
+      else
+        print( scanner.tokenType );
+      
+      print(" debug_");
+      
+      print(scanner.functionName);
+      
+      print("() throws java.io.IOException");
+    
+      if ( scanner.lexThrow != null ) {
+        print(", ");
+        print(scanner.lexThrow);
+      }
+
+      if ( scanner.scanErrorException != null ) {
+        print(", ");
+        print(scanner.scanErrorException);
+      }
+      
+      println(" {");
+
+      println("    java_cup.runtime.Symbol s = "+scanner.functionName+"();");
+      print("    System.out.println( ");
+      if (scanner.lineCount) print("\"line:\" + (yyline+1) + ");
+      if (scanner.columnCount) print("\" col:\" + (yycolumn+1) + ");
+      println("\" --\"+ yytext() + \"--\" + getTokenName(s.sym) + \"--\");");
+      println("    return s;");
+      println("  }");
+      println("");
+    }
+
+    if ( scanner.standalone ) {
+      println("  /**");
+      println("   * Runs the scanner on input files.");
+      println("   *");
+      println("   * This is a standalone scanner, it will print any unmatched");
+      println("   * text to System.out unchanged.");      
+      println("   *");
+      println("   * @param argv   the command line, contains the filenames to run");
+      println("   *               the scanner on.");
+      println("   */");
+    }
+    else {
+      println("  /**");
+      println("   * Runs the scanner on input files.");
+      println("   *");
+      println("   * This main method is the debugging routine for the scanner.");
+      println("   * It prints debugging information about each returned token to");
+      println("   * System.out until the end of file is reached, or an error occured.");
+      println("   *"); 
+      println("   * @param argv   the command line, contains the filenames to run");
+      println("   *               the scanner on."); 
+      println("   */"); 
+    }      
+    
+    String className = getBaseName(scanner.className);
+    
+    println("  public static void main(String argv[]) {");
+    println("    if (argv.length == 0) {");
+    println("      System.out.println(\"Usage : java "+className+" <inputfile>\");");
+    println("    }");
+    println("    else {");
+    println("      for (int i = 0; i < argv.length; i++) {");
+    println("        "+className+" scanner = null;");
+    println("        try {");
+    println("          scanner = new "+className+"( new java.io.FileReader(argv[i]) );");
+
+    if ( scanner.standalone ) {      
+      println("          while ( !scanner.zzAtEOF ) scanner."+scanner.functionName+"();");
+    }
+    else if (scanner.cupDebug ) {
+      println("          while ( !scanner.zzAtEOF ) scanner.debug_"+scanner.functionName+"();");
+    }
+    else {
+      println("          do {");
+      println("            System.out.println(scanner."+scanner.functionName+"());");
+      println("          } while (!scanner.zzAtEOF);");
+      println("");
+    }
+ 
+    println("        }");
+    println("        catch (java.io.FileNotFoundException e) {");
+    println("          System.out.println(\"File not found : \\\"\"+argv[i]+\"\\\"\");");
+    println("        }");
+    println("        catch (java.io.IOException e) {");
+    println("          System.out.println(\"IO error scanning file \\\"\"+argv[i]+\"\\\"\");");
+    println("          System.out.println(e);");
+    println("        }"); 
+    println("        catch (Exception e) {");
+    println("          System.out.println(\"Unexpected exception:\");");
+    println("          e.printStackTrace();");
+    println("        }"); 
+    println("      }");
+    println("    }");
+    println("  }");
+    println("");    
+  }
+  
+  private void emitNoMatch() {
+    println("            zzScanError(ZZ_NO_MATCH);");
+  }
+  
+  private void emitNextInput() {
+    println("          if (zzCurrentPosL < zzEndReadL)");
+    println("            zzInput = zzBufferL[zzCurrentPosL++];");
+    println("          else if (zzAtEOF) {");
+    println("            zzInput = YYEOF;");
+    println("            break zzForAction;");
+    println("          }");
+    println("          else {");
+    println("            // store back cached positions");
+    println("            zzCurrentPos  = zzCurrentPosL;");
+    println("            zzMarkedPos   = zzMarkedPosL;");
+    println("            boolean eof = zzRefill();");
+    println("            // get translated positions and possibly new buffer");
+    println("            zzCurrentPosL  = zzCurrentPos;");
+    println("            zzMarkedPosL   = zzMarkedPos;");
+    println("            zzBufferL      = zzBuffer;");
+    println("            zzEndReadL     = zzEndRead;");
+    println("            if (eof) {");
+    println("              zzInput = YYEOF;");
+    println("              break zzForAction;");  
+    println("            }");
+    println("            else {");
+    println("              zzInput = zzBufferL[zzCurrentPosL++];");
+    println("            }");
+    println("          }"); 
+  }
+
+  private void emitHeader() {
+    println("/* The following code was generated by JFlex "+Main.version+" on "+date+" */");   
+    println(""); 
+  } 
+
+  private void emitUserCode() {
+    if ( scanner.userCode.length() > 0 )
+      println(scanner.userCode.toString());
+  }
+
+  private void emitClassName() {    
+    if (!endsWithJavadoc(scanner.userCode)) {
+      String path = inputFile.toString();
+      // slashify path (avoid backslash u sequence = unicode escape)
+      if (File.separatorChar != '/') {
+	    path = path.replace(File.separatorChar, '/');
+      }
+    	
+      println("/**");
+      println(" * This class is a scanner generated by ");
+      println(" * <a href=\"http://www.jflex.de/\">JFlex</a> "+Main.version);
+      println(" * on "+date+" from the specification file");    
+      println(" * <tt>"+path+"</tt>");      
+      println(" */");
+    }   
+
+    if ( scanner.isPublic ) print("public ");
+
+    if ( scanner.isAbstract) print("abstract ");
+   
+    if ( scanner.isFinal ) print("final ");
+    
+    print("class ");
+    print(scanner.className);
+    
+    if ( scanner.isExtending != null ) {
+      print(" extends ");
+      print(scanner.isExtending);
+    }
+
+    if ( scanner.isImplementing != null ) {
+      print(" implements ");
+      print(scanner.isImplementing);
+    }   
+    
+    println(" {");
+  }  
+
+  /**
+   * Try to find out if user code ends with a javadoc comment 
+   * 
+   * @param buffer   the user code
+   * @return true    if it ends with a javadoc comment
+   */
+  public static boolean endsWithJavadoc(StringBuffer usercode) {
+    String s = usercode.toString().trim();
+        
+    if (!s.endsWith("*/")) return false;
+    
+    // find beginning of javadoc comment   
+    int i = s.lastIndexOf("/**");    
+    if (i < 0) return false; 
+       
+    // javadoc comment shouldn't contain a comment end
+    return s.substring(i,s.length()-2).indexOf("*/") < 0;
+  }
+
+
+  private void emitLexicalStates() {
+    Enumeration stateNames = scanner.states.names();
+    
+    while ( stateNames.hasMoreElements() ) {
+      String name = (String) stateNames.nextElement();
+      
+      int num = scanner.states.getNumber(name).intValue();
+
+      println("  "+visibility+" static final int "+name+" = "+2*num+";");
+    }
+
+    // can't quite get rid of the indirection, even for non-bol lex states: 
+    // their DFA states might be the same, but their EOF actions might be different
+    // (see bug #1540228)
+    println("");
+    println("  /**");
+    println("   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l");
+    println("   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l");
+    println("   *                  at the beginning of a line");
+    println("   * l is of the form l = 2*k, k a non negative integer");
+    println("   */");
+    println("  private static final int ZZ_LEXSTATE[] = { ");
+  
+    int i, j = 0;
+    print("    ");
+    
+    for (i = 0; i < 2*dfa.numLexStates-1; i++) {
+      print( dfa.entryState[i], 2 );
+
+      print(", ");
+
+      if (++j >= 16) {
+        println();
+        print("    ");
+        j = 0;
+      }
+    }
+            
+    println( dfa.entryState[i] );
+    println("  };");
+  }
+
+  private void emitDynamicInit() {    
+    int count = 0;
+    int value = dfa.table[0][0];
+
+    println("  /** ");
+    println("   * The transition table of the DFA");
+    println("   */");
+
+    CountEmitter e = new CountEmitter("Trans");
+    e.setValTranslation(+1); // allow vals in [-1, 0xFFFE]
+    e.emitInit();
+    
+    for (int i = 0; i < dfa.numStates; i++) {
+      if ( !rowKilled[i] ) {
+        for (int c = 0; c < dfa.numInput; c++) {
+          if ( !colKilled[c] ) {
+            if (dfa.table[i][c] == value) {
+              count++;
+            } 
+            else {
+              e.emit(count, value);
+
+              count = 1;
+              value = dfa.table[i][c];              
+            }
+          }
+        }
+      }
+    }
+
+    e.emit(count, value);
+    e.emitUnpack();
+    
+    println(e.toString());
+  }
+
+
+  private void emitCharMapInitFunction() {
+
+    CharClasses cl = parser.getCharClasses();
+    
+    if ( cl.getMaxCharCode() < 256 ) return;
+
+    println("");
+    println("  /** ");
+    println("   * Unpacks the compressed character translation table.");
+    println("   *");
+    println("   * @param packed   the packed character translation table");
+    println("   * @return         the unpacked character translation table");
+    println("   */");
+    println("  private static char [] zzUnpackCMap(String packed) {");
+    println("    char [] map = new char[0x10000];");
+    println("    int i = 0;  /* index in packed string  */");
+    println("    int j = 0;  /* index in unpacked array */");
+    println("    while (i < "+2*intervals.length+") {");
+    println("      int  count = packed.charAt(i++);");
+    println("      char value = packed.charAt(i++);");
+    println("      do map[j++] = value; while (--count > 0);");
+    println("    }");
+    println("    return map;");
+    println("  }");
+  }
+
+  private void emitZZTrans() {    
+
+    int i,c;
+    int n = 0;
+    
+    println("  /** ");
+    println("   * The transition table of the DFA");
+    println("   */");
+    println("  private static final int ZZ_TRANS [] = {"); 
+
+    print("    ");
+    for (i = 0; i < dfa.numStates; i++) {
+      
+      if ( !rowKilled[i] ) {        
+        for (c = 0; c < dfa.numInput; c++) {          
+          if ( !colKilled[c] ) {            
+            if (n >= 10) {
+              println();
+              print("    ");
+              n = 0;
+            }
+            print( dfa.table[i][c] );
+            if (i != dfa.numStates-1 || c != dfa.numInput-1)
+              print( ", ");
+            n++;
+          }
+        }
+      }
+    }
+
+    println();
+    println("  };");
+  }
+  
+  private void emitCharMapArrayUnPacked() {
+  
+    CharClasses cl = parser.getCharClasses();
+    
+    println("");
+    println("  /** ");
+    println("   * Translates characters to character classes");
+    println("   */");
+    println("  private static final char [] ZZ_CMAP = {");
+  
+    int n = 0;  // numbers of entries in current line    
+    print("    ");
+    
+    int max =  cl.getMaxCharCode();
+	
+    // not very efficient, but good enough for <= 255 characters
+    for (char c = 0; c <= max; c++) {
+      print(colMap[cl.getClassCode(c)],2);
+      
+      if (c < max) {
+        print(", ");        
+        if ( ++n >= 16 ) { 
+          println();
+          print("    ");
+          n = 0; 
+        }
+      }
+    }
+    
+    println();
+    println("  };");
+    println();
+  }
+
+  private void emitCharMapArray() {       
+    CharClasses cl = parser.getCharClasses();
+
+    if ( cl.getMaxCharCode() < 256 ) {
+      emitCharMapArrayUnPacked();
+      return;
+    }
+
+    // ignores cl.getMaxCharCode(), emits all intervals instead
+
+    intervals = cl.getIntervals();
+    
+    println("");
+    println("  /** ");
+    println("   * Translates characters to character classes");
+    println("   */");
+    println("  private static final String ZZ_CMAP_PACKED = ");
+  
+    int n = 0;  // numbers of entries in current line    
+    print("    \"");
+    
+    int i = 0;
+    int count, value;
+    while ( i < intervals.length ) {
+      count = intervals[i].end-intervals[i].start+1;
+      value = colMap[intervals[i].charClass];
+
+      // count could be >= 0x10000
+      while (count > 0xFFFF) {
+        printUC(0xFFFF);
+        printUC(value);
+        count -= 0xFFFF;
+        n++;       
+      }
+        
+      printUC(count);
+      printUC(value);
+
+      if (i < intervals.length-1) {
+        if ( ++n >= 10 ) { 
+          println("\"+");
+          print("    \"");
+          n = 0;
+        }
+      }
+
+      i++;
+    }
+      
+    println("\";");
+    println();
+
+    println("  /** ");
+    println("   * Translates characters to character classes");
+    println("   */");
+    println("  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);");
+    println();
+  }
+
+
+  /**
+   * Print number as octal/unicode escaped string character.
+   * 
+   * @param c   the value to print
+   * @prec  0 <= c <= 0xFFFF 
+   */
+  private void printUC(int c) {
+    if (c > 255) {
+      out.print("\\u");
+      if (c < 0x1000) out.print("0");
+      out.print(Integer.toHexString(c));
+    }
+    else {
+      out.print("\\");
+      out.print(Integer.toOctalString(c));
+    }    
+  }
+
+
+  private void emitRowMapArray() {
+    println("");
+    println("  /** ");
+    println("   * Translates a state to a row index in the transition table");
+    println("   */");
+    
+    HiLowEmitter e = new HiLowEmitter("RowMap");
+    e.emitInit();
+    for (int i = 0; i < dfa.numStates; i++) {
+      e.emit(rowMap[i]*numCols);
+    }    
+    e.emitUnpack();
+    println(e.toString());
+  }
+
+
+  private void emitAttributes() {
+    println("  /**");
+    println("   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>");
+    println("   */");
+    
+    CountEmitter e = new CountEmitter("Attribute");    
+    e.emitInit();
+    
+    int count = 1;
+    int value = 0; 
+    if ( dfa.isFinal[0]    ) value = FINAL;
+    if ( !isTransition[0]  ) value|= NOLOOK;
+       
+    for (int i = 1;  i < dfa.numStates; i++) {      
+      int attribute = 0;      
+      if ( dfa.isFinal[i]    ) attribute = FINAL;
+      if ( !isTransition[i]  ) attribute|= NOLOOK;
+
+      if (value == attribute) {
+        count++;
+      }
+      else {        
+        e.emit(count, value);
+        count = 1;
+        value = attribute;
+      }
+    }
+    
+    e.emit(count, value);    
+    e.emitUnpack();
+    
+    println(e.toString());
+  }
+
+
+  private void emitClassCode() {
+    if ( scanner.classCode != null ) {
+      println("  /* user code: */");
+      println(scanner.classCode);
+    }
+  }
+
+  private void emitConstructorDecl() {
+    emitConstructorDecl(true);
+    
+    if ((scanner.standalone || scanner.debugOption) && 
+        scanner.ctorArgs.size() > 0) {
+      Out.warning(ErrorMessages.get(ErrorMessages.CTOR_DEBUG));
+      println();
+      emitConstructorDecl(false);
+    }
+  }
+  
+  private void emitConstructorDecl(boolean printCtorArgs) {
+ 
+    String warn = 
+        "// WARNING: this is a default constructor for " +
+        "debug/standalone only. Has no custom parameters or init code.";
+    
+    if (!printCtorArgs) println(warn); 
+    
+    print("  ");
+
+    if ( scanner.isPublic ) print("public ");   
+    print( getBaseName(scanner.className) );      
+    print("(java.io.Reader in");
+    if (printCtorArgs) emitCtorArgs();
+    print(")");
+    
+    if ( scanner.initThrow != null && printCtorArgs) {
+      print(" throws ");
+      print( scanner.initThrow );
+    }
+    
+    println(" {");
+
+    if ( scanner.initCode != null && printCtorArgs) {
+      print("  ");
+      print( scanner.initCode );
+    }
+
+    println("    this.zzReader = in;");
+
+    println("  }");
+    println();
+
+    
+    println("  /**");
+    println("   * Creates a new scanner.");
+    println("   * There is also java.io.Reader version of this constructor.");
+    println("   *");
+    println("   * @param   in  the java.io.Inputstream to read input from.");
+    println("   */");
+    if (!printCtorArgs) println(warn);
+    
+    print("  ");
+    if ( scanner.isPublic ) print("public ");    
+    print( getBaseName(scanner.className) );      
+    print("(java.io.InputStream in");
+    if (printCtorArgs) emitCtorArgs();
+    print(")");
+    
+    if ( scanner.initThrow != null && printCtorArgs ) {
+      print(" throws ");
+      print( scanner.initThrow );
+    }
+    
+    println(" {");    
+
+    print("    this(new java.io.InputStreamReader(in)");
+    if (printCtorArgs) {
+      for (int i=0; i < scanner.ctorArgs.size(); i++) {
+        print(", "+scanner.ctorArgs.elementAt(i));
+      }      
+    }
+    println(");");
+    
+    println("  }");
+  }
+
+  private void emitCtorArgs() {
+    for (int i = 0; i < scanner.ctorArgs.size(); i++) {
+      print(", "+scanner.ctorTypes.elementAt(i));
+      print(" "+scanner.ctorArgs.elementAt(i));
+    }    
+  }
+
+  private void emitDoEOF() {
+    if ( scanner.eofCode == null ) return;
+    
+    println("  /**");
+    println("   * Contains user EOF-code, which will be executed exactly once,");
+    println("   * when the end of file is reached");
+    println("   */");
+    
+    print("  private void zzDoEOF()");
+    
+    if ( scanner.eofThrow != null ) {
+      print(" throws ");
+      print(scanner.eofThrow);
+    }
+    
+    println(" {");
+    
+    println("    if (!zzEOFDone) {");
+    println("      zzEOFDone = true;");
+    println("    "+scanner.eofCode );
+    println("    }");
+    println("  }");
+    println("");
+    println("");
+  }
+
+  private void emitLexFunctHeader() {
+    
+    if (scanner.cupCompatible)  {
+      // force public, because we have to implement java_cup.runtime.Symbol
+      print("  public ");
+    }
+    else {
+      print("  "+visibility+" ");
+    }
+    
+    if ( scanner.tokenType == null ) {
+      if ( scanner.isInteger )
+        print( "int" );
+      else 
+      if ( scanner.isIntWrap )
+        print( "Integer" );
+      else
+        print( "Yytoken" );
+    }
+    else
+      print( scanner.tokenType );
+      
+    print(" ");
+    
+    print(scanner.functionName);
+      
+    print("() throws java.io.IOException");
+    
+    if ( scanner.lexThrow != null ) {
+      print(", ");
+      print(scanner.lexThrow);
+    }
+
+    if ( scanner.scanErrorException != null ) {
+      print(", ");
+      print(scanner.scanErrorException);
+    }
+    
+    println(" {");
+    
+    skel.emitNext();
+
+    if ( scanner.useRowMap ) {
+      println("    int [] zzTransL = ZZ_TRANS;");
+      println("    int [] zzRowMapL = ZZ_ROWMAP;");
+      println("    int [] zzAttrL = ZZ_ATTRIBUTE;");
+
+    }
+
+    skel.emitNext();    
+        
+    if ( scanner.charCount ) {
+      println("      yychar+= zzMarkedPosL-zzStartRead;");
+      println("");
+    }
+    
+    if ( scanner.lineCount || scanner.columnCount ) {
+      println("      boolean zzR = false;");
+      println("      for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL;");
+      println("                                                             zzCurrentPosL++) {");
+      println("        switch (zzBufferL[zzCurrentPosL]) {");
+      println("        case '\\u000B':"); 
+      println("        case '\\u000C':"); 
+      println("        case '\\u0085':");
+      println("        case '\\u2028':"); 
+      println("        case '\\u2029':"); 
+      if ( scanner.lineCount )
+        println("          yyline++;");
+      if ( scanner.columnCount )
+        println("          yycolumn = 0;");
+      println("          zzR = false;");
+      println("          break;");      
+      println("        case '\\r':");
+      if ( scanner.lineCount )
+        println("          yyline++;");
+      if ( scanner.columnCount )
+        println("          yycolumn = 0;");
+      println("          zzR = true;");
+      println("          break;");
+      println("        case '\\n':");
+      println("          if (zzR)");
+      println("            zzR = false;");
+      println("          else {");
+      if ( scanner.lineCount )
+        println("            yyline++;");
+      if ( scanner.columnCount )
+        println("            yycolumn = 0;");
+      println("          }");
+      println("          break;");
+      println("        default:");
+      println("          zzR = false;");
+      if ( scanner.columnCount ) 
+        println("          yycolumn++;");
+      println("        }");
+      println("      }");
+      println();
+
+      if ( scanner.lineCount ) {
+        println("      if (zzR) {");
+        println("        // peek one character ahead if it is \\n (if we have counted one line too much)");
+        println("        boolean zzPeek;");
+        println("        if (zzMarkedPosL < zzEndReadL)");
+        println("          zzPeek = zzBufferL[zzMarkedPosL] == '\\n';");
+        println("        else if (zzAtEOF)");
+        println("          zzPeek = false;");
+        println("        else {");
+        println("          boolean eof = zzRefill();");
+        println("          zzEndReadL = zzEndRead;");
+        println("          zzMarkedPosL = zzMarkedPos;");
+        println("          zzBufferL = zzBuffer;");
+        println("          if (eof) ");
+        println("            zzPeek = false;");
+        println("          else ");
+        println("            zzPeek = zzBufferL[zzMarkedPosL] == '\\n';");
+        println("        }");
+        println("        if (zzPeek) yyline--;");
+        println("      }");
+      }
+    }
+
+    if ( scanner.bolUsed ) {
+      // zzMarkedPos > zzStartRead <=> last match was not empty
+      // if match was empty, last value of zzAtBOL can be used
+      // zzStartRead is always >= 0
+      println("      if (zzMarkedPosL > zzStartRead) {");
+      println("        switch (zzBufferL[zzMarkedPosL-1]) {");
+      println("        case '\\n':");
+      println("        case '\\u000B':"); 
+      println("        case '\\u000C':"); 
+      println("        case '\\u0085':");
+      println("        case '\\u2028':"); 
+      println("        case '\\u2029':"); 
+      println("          zzAtBOL = true;");
+      println("          break;"); 
+      println("        case '\\r': "); 
+      println("          if (zzMarkedPosL < zzEndReadL)");
+      println("            zzAtBOL = zzBufferL[zzMarkedPosL] != '\\n';");
+      println("          else if (zzAtEOF)");
+      println("            zzAtBOL = false;");
+      println("          else {");
+      println("            boolean eof = zzRefill();");
+      println("            zzMarkedPosL = zzMarkedPos;");
+      println("            zzEndReadL = zzEndRead;");
+      println("            zzBufferL = zzBuffer;");
+      println("            if (eof) ");
+      println("              zzAtBOL = false;");
+      println("            else ");
+      println("              zzAtBOL = zzBufferL[zzMarkedPosL] != '\\n';");
+      println("          }");      
+      println("          break;"); 
+      println("        default:"); 
+      println("          zzAtBOL = false;");
+      println("        }"); 
+      println("      }"); 
+    }
+
+    skel.emitNext();
+    
+    if (scanner.bolUsed) {
+      println("      if (zzAtBOL)");
+      println("        zzState = ZZ_LEXSTATE[zzLexicalState+1];");
+      println("      else");    
+      println("        zzState = ZZ_LEXSTATE[zzLexicalState];");
+      println();
+    }
+    else {
+      println("      zzState = ZZ_LEXSTATE[zzLexicalState];");
+      println();
+    }
+
+    skel.emitNext();
+  }
+
+  
+  private void emitGetRowMapNext() {
+    println("          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];");
+    println("          if (zzNext == "+DFA.NO_TARGET+") break zzForAction;");
+    println("          zzState = zzNext;");
+    println();
+
+    println("          int zzAttributes = zzAttrL[zzState];");
+
+    println("          if ( (zzAttributes & "+FINAL+") == "+FINAL+" ) {");
+
+    skel.emitNext();
+    
+    println("            if ( (zzAttributes & "+NOLOOK+") == "+NOLOOK+" ) break zzForAction;");
+
+    skel.emitNext();    
+  }  
+
+  private void emitTransitionTable() {
+    transformTransitionTable();
+    
+    println("          zzInput = zzCMapL[zzInput];");
+    println();
+
+    println("          boolean zzIsFinal = false;");
+    println("          boolean zzNoLookAhead = false;");
+    println();
+    
+    println("          zzForNext: { switch (zzState) {");
+
+    for (int state = 0; state < dfa.numStates; state++)
+      if (isTransition[state]) emitState(state);
+
+    println("            default:");
+    println("              // if this is ever reached, there is a serious bug in JFlex");
+    println("              zzScanError(ZZ_UNKNOWN_ERROR);");
+    println("              break;");
+    println("          } }");
+    println();
+    
+    println("          if ( zzIsFinal ) {");
+    
+    skel.emitNext();
+    
+    println("            if ( zzNoLookAhead ) break zzForAction;");
+
+    skel.emitNext();    
+  }
+
+
+  /**
+   * Escapes all " ' \ tabs and newlines
+   */
+  private String escapify(String s) {
+    StringBuffer result = new StringBuffer(s.length()*2);
+    
+    for (int i = 0; i < s.length(); i++) {
+      char c = s.charAt(i);
+      switch (c) {
+      case '\'': result.append("\\\'"); break;
+      case '\"': result.append("\\\""); break;
+      case '\\': result.append("\\\\"); break;
+      case '\t': result.append("\\t"); break;
+      case '\r': if (i+1 == s.length() || s.charAt(i+1) != '\n') result.append("\"+ZZ_NL+\""); 
+                 break;
+      case '\n': result.append("\"+ZZ_NL+\""); break;
+      default: result.append(c);
+      }
+    }
+
+    return result.toString();
+  }
+
+  public void emitActionTable() {
+    int lastAction = 1;    
+    int count = 0;
+    int value = 0;
+
+    println("  /** ");
+    println("   * Translates DFA states to action switch labels.");
+    println("   */");
+    CountEmitter e = new CountEmitter("Action");    
+    e.emitInit();
+
+    for (int i = 0; i < dfa.numStates; i++) {
+      int newVal = 0; 
+      if ( dfa.isFinal[i] ) {
+        Action action = dfa.action[i];
+        if (action.isEmittable()) {
+          Integer stored = (Integer) actionTable.get(action);
+          if ( stored == null ) { 
+            stored = new Integer(lastAction++);
+            actionTable.put(action, stored);
+          }
+          newVal = stored.intValue();
+        }
+      }
+      
+      if (value == newVal) {
+        count++;
+      }
+      else {
+        if (count > 0) e.emit(count,value);
+        count = 1;
+        value = newVal;        
+      }
+    }
+    
+    if (count > 0) e.emit(count,value);
+
+    e.emitUnpack();    
+    println(e.toString());
+  }
+
+  private void emitActions() {
+    println("      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {");
+
+    int i = actionTable.size()+1;  
+    Enumeration actions = actionTable.keys();
+    while ( actions.hasMoreElements() ) {
+      Action action = (Action) actions.nextElement();
+      int label = ((Integer) actionTable.get(action)).intValue();
+
+      println("        case "+label+": "); 
+      
+      if (action.lookAhead() == Action.FIXED_BASE) {
+        println("          // lookahead expression with fixed base length");
+        println("          zzMarkedPos = zzStartRead + "+action.getLookLength()+";");        
+      }
+      
+      if (action.lookAhead() == Action.FIXED_LOOK || 
+          action.lookAhead() == Action.FINITE_CHOICE) {
+        println("          // lookahead expression with fixed lookahead length");
+        println("          yypushback("+action.getLookLength()+");");        
+      }
+      
+      if (action.lookAhead() == Action.GENERAL_LOOK) {
+        println("          // general lookahead, find correct zzMarkedPos");
+        println("          { int zzFState = "+dfa.entryState[action.getEntryState()]+";");
+        println("            int zzFPos = zzStartRead;");
+        println("            if (zzFin.length <= zzBufferL.length) { zzFin = new boolean[zzBufferL.length+1]; }");
+        println("            boolean zzFinL[] = zzFin;");
+        println("            while (zzFState != -1 && zzFPos < zzMarkedPos) {");
+        println("              if ((zzAttrL[zzFState] & 1) == 1) { zzFinL[zzFPos] = true; } ");
+        println("              zzInput = zzBufferL[zzFPos++];");
+        println("              zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];");
+        println("            }");
+        println("            if (zzFState != -1 && (zzAttrL[zzFState] & 1) == 1) { zzFinL[zzFPos] = true; } ");
+        println();                
+        println("            zzFState = "+dfa.entryState[action.getEntryState()+1]+";");
+        println("            zzFPos = zzMarkedPos;");
+        println("            while (!zzFinL[zzFPos] || (zzAttrL[zzFState] & 1) != 1) {");
+        println("              zzInput = zzBufferL[--zzFPos];");
+        println("              zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];");
+        println("            };");
+        println("            zzMarkedPos = zzFPos;");
+        println("          }");
+      }
+      
+      if ( scanner.debugOption ) {
+        print("          System.out.println(");
+        if ( scanner.lineCount )
+          print("\"line: \"+(yyline+1)+\" \"+");
+        if ( scanner.columnCount )
+          print("\"col: \"+(yycolumn+1)+\" \"+");
+        println("\"match: --\"+yytext()+\"--\");");        
+        print("          System.out.println(\"action ["+action.priority+"] { ");
+        print(escapify(action.content));
+        println(" }\");");
+      }
+      
+      println("          { "+action.content);
+      println("          }");
+      println("        case "+(i++)+": break;"); 
+    }
+  }
+
+  private void emitEOFVal() {
+    EOFActions eofActions = parser.getEOFActions();
+
+    if ( scanner.eofCode != null ) 
+      println("            zzDoEOF();");
+      
+    if ( eofActions.numActions() > 0 ) {
+      println("            switch (zzLexicalState) {");
+      
+      Enumeration stateNames = scanner.states.names();
+
+      // record lex states already emitted:
+      Hashtable used = new Hashtable();
+
+      // pick a start value for break case labels. 
+      // must be larger than any value of a lex state:
+      int last = dfa.numStates;
+      
+      while ( stateNames.hasMoreElements() ) {
+        String name = (String) stateNames.nextElement();
+        int num = scanner.states.getNumber(name).intValue();
+        Action action = eofActions.getAction(num);
+
+        if (action != null) {
+          println("            case "+name+": {");
+          if ( scanner.debugOption ) {
+            print("              System.out.println(");
+            if ( scanner.lineCount )
+              print("\"line: \"+(yyline+1)+\" \"+");
+            if ( scanner.columnCount )
+              print("\"col: \"+(yycolumn+1)+\" \"+");
+            println("\"match: <<EOF>>\");");        
+            print("              System.out.println(\"action ["+action.priority+"] { ");
+            print(escapify(action.content));
+            println(" }\");");
+          }
+          println("              "+action.content);
+          println("            }");
+          println("            case "+(++last)+": break;");
+        }
+      }
+      
+      println("            default:");
+    }
+
+    Action defaultAction = eofActions.getDefault();
+
+    if (defaultAction != null) {
+      println("              {");
+      if ( scanner.debugOption ) {
+        print("                System.out.println(");
+        if ( scanner.lineCount )
+          print("\"line: \"+(yyline+1)+\" \"+");
+        if ( scanner.columnCount )
+          print("\"col: \"+(yycolumn+1)+\" \"+");
+        println("\"match: <<EOF>>\");");        
+        print("                System.out.println(\"action ["+defaultAction.priority+"] { ");
+        print(escapify(defaultAction.content));
+        println(" }\");");
+      }
+      println("                " + defaultAction.content);
+      println("              }");
+    }
+    else if ( scanner.eofVal != null ) 
+      println("              { " + scanner.eofVal + " }");
+    else if ( scanner.isInteger ) {
+      if ( scanner.tokenType != null ) {
+        Out.error(ErrorMessages.INT_AND_TYPE);
+        throw new GeneratorException();
+      }
+      println("            return YYEOF;");
+    }
+    else
+      println("            return null;");
+
+    if (eofActions.numActions() > 0)
+      println("            }");
+  }
+  
+  private void emitState(int state) {
+    
+    println("            case "+state+":");
+    println("              switch (zzInput) {");
+   
+    int defaultTransition = getDefaultTransition(state);
+    
+    for (int next = 0; next < dfa.numStates; next++) {
+            
+      if ( next != defaultTransition && table[state][next] != null ) {
+        emitTransition(state, next);
+      }
+    }
+    
+    if ( defaultTransition != DFA.NO_TARGET && noTarget[state] != null ) {
+      emitTransition(state, DFA.NO_TARGET);
+    }
+    
+    emitDefaultTransition(state, defaultTransition);
+    
+    println("              }");
+    println("");
+  }
+  
+  private void emitTransition(int state, int nextState) {
+
+    CharSetEnumerator chars;
+    
+    if (nextState != DFA.NO_TARGET) 
+      chars = table[state][nextState].characters();
+    else 
+      chars = noTarget[state].characters();
+  
+    print("                case ");
+    print(chars.nextElement());
+    print(": ");
+    
+    while ( chars.hasMoreElements() ) {
+      println();
+      print("                case ");
+      print(chars.nextElement());
+      print(": ");
+    } 
+    
+    if ( nextState != DFA.NO_TARGET ) {
+      if ( dfa.isFinal[nextState] )
+        print("zzIsFinal = true; ");
+        
+      if ( !isTransition[nextState] )
+        print("zzNoLookAhead = true; ");
+        
+      if ( nextState == state ) 
+        println("break zzForNext;");
+      else
+        println("zzState = "+nextState+"; break zzForNext;");
+    }
+    else
+      println("break zzForAction;");
+  }
+  
+  private void emitDefaultTransition(int state, int nextState) {
+    print("                default: ");
+    
+    if ( nextState != DFA.NO_TARGET ) {
+      if ( dfa.isFinal[nextState] )
+        print("zzIsFinal = true; ");
+        
+      if ( !isTransition[nextState] )
+        print("zzNoLookAhead = true; ");
+        
+      if ( nextState == state ) 
+        println("break zzForNext;");
+      else
+        println("zzState = "+nextState+"; break zzForNext;");
+    }
+    else
+      println( "break zzForAction;" );
+  }
+  
+  private int getDefaultTransition(int state) {
+    int max = 0;
+    
+    for (int i = 0; i < dfa.numStates; i++) {
+      if ( table[state][max] == null )
+        max = i;
+      else
+      if ( table[state][i] != null && table[state][max].size() < table[state][i].size() )
+        max = i;
+    }
+    
+    if ( table[state][max] == null ) return DFA.NO_TARGET;
+    if ( noTarget[state] == null ) return max;
+    
+    if ( table[state][max].size() < noTarget[state].size() ) 
+      max = DFA.NO_TARGET;
+    
+    return max;
+  }
+
+  // for switch statement:
+  private void transformTransitionTable() {
+    
+    int numInput = parser.getCharClasses().getNumClasses()+1;
+
+    int i;    
+    char j;
+    
+    table = new CharSet[dfa.numStates][dfa.numStates];
+    noTarget = new CharSet[dfa.numStates];
+    
+    for (i = 0; i < dfa.numStates;  i++) 
+      for (j = 0; j < dfa.numInput; j++) {
+
+        int nextState = dfa.table[i][j];
+        
+        if ( nextState == DFA.NO_TARGET ) {
+          if ( noTarget[i] == null ) 
+            noTarget[i] = new CharSet(numInput, colMap[j]);
+          else
+            noTarget[i].add(colMap[j]);
+        }
+        else {
+          if ( table[i][nextState] == null ) 
+            table[i][nextState] = new CharSet(numInput, colMap[j]);
+          else
+            table[i][nextState].add(colMap[j]);
+        }
+      }
+  }
+
+  private void findActionStates() {
+    isTransition = new boolean [dfa.numStates];
+    
+    for (int i = 0; i < dfa.numStates;  i++) {
+      char j = 0;
+      while ( !isTransition[i] && j < dfa.numInput )
+        isTransition[i] = dfa.table[i][j++] != DFA.NO_TARGET;
+    }
+  }
+
+  
+  private void reduceColumns() {
+    colMap = new int [dfa.numInput];
+    colKilled = new boolean [dfa.numInput];
+
+    int i,j,k;
+    int translate = 0;
+    boolean equal;
+
+    numCols = dfa.numInput;
+
+    for (i = 0; i < dfa.numInput; i++) {
+      
+      colMap[i] = i-translate;
+      
+      for (j = 0; j < i; j++) {
+        
+        // test for equality:
+        k = -1;
+        equal = true;        
+        while (equal && ++k < dfa.numStates) 
+          equal = dfa.table[k][i] == dfa.table[k][j];
+        
+        if (equal) {
+          translate++;
+          colMap[i] = colMap[j];
+          colKilled[i] = true;
+          numCols--;
+          break;
+        } // if
+      } // for j
+    } // for i
+  }
+  
+  private void reduceRows() {
+    rowMap = new int [dfa.numStates];
+    rowKilled = new boolean [dfa.numStates];
+    
+    int i,j,k;
+    int translate = 0;
+    boolean equal;
+
+    numRows = dfa.numStates;
+
+    // i is the state to add to the new table
+    for (i = 0; i < dfa.numStates; i++) {
+      
+      rowMap[i] = i-translate;
+      
+      // check if state i can be removed (i.e. already
+      // exists in entries 0..i-1)
+      for (j = 0; j < i; j++) {
+        
+        // test for equality:
+        k = -1;
+        equal = true;
+        while (equal && ++k < dfa.numInput) 
+          equal = dfa.table[i][k] == dfa.table[j][k];
+        
+        if (equal) {
+          translate++;
+          rowMap[i] = rowMap[j];
+          rowKilled[i] = true;
+          numRows--;
+          break;
+        } // if
+      } // for j
+    } // for i
+    
+  } 
+
+
+  /**
+   * Set up EOF code section according to scanner.eofcode 
+   */
+  private void setupEOFCode() {
+    if (scanner.eofclose) {
+      scanner.eofCode = LexScan.conc(scanner.eofCode, "  yyclose();");
+      scanner.eofThrow = LexScan.concExc(scanner.eofThrow, "java.io.IOException");
+    }    
+  } 
+
+
+  /**
+   * Main Emitter method.  
+   */
+  public void emit() {    
+
+    setupEOFCode();
+
+    if (scanner.functionName == null) 
+      scanner.functionName = "yylex";
+
+    reduceColumns();
+    findActionStates();
+
+    emitHeader();
+    emitUserCode();
+    emitClassName();
+    
+    skel.emitNext();
+    
+    println("  private static final int ZZ_BUFFERSIZE = "+scanner.bufferSize+";");
+
+    if (scanner.debugOption) {
+      println("  private static final String ZZ_NL = System.getProperty(\"line.separator\");");
+    }
+
+    skel.emitNext();
+
+    emitLexicalStates();
+   
+    emitCharMapArray();
+    
+    emitActionTable();
+    
+    if (scanner.useRowMap) {
+     reduceRows();
+    
+      emitRowMapArray();
+
+      if (scanner.packed)
+        emitDynamicInit();
+      else
+        emitZZTrans();
+    }
+    
+    skel.emitNext();
+    
+    if (scanner.useRowMap) 
+      emitAttributes();    
+    
+    skel.emitNext();
+    
+    emitLookBuffer();
+    
+    emitClassCode();
+    
+    skel.emitNext();
+    
+    emitConstructorDecl();
+        
+    emitCharMapInitFunction();
+
+    skel.emitNext();
+    
+    emitScanError();
+
+    skel.emitNext();        
+
+    emitDoEOF();
+    
+    skel.emitNext();
+    
+    emitLexFunctHeader();
+    
+    emitNextInput();
+
+    if (scanner.useRowMap)
+      emitGetRowMapNext();
+    else
+      emitTransitionTable();
+        
+    skel.emitNext();
+
+    emitActions();
+        
+    skel.emitNext();
+
+    emitEOFVal();
+    
+    skel.emitNext();
+    
+    emitNoMatch();
+
+    skel.emitNext();
+    
+    emitMain();
+    
+    skel.emitNext();
+
+    out.close();
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/ErrorMessages.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/ErrorMessages.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/ErrorMessages.java	(revision 25584)
@@ -0,0 +1,149 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software); you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY); without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program); if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+
+/**
+ * Central class for all kinds of JFlex messages.
+ * 
+ * [Is not yet used exclusively, but should]
+ * 
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class ErrorMessages {  
+  private String key;
+
+  /* not final static, because initializing here seems too early
+   * for OS/2 JDK 1.1.8. See bug 1065521.
+   */ 
+  private static ResourceBundle resourceBundle = null;
+
+  private ErrorMessages(String key) {
+    this.key = key;
+  }
+
+  public static String get(ErrorMessages msg) {
+    if (resourceBundle == null) {
+      resourceBundle = ResourceBundle.getBundle("JFlex.Messages"); 
+    }    
+    try {
+      return resourceBundle.getString(msg.key);
+    } catch (MissingResourceException e) {
+      return '!' + msg.key + '!';
+    }
+  }
+  
+  public static String get(ErrorMessages msg, String data) {
+    Object [] args = { data };
+    return MessageFormat.format(get(msg),args);
+  }
+  
+  public static String get(ErrorMessages msg, String data1, String data2) {
+    Object [] args = { data1, data2 };
+    return MessageFormat.format(get(msg),args);
+  }
+
+  public static String get(ErrorMessages msg, int data) {
+    Object [] args = { new Integer(data) };
+    return MessageFormat.format(get(msg),args);
+  }
+
+  // typesafe enumeration (generated, do not edit)  
+  public static ErrorMessages UNTERMINATED_STR = new ErrorMessages("UNTERMINATED_STR");
+  public static ErrorMessages EOF_WO_ACTION = new ErrorMessages("EOF_WO_ACTION");
+  public static ErrorMessages EOF_SINGLERULE = new ErrorMessages("EOF_SINGLERULE");
+  public static ErrorMessages UNKNOWN_OPTION = new ErrorMessages("UNKNOWN_OPTION");
+  public static ErrorMessages UNEXPECTED_CHAR = new ErrorMessages("UNEXPECTED_CHAR");
+  public static ErrorMessages UNEXPECTED_NL = new ErrorMessages("UNEXPECTED_NL");
+  public static ErrorMessages LEXSTATE_UNDECL = new ErrorMessages("LEXSTATE_UNDECL");
+  public static ErrorMessages STATE_IDENT_EXP = new ErrorMessages("STATE_IDENT_EXP");
+  public static ErrorMessages REPEAT_ZERO = new ErrorMessages("REPEAT_ZERO");
+  public static ErrorMessages REPEAT_GREATER = new ErrorMessages("REPEAT_GREATER");
+  public static ErrorMessages REGEXP_EXPECTED = new ErrorMessages("REGEXP_EXPECTED");
+  public static ErrorMessages MACRO_UNDECL = new ErrorMessages("MACRO_UNDECL");
+  public static ErrorMessages CHARSET_2_SMALL = new ErrorMessages("CHARSET_2_SMALL");
+  public static ErrorMessages CS2SMALL_STRING = new ErrorMessages("CS2SMALL_STRING");
+  public static ErrorMessages CS2SMALL_CHAR = new ErrorMessages("CS2SMALL_CHAR");
+  public static ErrorMessages CHARCLASS_MACRO = new ErrorMessages("CHARCLASS_MACRO");
+  public static ErrorMessages UNKNOWN_SYNTAX = new ErrorMessages("UNKNOWN_SYNTAX");
+  public static ErrorMessages SYNTAX_ERROR = new ErrorMessages("SYNTAX_ERROR");
+  public static ErrorMessages NOT_AT_BOL = new ErrorMessages("NOT_AT_BOL");
+  public static ErrorMessages NO_MATCHING_BR = new ErrorMessages("NO_MATCHING_BR");
+  public static ErrorMessages EOF_IN_ACTION = new ErrorMessages("EOF_IN_ACTION");
+  public static ErrorMessages EOF_IN_COMMENT = new ErrorMessages("EOF_IN_COMMENT");
+  public static ErrorMessages EOF_IN_STRING = new ErrorMessages("EOF_IN_STRING");
+  public static ErrorMessages EOF_IN_MACROS = new ErrorMessages("EOF_IN_MACROS");
+  public static ErrorMessages EOF_IN_STATES = new ErrorMessages("EOF_IN_STATES");
+  public static ErrorMessages EOF_IN_REGEXP = new ErrorMessages("EOF_IN_REGEXP");
+  public static ErrorMessages UNEXPECTED_EOF = new ErrorMessages("UNEXPECTED_EOF");
+  public static ErrorMessages NO_LEX_SPEC = new ErrorMessages("NO_LEX_SPEC");
+  public static ErrorMessages NO_LAST_ACTION = new ErrorMessages("NO_LAST_ACTION");
+  public static ErrorMessages NO_DIRECTORY = new ErrorMessages("NO_DIRECTORY");
+  public static ErrorMessages NO_SKEL_FILE = new ErrorMessages("NO_SKEL_FILE");
+  public static ErrorMessages WRONG_SKELETON = new ErrorMessages("WRONG_SKELETON");
+  public static ErrorMessages OUT_OF_MEMORY = new ErrorMessages("OUT_OF_MEMORY");
+  public static ErrorMessages QUIL_INITTHROW = new ErrorMessages("QUIL_INITTHROW");
+  public static ErrorMessages QUIL_EOFTHROW = new ErrorMessages("QUIL_EOFTHROW");
+  public static ErrorMessages QUIL_YYLEXTHROW = new ErrorMessages("QUIL_YYLEXTHROW");
+  public static ErrorMessages ZERO_STATES = new ErrorMessages("ZERO_STATES");
+  public static ErrorMessages NO_BUFFER_SIZE = new ErrorMessages("NO_BUFFER_SIZE");
+  public static ErrorMessages NOT_READABLE = new ErrorMessages("NOT_READABLE");
+  public static ErrorMessages FILE_CYCLE = new ErrorMessages("FILE_CYCLE");
+  public static ErrorMessages FILE_WRITE = new ErrorMessages("FILE_WRITE");
+  public static ErrorMessages QUIL_SCANERROR = new ErrorMessages("QUIL_SCANERROR");
+  public static ErrorMessages NEVER_MATCH = new ErrorMessages("NEVER_MATCH");
+  public static ErrorMessages QUIL_THROW = new ErrorMessages("QUIL_THROW");
+  public static ErrorMessages EOL_IN_CHARCLASS = new ErrorMessages("EOL_IN_CHARCLASS");
+  public static ErrorMessages QUIL_CUPSYM = new ErrorMessages("QUIL_CUPSYM");
+  public static ErrorMessages CUPSYM_AFTER_CUP = new ErrorMessages("CUPSYM_AFTER_CUP");
+  public static ErrorMessages ALREADY_RUNNING = new ErrorMessages("ALREADY_RUNNING");
+  public static ErrorMessages CANNOT_READ_SKEL = new ErrorMessages("CANNOT_READ_SKEL");
+  public static ErrorMessages READING_SKEL = new ErrorMessages("READING_SKEL");
+  public static ErrorMessages SKEL_IO_ERROR = new ErrorMessages("SKEL_IO_ERROR");
+  public static ErrorMessages SKEL_IO_ERROR_DEFAULT = new ErrorMessages("SKEL_IO_ERROR_DEFAULT");
+  public static ErrorMessages READING = new ErrorMessages("READING");
+  public static ErrorMessages CANNOT_OPEN = new ErrorMessages("CANNOT_OPEN");
+  public static ErrorMessages NFA_IS = new ErrorMessages("NFA_IS");
+  public static ErrorMessages NFA_STATES = new ErrorMessages("NFA_STATES");
+  public static ErrorMessages DFA_TOOK = new ErrorMessages("DFA_TOOK");
+  public static ErrorMessages DFA_IS = new ErrorMessages("DFA_IS");
+  public static ErrorMessages MIN_TOOK = new ErrorMessages("MIN_TOOK");
+  public static ErrorMessages MIN_DFA_IS = new ErrorMessages("MIN_DFA_IS");
+  public static ErrorMessages WRITE_TOOK = new ErrorMessages("WRITE_TOOK");
+  public static ErrorMessages TOTAL_TIME = new ErrorMessages("TOTAL_TIME");
+  public static ErrorMessages IO_ERROR = new ErrorMessages("IO_ERROR");
+  public static ErrorMessages THIS_IS_JFLEX = new ErrorMessages("THIS_IS_JFLEX");
+  public static ErrorMessages UNKNOWN_COMMANDLINE = new ErrorMessages("UNKNOWN_COMMANDLINE");
+  public static ErrorMessages MACRO_CYCLE = new ErrorMessages("MACRO_CYCLE");
+  public static ErrorMessages MACRO_DEF_MISSING = new ErrorMessages("MACRO_DEF_MISSING");
+  public static ErrorMessages PARSING_TOOK = new ErrorMessages("PARSING_TOOK");
+  public static ErrorMessages NFA_TOOK = new ErrorMessages("NFA_TOOK");
+  public static ErrorMessages LOOKAHEAD_NEEDS_ACTION = new ErrorMessages("LOOKAHEAD_NEEDS_ACTION");
+  public static ErrorMessages EMPTY_MATCH = new ErrorMessages("EMPTY_MATCH");
+  public static ErrorMessages CTOR_ARG = new ErrorMessages("CTOR_ARG");
+  public static ErrorMessages CTOR_DEBUG = new ErrorMessages("CTOR_DEBUG");
+  public static ErrorMessages INT_AND_TYPE = new ErrorMessages("INT_AND_TYPE");
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/GeneratorException.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/GeneratorException.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/GeneratorException.java	(revision 25584)
@@ -0,0 +1,36 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * Thrown when code generation has to be aborted.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class GeneratorException extends RuntimeException {
+
+  public GeneratorException() {
+    super("Generation aborted");
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/HiLowEmitter.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/HiLowEmitter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/HiLowEmitter.java	(revision 25584)
@@ -0,0 +1,88 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * jflex                                                         *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+/**
+ * HiLowEmitter
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class HiLowEmitter extends PackEmitter {
+
+  /** number of entries in expanded array */
+  private int numEntries;
+
+  /**
+   * Create new emitter for values in [0, 0xFFFFFFFF] using hi/low encoding.
+   * 
+   * @param name   the name of the generated array
+   */
+  public HiLowEmitter(String name) {
+    super(name);
+  }
+
+  /**
+   * Emits hi/low pair unpacking code for the generated array. 
+   * 
+   * @see JFlex.PackEmitter#emitUnPack()
+   */
+  public void emitUnpack() {
+    // close last string chunk:
+    println("\";");
+    nl();
+    println("  private static int [] zzUnpack"+name+"() {");
+    println("    int [] result = new int["+numEntries+"];");
+    println("    int offset = 0;");
+
+    for (int i = 0; i < chunks; i++) {
+      println("    offset = zzUnpack"+name+"("+constName()+"_PACKED_"+i+", offset, result);");
+    }
+
+    println("    return result;");
+    println("  }");
+
+    nl();
+    println("  private static int zzUnpack"+name+"(String packed, int offset, int [] result) {");
+    println("    int i = 0;  /* index in packed string  */");
+    println("    int j = offset;  /* index in unpacked array */");
+    println("    int l = packed.length();");
+    println("    while (i < l) {");
+    println("      int high = packed.charAt(i++) << 16;");
+    println("      result[j++] = high | packed.charAt(i++);");
+    println("    }");
+    println("    return j;");
+    println("  }");
+  }
+
+  /**
+   * Emit one value using two characters. 
+   *
+   * @param val  the value to emit
+   * @prec  0 <= val <= 0xFFFFFFFF 
+   */
+  public void emit(int val) {
+    numEntries+= 1;
+    breaks();
+    emitUC(val >> 16);
+    emitUC(val & 0xFFFF);        
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/IntCharSet.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/IntCharSet.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/IntCharSet.java	(revision 25584)
@@ -0,0 +1,411 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.util.*;
+
+
+/** 
+ * CharSet implemented with intervalls
+ *
+ * [fixme: optimizations possible]
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public final class IntCharSet {
+
+  private final static boolean DEBUG = false;
+
+  /* invariant: all intervals are disjoint, ordered */
+  private Vector intervalls;  
+  private int pos; 
+
+  public IntCharSet() {
+    this.intervalls = new Vector();
+  }
+
+  public IntCharSet(char c) {
+    this(new Interval(c,c));
+  }
+
+  public IntCharSet(Interval intervall) {
+    this();
+    intervalls.addElement(intervall);
+  }
+
+  public IntCharSet(Vector /* Interval */ chars) {
+    int size = chars.size();
+
+    this.intervalls = new Vector(size);
+    
+    for (int i = 0; i < size; i++) 
+      add( (Interval) chars.elementAt(i) );    
+  }
+
+  
+  
+
+  /**
+   * returns the index of the intervall that contains
+   * the character c, -1 if there is no such intevall
+   *
+   * @prec: true
+   * @post: -1 <= return < intervalls.size() && 
+   *        (return > -1 --> intervalls[return].contains(c))
+   * 
+   * @param c  the character
+   * @return the index of the enclosing interval, -1 if no such interval  
+   */
+  private int indexOf(char c) {
+    int start = 0;
+    int end   = intervalls.size()-1;
+
+    while (start <= end) {
+      int check = (start+end) / 2;
+      Interval i = (Interval) intervalls.elementAt(check);
+      
+      if (start == end) 
+        return i.contains(c) ? start : -1;      
+
+      if (c < i.start) {
+        end = check-1;
+        continue;
+      }
+
+      if (c > i.end) {
+        start = check+1;
+        continue;
+      }
+
+      return check;
+    }
+
+    return -1;
+  } 
+
+  public IntCharSet add(IntCharSet set) {
+    for (int i = 0; i < set.intervalls.size(); i++) 
+      add( (Interval) set.intervalls.elementAt(i) );    
+    return this;
+  }
+
+  public void add(Interval intervall) {
+    
+    int size = intervalls.size();
+
+    for (int i = 0; i < size; i++) {
+      Interval elem = (Interval) intervalls.elementAt(i);
+
+      if ( elem.end+1 < intervall.start ) continue;
+      
+      if ( elem.contains(intervall) ) return;      
+
+      if ( elem.start > intervall.end+1 ) {
+        intervalls.insertElementAt(new Interval(intervall), i);
+        return;
+      }
+      
+      if (intervall.start < elem.start)
+        elem.start = intervall.start;
+      
+      if (intervall.end <= elem.end) 
+        return;
+        
+      elem.end = intervall.end;
+        
+      i++;      
+      // delete all x with x.contains( intervall.end )
+      while (i < size) {
+        Interval x = (Interval) intervalls.elementAt(i);
+        if (x.start > elem.end+1) return;
+        
+        elem.end = x.end;
+        intervalls.removeElementAt(i);
+        size--;
+      }
+      return;      
+    }
+
+    intervalls.addElement(new Interval(intervall));
+  }
+
+  public void add(char c) {
+    int size = intervalls.size();
+
+    for (int i = 0; i < size; i++) {
+      Interval elem = (Interval) intervalls.elementAt(i);
+      if (elem.end+1 < c) continue;
+
+      if (elem.contains(c)) return; // already there, nothing to do
+
+      // assert(elem.end+1 >= c && (elem.start > c || elem.end < c));
+      
+      if (elem.start > c+1) {
+        intervalls.insertElementAt(new Interval(c,c), i);
+        return;                 
+      }
+
+      // assert(elem.end+1 >= c && elem.start <= c+1 && (elem.start > c || elem.end < c));
+ 
+      if (c+1 == elem.start) {
+        elem.start = c;
+        return;
+      }
+      
+      // assert(elem.end+1 == c);
+      elem.end = c;
+
+      // merge with next interval if it contains c
+      if (i+1 >= size) return;
+      Interval x = (Interval) intervalls.elementAt(i+1);
+      if (x.start <= c+1) {
+        elem.end = x.end;
+        intervalls.removeElementAt(i+1);
+      }
+      return;
+    }
+    
+    // end reached but nothing found -> append at end
+    intervalls.addElement(new Interval(c,c));
+  } 
+
+ 
+  public boolean contains(char singleChar) {
+    return indexOf(singleChar) >= 0;
+  }
+
+
+  /**
+   * o instanceof Interval
+   */
+  public boolean equals(Object o) {
+    IntCharSet set = (IntCharSet) o;
+    if ( intervalls.size() != set.intervalls.size() ) return false;
+
+    for (int i = 0; i < intervalls.size(); i++) {
+      if ( !intervalls.elementAt(i).equals( set.intervalls.elementAt(i)) ) 
+        return false;
+    }
+
+    return true;
+  }
+
+  private char min(char a, char b) {
+    return a <= b ? a : b;
+  }
+
+  private char max(char a, char b) {
+    return a >= b ? a : b;
+  }
+
+  /* intersection */
+  public IntCharSet and(IntCharSet set) {
+    if (DEBUG) {
+      Out.dump("intersection");
+      Out.dump("this  : "+this);
+      Out.dump("other : "+set);
+    }
+
+    IntCharSet result = new IntCharSet();
+
+    int i = 0;  // index in this.intervalls
+    int j = 0;  // index in set.intervalls
+
+    int size = intervalls.size();
+    int setSize = set.intervalls.size();
+
+    while (i < size && j < setSize) {
+      Interval x = (Interval) this.intervalls.elementAt(i);
+      Interval y = (Interval) set.intervalls.elementAt(j);
+
+      if (x.end < y.start) {
+        i++;
+        continue;
+      }
+
+      if (y.end < x.start) {
+        j++;
+        continue;
+      }
+
+      result.intervalls.addElement(
+        new Interval(
+          max(x.start, y.start), 
+          min(x.end, y.end)
+          )
+        );
+
+      if (x.end >= y.end) j++;
+      if (y.end >= x.end) i++;
+    }
+
+    if (DEBUG) {
+      Out.dump("result: "+result);
+    }
+
+    return result;
+  }
+  
+  /* complement */
+  /* prec: this.contains(set), set != null */
+  public void sub(IntCharSet set) {
+    if (DEBUG) {
+      Out.dump("complement");
+      Out.dump("this  : "+this);
+      Out.dump("other : "+set);
+    }
+
+    int i = 0;  // index in this.intervalls
+    int j = 0;  // index in set.intervalls
+
+    int setSize = set.intervalls.size();
+
+    while (i < intervalls.size() && j < setSize) {
+      Interval x = (Interval) this.intervalls.elementAt(i);
+      Interval y = (Interval) set.intervalls.elementAt(j);
+
+      if (DEBUG) {
+        Out.dump("this      : "+this);
+        Out.dump("this  ["+i+"] : "+x);
+        Out.dump("other ["+j+"] : "+y);
+      }
+
+      if (x.end < y.start) {
+        i++;
+        continue;
+      }
+
+      if (y.end < x.start) {
+        j++;
+        continue;
+      }
+
+      // x.end >= y.start && y.end >= x.start ->
+      // x.end <= y.end && x.start >= y.start (prec)
+      
+      if ( x.start == y.start && x.end == y.end ) {
+        intervalls.removeElementAt(i);
+        j++;
+        continue;
+      }
+
+      // x.end <= y.end && x.start >= y.start &&
+      // (x.end < y.end || x.start > y.start) ->
+      // x.start < x.end 
+
+      if ( x.start == y.start ) {
+        x.start = (char) (y.end+1);
+        j++;
+        continue;
+      }
+
+      if ( x.end == y.end ) {
+        x.end = (char) (y.start-1);
+        i++;
+        j++;
+        continue;
+      }
+
+      intervalls.insertElementAt(new Interval(x.start, (char) (y.start-1)), i);
+      x.start = (char) (y.end+1);
+
+      i++;
+      j++;
+    }   
+
+    if (DEBUG) {
+      Out.dump("result: "+this);
+    }
+  }
+
+  public boolean containsElements() {
+    return intervalls.size() > 0;
+  }
+
+  public int numIntervalls() {
+    return intervalls.size();
+  }
+
+  // beware: depends on caller protocol, single user only 
+  public Interval getNext() {
+    if (pos == intervalls.size()) pos = 0;
+    return (Interval) intervalls.elementAt(pos++);
+  }
+
+  /**
+   * Create a caseless version of this charset.
+   * <p>
+   * The caseless version contains all characters of this char set,
+   * and additionally all lower/upper/title case variants of the 
+   * characters in this set.
+   * 
+   * @return a caseless copy of this set
+   */
+  public IntCharSet getCaseless() {
+    IntCharSet n = copy();
+        
+    int size = intervalls.size();
+    for (int i=0; i < size; i++) {
+      Interval elem = (Interval) intervalls.elementAt(i);
+      for (char c = elem.start; c <= elem.end; c++) {
+        n.add(Character.toLowerCase(c)); 
+        n.add(Character.toUpperCase(c)); 
+        n.add(Character.toTitleCase(c)); 
+      }
+    }
+    
+    return n;    
+  }
+
+
+  /**
+   * Make a string representation of this char set.
+   * 
+   * @return a string representing this char set.
+   */
+  public String toString() {
+    StringBuffer result = new StringBuffer("{ ");
+
+    for (int i = 0; i < intervalls.size(); i++)
+      result.append( intervalls.elementAt(i) );
+
+    result.append(" }");
+
+    return result.toString();
+  }
+  
+  
+  /** 
+   * Return a (deep) copy of this char set
+   * 
+   * @return the copy
+   */
+  public IntCharSet copy() {
+    IntCharSet result = new IntCharSet();
+    int size = intervalls.size();
+    for (int i=0; i < size; i++) {
+      Interval iv = ((Interval) intervalls.elementAt(i)).copy();
+      result.intervalls.addElement(iv);
+    }
+    return result;
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/IntPair.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/IntPair.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/IntPair.java	(revision 25584)
@@ -0,0 +1,57 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * Simple pair of integers.
+ *
+ * Used in NFA to represent a partial NFA by its start and end state.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final class IntPair {
+
+  int start;
+  int end;
+  
+  IntPair(int start, int end) {
+    this.start = start;
+    this.end = end;
+  }
+
+  public int hashCode() {
+    return end + (start << 8);
+  }  
+  
+  public boolean equals(Object o) {
+    if ( o instanceof IntPair ) {
+      IntPair p = (IntPair) o;
+      return start == p.start && end == p.end;
+    }
+    return false;
+  }
+  
+  public String toString() {
+    return "("+start+","+end+")";
+  }
+} 
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Interval.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Interval.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Interval.java	(revision 25584)
@@ -0,0 +1,163 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * An intervall of characters with basic operations.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public final class Interval {
+
+  /* start and end of the intervall */
+  public char start, end;
+  
+
+  /**
+   * Constuct a new intervall from <code>start</code> to <code>end</code>.
+   *
+   * @param start  first character the intervall should contain
+   * @param end    last  character the intervall should contain
+   */
+  public Interval(char start, char end) {
+    this.start = start;
+    this.end = end;
+  }
+
+
+  /**
+   * Copy constructor
+   */
+  public Interval(Interval other) {
+    this.start = other.start;
+    this.end   = other.end;
+  }
+
+
+  /**
+   * Return <code>true</code> iff <code>point</code> is contained in this intervall.
+   *
+   * @param point  the character to check
+   */
+  public boolean contains(char point) {
+    return start <= point && end >= point;
+  }
+
+
+  /**
+   * Return <code>true</code> iff this intervall completely contains the 
+   * other one.
+   *
+   * @param other    the other intervall 
+   */
+  public boolean contains(Interval other) {
+    return this.start <= other.start && this.end >= other.end;
+  }
+  
+
+  /**
+   * Return <code>true</code> if <code>o</code> is an intervall
+   * with the same borders.
+   *
+   * @param o  the object to check equality with
+   */
+  public boolean equals(Object o) {
+    if ( o == this ) return true;
+    if ( !(o instanceof Interval) ) return false;
+
+    Interval other = (Interval) o;
+    return other.start == this.start && other.end == this.end;
+  }
+  
+
+  /**
+   * Set a new last character
+   *
+   * @param end  the new last character of this intervall
+   */
+  public void setEnd(char end) {
+    this.end = end;
+  }
+
+
+  /** 
+   * Set a new first character
+   *
+   * @param start the new first character of this intervall
+   */ 
+  public void setStart(char start) {
+    this.start = start;
+  } 
+  
+  
+  /**
+   * Check wether a character is printable.
+   *
+   * @param c the character to check
+   */
+  private static boolean isPrintable(char c) {
+    // fixme: should make unicode test here
+    return c > 31 && c < 127; 
+  }
+
+
+  /**
+   * Get a String representation of this intervall.
+   *
+   * @return a string <code>"[start-end]"</code> or
+   *         <code>"[start]"</code> (if there is only one character in
+   *         the intervall) where <code>start</code> and
+   *         <code>end</code> are either a number (the character code)
+   *         or something of the from <code>'a'</code>.  
+   */
+  public String toString() {
+    StringBuffer result = new StringBuffer("[");
+
+    if ( isPrintable(start) )
+      result.append("'"+start+"'");
+    else
+      result.append( (int) start );
+
+    if (start != end) {
+      result.append("-");
+
+      if ( isPrintable(end) )
+        result.append("'"+end+"'");
+      else
+        result.append( (int) end );
+    }
+
+    result.append("]");
+    return result.toString();
+  }
+
+
+  /**
+   * Make a copy of this interval.
+   * 
+   * @return the copy
+   */
+  public Interval copy() {    
+    return new Interval(start,end);
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexParse.cup
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexParse.cup	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexParse.cup	(revision 25584)
@@ -0,0 +1,648 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.util.*;
+
+/* customizing code */
+
+action code {:
+
+  LexScan     scanner;
+  CharClasses charClasses = new CharClasses(Options.jlex ? 127 : 0xFFFF);
+  RegExps     regExps     = new RegExps();
+  Macros      macros      = new Macros();
+  Integer     stateNumber;
+  Timer       t           = new Timer();
+  EOFActions  eofActions  = new EOFActions();
+
+  void fatalError(ErrorMessages message, int line, int col) {
+    syntaxError(message, line, col);
+    throw new GeneratorException();
+  }
+
+  void fatalError(ErrorMessages message) {
+    fatalError(message, scanner.currentLine(), -1);
+    throw new GeneratorException();
+  }
+
+  void syntaxError(ErrorMessages message) {
+    Out.error(scanner.file, message, scanner.currentLine(), -1);
+  }
+  
+  void syntaxError(ErrorMessages message, int line) {
+    Out.error(scanner.file, message, line, -1);
+  }
+
+  void syntaxError(ErrorMessages message, int line, int col) {
+    Out.error(scanner.file, message, line, col);
+  }
+
+
+  private boolean check(int type, char c) {
+    switch (type) {
+      case sym.JLETTERCLASS:
+        return Character.isJavaIdentifierStart(c);
+        
+      case sym.JLETTERDIGITCLASS:
+        return Character.isJavaIdentifierPart(c);
+        
+      case sym.LETTERCLASS:
+        return Character.isLetter(c);
+        
+      case sym.DIGITCLASS:
+        return Character.isDigit(c);
+        
+      case sym.UPPERCLASS: 
+        return Character.isUpperCase(c);
+        
+      case sym.LOWERCLASS: 
+        return Character.isLowerCase(c);
+        
+      default: return false;
+    }
+  }
+  
+  private Vector makePreClass(int type) {
+    
+    Vector result = new Vector();
+    
+    char c = 0;
+    char start = 0;
+    char last = charClasses.getMaxCharCode();
+    
+    boolean prev, current;
+    
+    prev = check(type,'\u0000');
+    
+    for (c = 1; c < last; c++) {
+      
+      current = check(type,c);
+      
+      if (!prev && current) start = c;
+      if (prev && !current) {
+        result.addElement(new Interval(start, (char)(c-1)));
+      }
+      
+      prev = current;
+    }
+    
+    // the last iteration is moved out of the loop to
+    // avoid an endless loop if last == maxCharCode and
+    // last+1 == 0
+    current = check(type,c);
+    
+    if (!prev && current) result.addElement(new Interval(c,c));
+    if (prev && current)  result.addElement(new Interval(start, c));    
+    if (prev && !current) result.addElement(new Interval(start, (char)(c-1)));
+
+    return result;
+  }
+  
+  private RegExp makeRepeat(RegExp r, int n1, int n2, int line, int col) {
+
+    if (n1 <= 0 && n2 <= 0) {
+      syntaxError(ErrorMessages.REPEAT_ZERO, line, col);
+      return null;
+    }
+
+    if (n1 > n2) {
+      syntaxError(ErrorMessages.REPEAT_GREATER, line, col);
+      return null;
+    }
+    
+    int i;
+    RegExp result;    
+
+    if (n1 > 0) {
+      result = r;
+      n1--; n2--; // we need one concatenation less than the number of expressions to match
+    }
+    else {
+      result = new RegExp1(sym.QUESTION,r);
+      n2--;
+    }
+
+    for (i = 0; i < n1; i++) 
+      result = new RegExp2(sym.CONCAT, result, r);
+      
+    n2-= n1;  
+    for (i = 0; i < n2; i++)
+      result = new RegExp2(sym.CONCAT, result, new RegExp1(sym.QUESTION,r));
+    
+    return result;
+  }
+
+  private RegExp makeNL() {
+    Vector list = new Vector();
+    list.addElement(new Interval('\n','\r'));
+    list.addElement(new Interval('\u0085','\u0085'));
+    list.addElement(new Interval('\u2028','\u2029'));
+
+	// assumption: line feeds are caseless
+    charClasses.makeClass(list, false);
+    charClasses.makeClass('\n', false);
+    charClasses.makeClass('\r', false);
+
+    RegExp1   c = new RegExp1(sym.CCLASS, list);
+    Character n = new Character('\n');
+    Character r = new Character('\r');
+
+    return new RegExp2(sym.BAR, 
+                       c, 
+                       new RegExp2(sym.CONCAT, 
+                                   new RegExp1(sym.CHAR, r), 
+                                   new RegExp1(sym.CHAR, n)));
+  }
+  
+:};
+
+parser code {:
+   public LexScan scanner;
+
+   public LexParse(LexScan scanner) {
+     super(scanner);
+     this.scanner = scanner;
+   }
+   
+   public CharClasses getCharClasses() {
+     return action_obj.charClasses;
+   }
+
+   public EOFActions getEOFActions() {
+     return action_obj.eofActions;
+   }
+       
+   public void report_error(String message, Object info) {     
+     if ( info instanceof java_cup.runtime.Symbol ) {
+       java_cup.runtime.Symbol s = (java_cup.runtime.Symbol) info;
+  
+       if (s.sym == sym.EOF) 
+         Out.error(ErrorMessages.UNEXPECTED_EOF);
+       else
+         Out.error(scanner.file, ErrorMessages.SYNTAX_ERROR, s.left, s.right);
+     }
+     else 
+       Out.error(ErrorMessages.UNKNOWN_SYNTAX);
+   }
+   
+   public void report_fatal_error(String message, Object info) {
+     // report_error(message, info);
+     throw new GeneratorException();
+   }
+
+:};
+
+init with {:
+  action_obj.scanner = this.scanner;
+:};
+
+/* token declarations */
+
+terminal OPENBRACKET, CLOSEBRACKET, HAT, DOLLAR, OPENCLASS,
+         CLOSECLASS, DASH, DELIMITER, EQUALS, COMMA, LESSTHAN,
+         MORETHAN, LBRACE, RBRACE, ASCII, FULL, UNICODE, REGEXPEND;
+
+terminal JLETTERCLASS, JLETTERDIGITCLASS, LETTERCLASS, DIGITCLASS, 
+         UPPERCLASS, LOWERCLASS, EOFRULE, NOACTION, LOOKAHEAD;
+         
+terminal Action ACTION;
+terminal String IDENT, USERCODE;
+terminal Integer REPEAT;
+
+/* tokens used in RegExp parse tree */
+terminal STAR, PLUS, BAR, QUESTION, POINT, BANG, TILDE;
+
+terminal Character CHAR;
+terminal String STRING, MACROUSE;
+
+/* symbols *only* used in the parse tree (not in the grammar) */
+terminal CCLASS, CCLASSNOT, CONCAT;
+terminal STRING_I, CHAR_I;  /* case insensitive strings/chars */
+
+
+non terminal           macros, macro;
+non terminal Integer   rule;
+non terminal NFA       specification;
+non terminal RegExp    series, concs, nregexp, regexp, charclass, lookahead;
+non terminal Interval  classcontentelem;
+non terminal Vector    states, statesOPT, classcontent, preclass, rules;
+non terminal Boolean   hatOPT;
+non terminal Action    act, actions;
+
+
+/* grammar specification */
+start with specification;
+
+specification ::=  USERCODE
+                   /* delimiter is checked in lexer */
+                   macros
+                   DELIMITER 
+                   rules
+                   {:
+                     scanner.t.stop();
+
+                     Out.checkErrors();
+                     
+                     Out.time(ErrorMessages.PARSING_TOOK, t);
+                     
+                     macros.expand();
+                     Enumeration unused = macros.unused();                     
+                     while ( unused.hasMoreElements() ) {
+                       Out.warning("Macro \""+unused.nextElement()+"\" has been declared but never used.");
+                     }
+
+                     SemCheck.check(regExps, macros, scanner.file);
+  
+                     regExps.checkActions();
+                     regExps.checkLookAheads();
+
+                     Out.checkErrors();
+
+                     if (Options.dump) charClasses.dump();
+
+                     Out.print("Constructing NFA : ");
+
+                     t.start();
+                     int num = regExps.getNum();
+                     
+                     RESULT = new NFA(charClasses.getNumClasses(), 
+                                      scanner, regExps, macros, charClasses);
+                     
+                     eofActions.setNumLexStates(scanner.states.number());
+
+                     for (int i = 0; i < num; i++) {
+                       if (regExps.isEOF(i))
+                         eofActions.add( regExps.getStates(i), regExps.getAction(i) );
+                       else
+                         RESULT.addRegExp(i);
+                     }
+                     
+                     if (scanner.standalone) RESULT.addStandaloneRule();
+                     t.stop();
+       
+                     Out.time("");              
+	                   Out.time(ErrorMessages.NFA_TOOK, t);
+                     
+                   :}
+                 | /* emtpy spec. error */
+                   {: 
+                     fatalError(ErrorMessages.NO_LEX_SPEC);
+                   :}
+                 ;  
+
+macros        ::=  /* empty, most switches & state declarations are parsed in lexer */
+                | macros macro
+                | error;
+
+macro         ::=  ASCII
+                   {: charClasses.setMaxCharCode(127); :}
+                |  FULL
+                   {: charClasses.setMaxCharCode(255); :}
+                |  UNICODE
+                   {: charClasses.setMaxCharCode(0xFFFF); :} 
+                |  IDENT:name EQUALS series:definition REGEXPEND
+                   {: macros.insert(name, definition); :} 
+                | IDENT EQUALS:e
+                   {: syntaxError(ErrorMessages.REGEXP_EXPECTED, eleft, eright); :}
+                ;
+                
+
+rules         ::=  rules:rlist rule:r
+                   {: rlist.addElement(r); RESULT = rlist; :}
+                |  rules:rlist1 LESSTHAN states:states MORETHAN LBRACE rules:rlist2 RBRACE
+                   {: 
+                     Enumeration rs = rlist2.elements();
+                     while ( rs.hasMoreElements() ) {
+                       Integer elem = (Integer) rs.nextElement();
+                       // might be null for error case of "rule"
+                       if (elem != null) { 
+                         regExps.addStates( elem.intValue(), states );
+                       }
+                       rlist1.addElement( elem );
+                     }                       
+                     RESULT = rlist1;
+                   :}
+                |  LESSTHAN states:states MORETHAN LBRACE rules:rlist RBRACE
+                   {: 
+                     Enumeration rs = rlist.elements();
+                     while ( rs.hasMoreElements() ) {
+                       Integer elem = (Integer) rs.nextElement();
+                       // might be null for error case of "rule"
+                       if (elem != null) { 
+                         regExps.addStates( elem.intValue(), states );
+                       }
+                     }                       
+                     RESULT = rlist;
+                   :}
+                |  rule:r
+                   {: RESULT = new Vector(); RESULT.addElement(r); :}
+                ;  
+
+rule          ::=  statesOPT:s hatOPT:bol series:r actions:a
+                   {: RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, null)); :}
+                |  statesOPT:s hatOPT:bol series:r lookahead:l act:a
+                   {: RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, l)); :}
+                |  statesOPT:s hatOPT:bol series:r lookahead:l NOACTION:a
+                   {: syntaxError(ErrorMessages.LOOKAHEAD_NEEDS_ACTION, aleft, aright+1); :}
+                |  statesOPT:s EOFRULE ACTION:a
+                   {: RESULT = new Integer(regExps.insert(s, a)); :}
+                |  error                
+                ;
+
+lookahead     ::=  DOLLAR
+                   {: RESULT = makeNL(); :}
+                |  LOOKAHEAD series:r
+                   {: RESULT = r; :}
+                |  LOOKAHEAD series:s DOLLAR
+                   {: RESULT = new RegExp2(sym.CONCAT, s, makeNL()); :}
+                ;
+
+act           ::=  REGEXPEND ACTION:a
+                   {: RESULT = a; :}
+				;
+
+actions       ::=  act:a
+                   {: RESULT = a; :}
+                |  NOACTION
+                ;
+
+                
+statesOPT     ::=  LESSTHAN states:list MORETHAN          
+                   {: RESULT = list; :}
+                |  /* empty */
+                   {: RESULT = new Vector(); :}                   
+                ;
+                
+states        ::=  IDENT:id COMMA states:list
+                   {:
+                     stateNumber = scanner.states.getNumber( id );
+                     if ( stateNumber != null )
+                       list.addElement( stateNumber ); 
+                     else {
+                       throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, 
+                                                  idleft, idright);
+                     }
+                     RESULT = list;
+                   :}                
+                |  IDENT:id
+                   {:
+                     Vector list = new Vector();
+                     stateNumber = scanner.states.getNumber( id );
+                     if ( stateNumber != null )
+                       list.addElement( stateNumber ); 
+                     else {
+                       throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, 
+                                                  idleft, idright);
+                     }
+                     RESULT = list;
+                   :}
+                 | IDENT COMMA:c
+                   {: syntaxError(ErrorMessages.REGEXP_EXPECTED, cleft, cright+1); :}
+                ;
+                
+hatOPT        ::=  HAT 
+                   {: // assumption: there is no upper case for \n
+                      charClasses.makeClass('\n', false); 
+                      RESULT = new Boolean(true); :}
+                |  /* empty */ 
+                   {: RESULT = new Boolean(false); :}
+                ;
+                
+series        ::= series:r1 BAR concs:r2
+                  {: RESULT = new RegExp2(sym.BAR, r1, r2); :}                 
+                | concs:r
+                  {: RESULT = r; :} 
+                | BAR:b
+                  {: syntaxError(ErrorMessages.REGEXP_EXPECTED, bleft, bright); :}
+                ;
+               
+concs         ::= concs:r1 nregexp:r2
+                  {: RESULT = new RegExp2(sym.CONCAT, r1, r2); :} 
+                | nregexp:r
+                  {: RESULT = r; :}
+                ;
+
+nregexp       ::= regexp:r
+                  {: RESULT = r; :}
+                | BANG nregexp:r
+                  {: RESULT = new RegExp1(sym.BANG, r); :}
+                | TILDE nregexp:r
+                  {: RESULT = new RegExp1(sym.TILDE, r); :}
+                ;
+
+regexp        ::=  regexp:r STAR
+                   {: RESULT = new RegExp1(sym.STAR, r); :}
+                |  regexp:r PLUS
+                   {: RESULT = new RegExp1(sym.PLUS, r); :}
+                |  regexp:r QUESTION
+                   {: RESULT = new RegExp1(sym.QUESTION, r); :}
+                |  regexp:r REPEAT:n RBRACE:b
+                   {: RESULT = makeRepeat(r, n.intValue(), n.intValue(), bleft, bright); :}
+                |  regexp:r REPEAT:n1 REPEAT:n2 RBRACE
+                   {: RESULT = makeRepeat(r, n1.intValue(), n2.intValue(), n1left, n2right); :}
+                |  OPENBRACKET series:r CLOSEBRACKET
+                   {: RESULT = r; :}
+                |  MACROUSE:ident
+                   {: 
+                      if ( !scanner.macroDefinition ) {
+                        if ( ! macros.markUsed(ident) ) 
+                          throw new ScannerException(scanner.file, ErrorMessages.MACRO_UNDECL, 
+                                                     identleft, identright);
+                      }
+                      RESULT = new RegExp1(sym.MACROUSE, ident); 
+                   :}
+                |  charclass:c
+                   {: RESULT = c; :}
+                |  preclass:list
+                   {:
+                     try {
+                       // assumption [correct?]: preclasses are already closed under case
+                       charClasses.makeClass(list, false);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, listleft);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS, list);
+                   :}
+                |  STRING:str
+                   {: 
+                     try {
+                       if ( scanner.caseless ) {
+                         charClasses.makeClass(str, true);
+                         RESULT = new RegExp1(sym.STRING_I, str);
+                       }
+                       else {
+                         charClasses.makeClass(str, false);
+                         RESULT = new RegExp1(sym.STRING, str); 
+                       }
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CS2SMALL_STRING, strleft, strright);
+                     }
+
+                   :}
+                |  POINT
+                   {: 
+                      Vector any = new Vector();
+                      any.addElement(new Interval('\n','\n'));
+                      // assumption: there is no upper case for \n
+                      charClasses.makeClass('\n', false);
+                      RESULT = new RegExp1(sym.CCLASSNOT, any); 
+                   :}
+                |  CHAR:c
+                   {: 
+                     try {
+                       if ( scanner.caseless ) {
+                         charClasses.makeClass(c.charValue(), true);
+                         RESULT = new RegExp1(sym.CHAR_I, c);
+                       }
+                       else {
+                         charClasses.makeClass(c.charValue(), false);
+                         RESULT = new RegExp1(sym.CHAR, c); 
+                       }
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CS2SMALL_CHAR, cleft, cright);
+                     }
+                   :}
+                ;
+
+charclass     ::=  OPENCLASS CLOSECLASS
+                   {: 
+                     RESULT = new RegExp1(sym.CCLASS,null);
+                   :}
+                |  OPENCLASS classcontent:list CLOSECLASS:close
+                   {: 
+                     try {
+                       charClasses.makeClass(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS,list);
+                   :}
+                |  OPENCLASS HAT CLOSECLASS:close
+                   {: 
+                     Vector list = new Vector();
+                     list.addElement(new Interval((char)0,CharClasses.maxChar));
+                     try {
+                       charClasses.makeClass(list, false);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS,list);
+                   :}
+                |  OPENCLASS HAT classcontent:list CLOSECLASS:close
+                   {: 
+                     try {
+                       charClasses.makeClassNot(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASSNOT,list);
+                   :}
+                | OPENCLASS DASH classcontent:list CLOSECLASS:close
+                   {: 
+                     try {
+                       list.addElement(new Interval('-','-'));
+                       charClasses.makeClass(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS,list);
+                   :}
+                |  OPENCLASS HAT DASH classcontent:list CLOSECLASS:close
+                   {: 
+                     try {
+                       list.addElement(new Interval('-','-'));
+                       charClasses.makeClassNot(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASSNOT,list);
+                   :}
+                ;
+
+classcontent  ::=  classcontent:list classcontentelem:elem
+                   {:
+                     list.addElement(elem);
+                     RESULT = list;
+                   :}
+                |  classcontentelem:elem
+                   {:
+                     Vector list = new Vector();
+                     list.addElement(elem);
+                     RESULT = list;
+                   :}
+                |  classcontent:list preclass:plist
+                   {:
+                     for (Enumeration e = plist.elements(); e.hasMoreElements();)
+                       list.addElement(e.nextElement());
+                     RESULT = list;
+                   :}
+                |  preclass:list 
+                   {: RESULT = list; :}
+                |  classcontent:list STRING:s
+                   {: 
+                      for (int i = 0; i < s.length(); i++)
+                        list.addElement(new Interval(s.charAt(i),s.charAt(i)));
+                      RESULT = list;
+                   :}
+                |  STRING:s
+                   {: 
+                      RESULT = new Vector();
+                      for (int i = 0; i < s.length(); i++)
+                        RESULT.addElement(new Interval(s.charAt(i),s.charAt(i)));
+                   :}
+                |  classcontent:list MACROUSE:ident
+                   {: 
+                     syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright);
+                   :}
+                |  MACROUSE:ident
+                   {: 
+                     syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright);
+                   :}
+                ;
+
+classcontentelem ::= CHAR:c1 DASH CHAR:c2
+                     {: RESULT = new Interval(c1.charValue(), c2.charValue()); :}
+                   | CHAR:c
+                     {: RESULT = new Interval(c.charValue(), c.charValue()); :}
+                   ;
+                   
+preclass ::= JLETTERCLASS
+             {: RESULT = makePreClass(sym.JLETTERCLASS); :}
+           | JLETTERDIGITCLASS 
+             {: RESULT = makePreClass(sym.JLETTERDIGITCLASS); :}
+           | LETTERCLASS
+             {: RESULT = makePreClass(sym.LETTERCLASS); :}
+           | DIGITCLASS
+             {: RESULT = makePreClass(sym.DIGITCLASS); :}
+           | UPPERCLASS
+             {: RESULT = makePreClass(sym.UPPERCLASS); :}
+           | LOWERCLASS
+             {: RESULT = makePreClass(sym.LOWERCLASS); :}
+           ;
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexParse.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexParse.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexParse.java	(revision 25584)
@@ -0,0 +1,1794 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.11a beta 20060608
+// Sat Jan 31 23:52:43 EST 2009
+//----------------------------------------------------
+
+package JFlex;
+
+import java.util.*;
+
+/** CUP v0.11a beta 20060608 generated parser.
+  * @version Sat Jan 31 23:52:43 EST 2009
+  */
+public class LexParse extends java_cup.runtime.lr_parser {
+
+  /** Default constructor. */
+  public LexParse() {super();}
+
+  /** Constructor which sets the default scanner. */
+  public LexParse(java_cup.runtime.Scanner s) {super(s);}
+
+  /** Constructor which sets the default scanner. */
+  public LexParse(java_cup.runtime.Scanner s, java_cup.runtime.SymbolFactory sf) {super(s,sf);}
+
+  /** Production table. */
+  protected static final short _production_table[][] = 
+    unpackFromStrings(new String[] {
+    "\000\113\000\002\002\004\000\002\005\006\000\002\005" +
+    "\002\000\002\002\002\000\002\002\004\000\002\002\003" +
+    "\000\002\003\003\000\002\003\003\000\002\003\003\000" +
+    "\002\003\006\000\002\003\004\000\002\021\004\000\002" +
+    "\021\011\000\002\021\010\000\002\021\003\000\002\004" +
+    "\006\000\002\004\007\000\002\004\007\000\002\004\005" +
+    "\000\002\004\003\000\002\013\003\000\002\013\004\000" +
+    "\002\013\005\000\002\023\004\000\002\024\003\000\002" +
+    "\024\003\000\002\016\005\000\002\016\002\000\002\015" +
+    "\005\000\002\015\003\000\002\015\004\000\002\022\003" +
+    "\000\002\022\002\000\002\006\005\000\002\006\003\000" +
+    "\002\006\003\000\002\007\004\000\002\007\003\000\002" +
+    "\010\003\000\002\010\004\000\002\010\004\000\002\011" +
+    "\004\000\002\011\004\000\002\011\004\000\002\011\005" +
+    "\000\002\011\006\000\002\011\005\000\002\011\003\000" +
+    "\002\011\003\000\002\011\003\000\002\011\003\000\002" +
+    "\011\003\000\002\011\003\000\002\012\004\000\002\012" +
+    "\005\000\002\012\005\000\002\012\006\000\002\012\006" +
+    "\000\002\012\007\000\002\017\004\000\002\017\003\000" +
+    "\002\017\004\000\002\017\003\000\002\017\004\000\002" +
+    "\017\003\000\002\017\004\000\002\017\003\000\002\014" +
+    "\005\000\002\014\003\000\002\020\003\000\002\020\003" +
+    "\000\002\020\003\000\002\020\003\000\002\020\003\000" +
+    "\002\020\003" });
+
+  /** Access to production table. */
+  public short[][] production_table() {return _production_table;}
+
+  /** Parse-action table. */
+  protected static final short[][] _action_table = 
+    unpackFromStrings(new String[] {
+    "\000\156\000\006\002\uffff\041\004\001\002\000\016\003" +
+    "\007\013\ufffe\022\ufffe\023\ufffe\024\ufffe\040\ufffe\001\002" +
+    "\000\004\002\006\001\002\000\004\002\001\001\002\000" +
+    "\014\013\ufffc\022\ufffc\023\ufffc\024\ufffc\040\ufffc\001\002" +
+    "\000\014\013\012\022\011\023\016\024\015\040\014\001" +
+    "\002\000\014\013\ufffb\022\ufffb\023\ufffb\024\ufffb\040\ufffb" +
+    "\001\002\000\050\003\114\004\uffe6\006\uffe6\010\uffe6\016" +
+    "\116\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" +
+    "\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053" +
+    "\uffe6\054\uffe6\001\002\000\014\013\ufffd\022\ufffd\023\ufffd" +
+    "\024\ufffd\040\ufffd\001\002\000\004\014\017\001\002\000" +
+    "\014\013\ufff9\022\ufff9\023\ufff9\024\ufff9\040\ufff9\001\002" +
+    "\000\014\013\ufffa\022\ufffa\023\ufffa\024\ufffa\040\ufffa\001" +
+    "\002\000\052\004\034\010\044\013\ufff7\022\ufff7\023\ufff7" +
+    "\024\ufff7\026\023\027\031\030\020\031\042\032\035\033" +
+    "\032\040\ufff7\045\041\047\022\050\037\051\024\052\021" +
+    "\053\030\054\025\001\002\000\064\004\uffba\005\uffba\007" +
+    "\uffba\010\uffba\011\uffba\025\uffba\026\uffba\027\uffba\030\uffba" +
+    "\031\uffba\032\uffba\033\uffba\035\uffba\036\uffba\042\uffba\043" +
+    "\uffba\044\uffba\045\uffba\046\uffba\047\uffba\050\uffba\051\uffba" +
+    "\052\uffba\053\uffba\054\uffba\001\002\000\062\004\uffcd\005" +
+    "\uffcd\007\uffcd\010\uffcd\025\uffcd\026\uffcd\027\uffcd\030\uffcd" +
+    "\031\uffcd\032\uffcd\033\uffcd\035\uffcd\036\uffcd\042\uffcd\043" +
+    "\uffcd\044\uffcd\045\uffcd\046\uffcd\047\uffcd\050\uffcd\051\uffcd" +
+    "\052\uffcd\053\uffcd\054\uffcd\001\002\000\062\004\uffce\005" +
+    "\uffce\007\uffce\010\uffce\025\uffce\026\uffce\027\uffce\030\uffce" +
+    "\031\uffce\032\uffce\033\uffce\035\uffce\036\uffce\042\uffce\043" +
+    "\uffce\044\uffce\045\uffce\046\uffce\047\uffce\050\uffce\051\uffce" +
+    "\052\uffce\053\uffce\054\uffce\001\002\000\064\004\uffbc\005" +
+    "\uffbc\007\uffbc\010\uffbc\011\uffbc\025\uffbc\026\uffbc\027\uffbc" +
+    "\030\uffbc\031\uffbc\032\uffbc\033\uffbc\035\uffbc\036\uffbc\042" +
+    "\uffbc\043\uffbc\044\uffbc\045\uffbc\046\uffbc\047\uffbc\050\uffbc" +
+    "\051\uffbc\052\uffbc\053\uffbc\054\uffbc\001\002\000\036\004" +
+    "\034\010\044\026\023\027\031\030\020\031\042\032\035" +
+    "\033\032\047\022\050\037\051\024\052\021\053\030\054" +
+    "\025\001\002\000\062\004\uffd2\005\uffd2\007\uffd2\010\uffd2" +
+    "\025\uffd2\026\uffd2\027\uffd2\030\uffd2\031\uffd2\032\uffd2\033" +
+    "\uffd2\035\uffd2\036\uffd2\042\uffd2\043\uffd2\044\uffd2\045\uffd2" +
+    "\046\uffd2\047\uffd2\050\uffd2\051\uffd2\052\uffd2\053\uffd2\054" +
+    "\uffd2\001\002\000\006\025\112\045\106\001\002\000\062" +
+    "\004\uffd0\005\uffd0\007\uffd0\010\uffd0\025\uffd0\026\uffd0\027" +
+    "\uffd0\030\uffd0\031\uffd0\032\uffd0\033\uffd0\035\uffd0\036\uffd0" +
+    "\042\uffd0\043\uffd0\044\uffd0\045\uffd0\046\uffd0\047\uffd0\050" +
+    "\uffd0\051\uffd0\052\uffd0\053\uffd0\054\uffd0\001\002\000\062" +
+    "\004\uffcf\005\uffcf\007\uffcf\010\uffcf\025\uffcf\026\uffcf\027" +
+    "\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf\035\uffcf\036\uffcf" +
+    "\042\uffcf\043\uffcf\044\uffcf\045\uffcf\046\uffcf\047\uffcf\050" +
+    "\uffcf\051\uffcf\052\uffcf\053\uffcf\054\uffcf\001\002\000\064" +
+    "\004\uffbb\005\uffbb\007\uffbb\010\uffbb\011\uffbb\025\uffbb\026" +
+    "\uffbb\027\uffbb\030\uffbb\031\uffbb\032\uffbb\033\uffbb\035\uffbb" +
+    "\036\uffbb\042\uffbb\043\uffbb\044\uffbb\045\uffbb\046\uffbb\047" +
+    "\uffbb\050\uffbb\051\uffbb\052\uffbb\053\uffbb\054\uffbb\001\002" +
+    "\000\064\004\uffb7\005\uffb7\007\uffb7\010\uffb7\011\uffb7\025" +
+    "\uffb7\026\uffb7\027\uffb7\030\uffb7\031\uffb7\032\uffb7\033\uffb7" +
+    "\035\uffb7\036\uffb7\042\uffb7\043\uffb7\044\uffb7\045\uffb7\046" +
+    "\uffb7\047\uffb7\050\uffb7\051\uffb7\052\uffb7\053\uffb7\054\uffb7" +
+    "\001\002\000\052\004\034\005\uffdf\007\uffdf\010\044\025" +
+    "\uffdf\026\023\027\031\030\020\031\042\032\035\033\032" +
+    "\035\uffdf\036\uffdf\045\uffdf\047\022\050\037\051\024\052" +
+    "\021\053\030\054\025\001\002\000\040\004\034\010\044" +
+    "\026\023\027\031\030\020\031\042\032\035\033\032\045" +
+    "\041\047\022\050\037\051\024\052\021\053\030\054\025" +
+    "\001\002\000\064\004\uffb8\005\uffb8\007\uffb8\010\uffb8\011" +
+    "\uffb8\025\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032\uffb8" +
+    "\033\uffb8\035\uffb8\036\uffb8\042\uffb8\043\uffb8\044\uffb8\045" +
+    "\uffb8\046\uffb8\047\uffb8\050\uffb8\051\uffb8\052\uffb8\053\uffb8" +
+    "\054\uffb8\001\002\000\062\004\uffd1\005\uffd1\007\uffd1\010" +
+    "\uffd1\025\uffd1\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1" +
+    "\033\uffd1\035\uffd1\036\uffd1\042\uffd1\043\uffd1\044\uffd1\045" +
+    "\uffd1\046\uffd1\047\uffd1\050\uffd1\051\uffd1\052\uffd1\053\uffd1" +
+    "\054\uffd1\001\002\000\036\004\034\010\044\026\023\027" +
+    "\031\030\020\031\042\032\035\033\032\047\022\050\037" +
+    "\051\024\052\021\053\030\054\025\001\002\000\052\004" +
+    "\uffdc\005\uffdc\007\uffdc\010\uffdc\025\uffdc\026\uffdc\027\uffdc" +
+    "\030\uffdc\031\uffdc\032\uffdc\033\uffdc\035\uffdc\036\uffdc\045" +
+    "\uffdc\047\uffdc\050\uffdc\051\uffdc\052\uffdc\053\uffdc\054\uffdc" +
+    "\001\002\000\016\005\uffde\007\uffde\025\uffde\035\uffde\036" +
+    "\uffde\045\uffde\001\002\000\064\004\uffb9\005\uffb9\007\uffb9" +
+    "\010\uffb9\011\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031" +
+    "\uffb9\032\uffb9\033\uffb9\035\uffb9\036\uffb9\042\uffb9\043\uffb9" +
+    "\044\uffb9\045\uffb9\046\uffb9\047\uffb9\050\uffb9\051\uffb9\052" +
+    "\uffb9\053\uffb9\054\uffb9\001\002\000\062\004\uffdb\005\uffdb" +
+    "\007\uffdb\010\uffdb\025\uffdb\026\uffdb\027\uffdb\030\uffdb\031" +
+    "\uffdb\032\uffdb\033\uffdb\035\uffdb\036\uffdb\042\077\043\075" +
+    "\044\076\045\uffdb\046\100\047\uffdb\050\uffdb\051\uffdb\052" +
+    "\uffdb\053\uffdb\054\uffdb\001\002\000\032\006\047\011\051" +
+    "\012\050\026\023\027\031\030\020\031\042\032\035\033" +
+    "\032\052\055\053\052\054\053\001\002\000\026\011\uffc3" +
+    "\026\uffc3\027\uffc3\030\uffc3\031\uffc3\032\uffc3\033\uffc3\052" +
+    "\uffc3\053\uffc3\054\uffc3\001\002\000\026\011\uffc5\026\uffc5" +
+    "\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033\uffc5\052\uffc5\053" +
+    "\uffc5\054\uffc5\001\002\000\030\011\070\012\067\026\023" +
+    "\027\031\030\020\031\042\032\035\033\032\052\055\053" +
+    "\052\054\053\001\002\000\024\026\023\027\031\030\020" +
+    "\031\042\032\035\033\032\052\055\053\052\054\053\001" +
+    "\002\000\062\004\uffcc\005\uffcc\007\uffcc\010\uffcc\025\uffcc" +
+    "\026\uffcc\027\uffcc\030\uffcc\031\uffcc\032\uffcc\033\uffcc\035" +
+    "\uffcc\036\uffcc\042\uffcc\043\uffcc\044\uffcc\045\uffcc\046\uffcc" +
+    "\047\uffcc\050\uffcc\051\uffcc\052\uffcc\053\uffcc\054\uffcc\001" +
+    "\002\000\026\011\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1" +
+    "\032\uffc1\033\uffc1\052\uffc1\053\uffc1\054\uffc1\001\002\000" +
+    "\026\011\uffbf\026\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf" +
+    "\033\uffbf\052\uffbf\053\uffbf\054\uffbf\001\002\000\026\011" +
+    "\062\026\023\027\031\030\020\031\042\032\035\033\032" +
+    "\052\055\053\063\054\064\001\002\000\030\011\uffbd\012" +
+    "\056\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd" +
+    "\052\uffbd\053\uffbd\054\uffbd\001\002\000\004\052\057\001" +
+    "\002\000\026\011\uffbe\026\uffbe\027\uffbe\030\uffbe\031\uffbe" +
+    "\032\uffbe\033\uffbe\052\uffbe\053\uffbe\054\uffbe\001\002\000" +
+    "\026\011\uffc4\026\uffc4\027\uffc4\030\uffc4\031\uffc4\032\uffc4" +
+    "\033\uffc4\052\uffc4\053\uffc4\054\uffc4\001\002\000\026\011" +
+    "\uffc6\026\uffc6\027\uffc6\030\uffc6\031\uffc6\032\uffc6\033\uffc6" +
+    "\052\uffc6\053\uffc6\054\uffc6\001\002\000\062\004\uffcb\005" +
+    "\uffcb\007\uffcb\010\uffcb\025\uffcb\026\uffcb\027\uffcb\030\uffcb" +
+    "\031\uffcb\032\uffcb\033\uffcb\035\uffcb\036\uffcb\042\uffcb\043" +
+    "\uffcb\044\uffcb\045\uffcb\046\uffcb\047\uffcb\050\uffcb\051\uffcb" +
+    "\052\uffcb\053\uffcb\054\uffcb\001\002\000\026\011\uffc2\026" +
+    "\uffc2\027\uffc2\030\uffc2\031\uffc2\032\uffc2\033\uffc2\052\uffc2" +
+    "\053\uffc2\054\uffc2\001\002\000\026\011\uffc0\026\uffc0\027" +
+    "\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\052\uffc0\053\uffc0" +
+    "\054\uffc0\001\002\000\026\011\066\026\023\027\031\030" +
+    "\020\031\042\032\035\033\032\052\055\053\063\054\064" +
+    "\001\002\000\062\004\uffc8\005\uffc8\007\uffc8\010\uffc8\025" +
+    "\uffc8\026\uffc8\027\uffc8\030\uffc8\031\uffc8\032\uffc8\033\uffc8" +
+    "\035\uffc8\036\uffc8\042\uffc8\043\uffc8\044\uffc8\045\uffc8\046" +
+    "\uffc8\047\uffc8\050\uffc8\051\uffc8\052\uffc8\053\uffc8\054\uffc8" +
+    "\001\002\000\024\026\023\027\031\030\020\031\042\032" +
+    "\035\033\032\052\055\053\052\054\053\001\002\000\062" +
+    "\004\uffca\005\uffca\007\uffca\010\uffca\025\uffca\026\uffca\027" +
+    "\uffca\030\uffca\031\uffca\032\uffca\033\uffca\035\uffca\036\uffca" +
+    "\042\uffca\043\uffca\044\uffca\045\uffca\046\uffca\047\uffca\050" +
+    "\uffca\051\uffca\052\uffca\053\uffca\054\uffca\001\002\000\026" +
+    "\011\072\026\023\027\031\030\020\031\042\032\035\033" +
+    "\032\052\055\053\063\054\064\001\002\000\062\004\uffc9" +
+    "\005\uffc9\007\uffc9\010\uffc9\025\uffc9\026\uffc9\027\uffc9\030" +
+    "\uffc9\031\uffc9\032\uffc9\033\uffc9\035\uffc9\036\uffc9\042\uffc9" +
+    "\043\uffc9\044\uffc9\045\uffc9\046\uffc9\047\uffc9\050\uffc9\051" +
+    "\uffc9\052\uffc9\053\uffc9\054\uffc9\001\002\000\026\011\074" +
+    "\026\023\027\031\030\020\031\042\032\035\033\032\052" +
+    "\055\053\063\054\064\001\002\000\062\004\uffc7\005\uffc7" +
+    "\007\uffc7\010\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031" +
+    "\uffc7\032\uffc7\033\uffc7\035\uffc7\036\uffc7\042\uffc7\043\uffc7" +
+    "\044\uffc7\045\uffc7\046\uffc7\047\uffc7\050\uffc7\051\uffc7\052" +
+    "\uffc7\053\uffc7\054\uffc7\001\002\000\062\004\uffd8\005\uffd8" +
+    "\007\uffd8\010\uffd8\025\uffd8\026\uffd8\027\uffd8\030\uffd8\031" +
+    "\uffd8\032\uffd8\033\uffd8\035\uffd8\036\uffd8\042\uffd8\043\uffd8" +
+    "\044\uffd8\045\uffd8\046\uffd8\047\uffd8\050\uffd8\051\uffd8\052" +
+    "\uffd8\053\uffd8\054\uffd8\001\002\000\062\004\uffd7\005\uffd7" +
+    "\007\uffd7\010\uffd7\025\uffd7\026\uffd7\027\uffd7\030\uffd7\031" +
+    "\uffd7\032\uffd7\033\uffd7\035\uffd7\036\uffd7\042\uffd7\043\uffd7" +
+    "\044\uffd7\045\uffd7\046\uffd7\047\uffd7\050\uffd7\051\uffd7\052" +
+    "\uffd7\053\uffd7\054\uffd7\001\002\000\006\021\101\042\102" +
+    "\001\002\000\062\004\uffd6\005\uffd6\007\uffd6\010\uffd6\025" +
+    "\uffd6\026\uffd6\027\uffd6\030\uffd6\031\uffd6\032\uffd6\033\uffd6" +
+    "\035\uffd6\036\uffd6\042\uffd6\043\uffd6\044\uffd6\045\uffd6\046" +
+    "\uffd6\047\uffd6\050\uffd6\051\uffd6\052\uffd6\053\uffd6\054\uffd6" +
+    "\001\002\000\062\004\uffd5\005\uffd5\007\uffd5\010\uffd5\025" +
+    "\uffd5\026\uffd5\027\uffd5\030\uffd5\031\uffd5\032\uffd5\033\uffd5" +
+    "\035\uffd5\036\uffd5\042\uffd5\043\uffd5\044\uffd5\045\uffd5\046" +
+    "\uffd5\047\uffd5\050\uffd5\051\uffd5\052\uffd5\053\uffd5\054\uffd5" +
+    "\001\002\000\004\021\103\001\002\000\062\004\uffd4\005" +
+    "\uffd4\007\uffd4\010\uffd4\025\uffd4\026\uffd4\027\uffd4\030\uffd4" +
+    "\031\uffd4\032\uffd4\033\uffd4\035\uffd4\036\uffd4\042\uffd4\043" +
+    "\uffd4\044\uffd4\045\uffd4\046\uffd4\047\uffd4\050\uffd4\051\uffd4" +
+    "\052\uffd4\053\uffd4\054\uffd4\001\002\000\052\004\uffda\005" +
+    "\uffda\007\uffda\010\uffda\025\uffda\026\uffda\027\uffda\030\uffda" +
+    "\031\uffda\032\uffda\033\uffda\035\uffda\036\uffda\045\uffda\047" +
+    "\uffda\050\uffda\051\uffda\052\uffda\053\uffda\054\uffda\001\002" +
+    "\000\006\005\107\045\106\001\002\000\036\004\034\010" +
+    "\044\026\023\027\031\030\020\031\042\032\035\033\032" +
+    "\047\022\050\037\051\024\052\021\053\030\054\025\001" +
+    "\002\000\062\004\uffd3\005\uffd3\007\uffd3\010\uffd3\025\uffd3" +
+    "\026\uffd3\027\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3\035" +
+    "\uffd3\036\uffd3\042\uffd3\043\uffd3\044\uffd3\045\uffd3\046\uffd3" +
+    "\047\uffd3\050\uffd3\051\uffd3\052\uffd3\053\uffd3\054\uffd3\001" +
+    "\002\000\052\004\034\005\uffe0\007\uffe0\010\044\025\uffe0" +
+    "\026\023\027\031\030\020\031\042\032\035\033\032\035" +
+    "\uffe0\036\uffe0\045\uffe0\047\022\050\037\051\024\052\021" +
+    "\053\030\054\025\001\002\000\052\004\uffdd\005\uffdd\007" +
+    "\uffdd\010\uffdd\025\uffdd\026\uffdd\027\uffdd\030\uffdd\031\uffdd" +
+    "\032\uffdd\033\uffdd\035\uffdd\036\uffdd\045\uffdd\047\uffdd\050" +
+    "\uffdd\051\uffdd\052\uffdd\053\uffdd\054\uffdd\001\002\000\014" +
+    "\013\ufff8\022\ufff8\023\ufff8\024\ufff8\040\ufff8\001\002\000" +
+    "\052\004\uffd9\005\uffd9\007\uffd9\010\uffd9\025\uffd9\026\uffd9" +
+    "\027\uffd9\030\uffd9\031\uffd9\032\uffd9\033\uffd9\035\uffd9\036" +
+    "\uffd9\045\uffd9\047\uffd9\050\uffd9\051\uffd9\052\uffd9\053\uffd9" +
+    "\054\uffd9\001\002\000\054\002\uffee\003\uffee\004\uffee\006" +
+    "\uffee\010\uffee\016\uffee\021\uffee\026\uffee\027\uffee\030\uffee" +
+    "\031\uffee\032\uffee\033\uffee\034\uffee\045\uffee\047\uffee\050" +
+    "\uffee\051\uffee\052\uffee\053\uffee\054\uffee\001\002\000\044" +
+    "\004\uffe1\006\142\010\uffe1\026\uffe1\027\uffe1\030\uffe1\031" +
+    "\uffe1\032\uffe1\033\uffe1\034\140\045\uffe1\047\uffe1\050\uffe1" +
+    "\051\uffe1\052\uffe1\053\uffe1\054\uffe1\001\002\000\004\040" +
+    "\124\001\002\000\054\002\ufff3\003\ufff3\004\ufff3\006\ufff3" +
+    "\010\ufff3\016\ufff3\021\ufff3\026\ufff3\027\ufff3\030\ufff3\031" +
+    "\ufff3\032\ufff3\033\ufff3\034\ufff3\045\ufff3\047\ufff3\050\ufff3" +
+    "\051\ufff3\052\ufff3\053\ufff3\054\ufff3\001\002\000\052\002" +
+    "\000\003\114\004\uffe6\006\uffe6\010\uffe6\016\121\026\uffe6" +
+    "\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\045" +
+    "\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6" +
+    "\001\002\000\004\040\124\001\002\000\054\002\ufff6\003" +
+    "\ufff6\004\ufff6\006\ufff6\010\ufff6\016\ufff6\021\ufff6\026\ufff6" +
+    "\027\ufff6\030\ufff6\031\ufff6\032\ufff6\033\ufff6\034\ufff6\045" +
+    "\ufff6\047\ufff6\050\ufff6\051\ufff6\052\ufff6\053\ufff6\054\ufff6" +
+    "\001\002\000\004\017\127\001\002\000\006\015\125\017" +
+    "\uffe4\001\002\000\006\017\uffe3\040\124\001\002\000\004" +
+    "\017\uffe5\001\002\000\046\004\uffe7\006\uffe7\010\uffe7\020" +
+    "\130\026\uffe7\027\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7" +
+    "\034\uffe7\045\uffe7\047\uffe7\050\uffe7\051\uffe7\052\uffe7\053" +
+    "\uffe7\054\uffe7\001\002\000\050\003\114\004\uffe6\006\uffe6" +
+    "\010\uffe6\016\116\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032" +
+    "\uffe6\033\uffe6\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6" +
+    "\052\uffe6\053\uffe6\054\uffe6\001\002\000\052\003\114\004" +
+    "\uffe6\006\uffe6\010\uffe6\016\121\021\132\026\uffe6\027\uffe6" +
+    "\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\045\uffe6\047" +
+    "\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6\001\002" +
+    "\000\054\002\ufff5\003\ufff5\004\ufff5\006\ufff5\010\ufff5\016" +
+    "\ufff5\021\ufff5\026\ufff5\027\ufff5\030\ufff5\031\ufff5\032\ufff5" +
+    "\033\ufff5\034\ufff5\045\ufff5\047\ufff5\050\ufff5\051\ufff5\052" +
+    "\ufff5\053\ufff5\054\ufff5\001\002\000\004\017\134\001\002" +
+    "\000\046\004\uffe7\006\uffe7\010\uffe7\020\135\026\uffe7\027" +
+    "\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7\034\uffe7\045\uffe7" +
+    "\047\uffe7\050\uffe7\051\uffe7\052\uffe7\053\uffe7\054\uffe7\001" +
+    "\002\000\050\003\114\004\uffe6\006\uffe6\010\uffe6\016\116" +
+    "\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034" +
+    "\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6" +
+    "\054\uffe6\001\002\000\052\003\114\004\uffe6\006\uffe6\010" +
+    "\uffe6\016\121\021\137\026\uffe6\027\uffe6\030\uffe6\031\uffe6" +
+    "\032\uffe6\033\uffe6\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051" +
+    "\uffe6\052\uffe6\053\uffe6\054\uffe6\001\002\000\054\002\ufff4" +
+    "\003\ufff4\004\ufff4\006\ufff4\010\ufff4\016\ufff4\021\ufff4\026" +
+    "\ufff4\027\ufff4\030\ufff4\031\ufff4\032\ufff4\033\ufff4\034\ufff4" +
+    "\045\ufff4\047\ufff4\050\ufff4\051\ufff4\052\ufff4\053\ufff4\054" +
+    "\ufff4\001\002\000\004\037\160\001\002\000\040\004\034" +
+    "\010\044\026\023\027\031\030\020\031\042\032\035\033" +
+    "\032\045\041\047\022\050\037\051\024\052\021\053\030" +
+    "\054\025\001\002\000\040\004\uffe2\010\uffe2\026\uffe2\027" +
+    "\uffe2\030\uffe2\031\uffe2\032\uffe2\033\uffe2\045\uffe2\047\uffe2" +
+    "\050\uffe2\051\uffe2\052\uffe2\053\uffe2\054\uffe2\001\002\000" +
+    "\014\007\152\025\147\035\144\036\146\045\106\001\002" +
+    "\000\054\002\uffe8\003\uffe8\004\uffe8\006\uffe8\010\uffe8\016" +
+    "\uffe8\021\uffe8\026\uffe8\027\uffe8\030\uffe8\031\uffe8\032\uffe8" +
+    "\033\uffe8\034\uffe8\045\uffe8\047\uffe8\050\uffe8\051\uffe8\052" +
+    "\uffe8\053\uffe8\054\uffe8\001\002\000\054\002\uffe9\003\uffe9" +
+    "\004\uffe9\006\uffe9\010\uffe9\016\uffe9\021\uffe9\026\uffe9\027" +
+    "\uffe9\030\uffe9\031\uffe9\032\uffe9\033\uffe9\034\uffe9\045\uffe9" +
+    "\047\uffe9\050\uffe9\051\uffe9\052\uffe9\053\uffe9\054\uffe9\001" +
+    "\002\000\040\004\034\010\044\026\023\027\031\030\020" +
+    "\031\042\032\035\033\032\045\041\047\022\050\037\051" +
+    "\024\052\021\053\030\054\025\001\002\000\004\037\155" +
+    "\001\002\000\006\025\147\035\153\001\002\000\054\002" +
+    "\ufff2\003\ufff2\004\ufff2\006\ufff2\010\ufff2\016\ufff2\021\ufff2" +
+    "\026\ufff2\027\ufff2\030\ufff2\031\ufff2\032\ufff2\033\ufff2\034" +
+    "\ufff2\045\ufff2\047\ufff2\050\ufff2\051\ufff2\052\ufff2\053\ufff2" +
+    "\054\ufff2\001\002\000\006\025\uffed\035\uffed\001\002\000" +
+    "\054\002\ufff0\003\ufff0\004\ufff0\006\ufff0\010\ufff0\016\ufff0" +
+    "\021\ufff0\026\ufff0\027\ufff0\030\ufff0\031\ufff0\032\ufff0\033" +
+    "\ufff0\034\ufff0\045\ufff0\047\ufff0\050\ufff0\051\ufff0\052\ufff0" +
+    "\053\ufff0\054\ufff0\001\002\000\054\002\ufff1\003\ufff1\004" +
+    "\ufff1\006\ufff1\010\ufff1\016\ufff1\021\ufff1\026\ufff1\027\ufff1" +
+    "\030\ufff1\031\ufff1\032\ufff1\033\ufff1\034\ufff1\045\ufff1\047" +
+    "\ufff1\050\ufff1\051\ufff1\052\ufff1\053\ufff1\054\ufff1\001\002" +
+    "\000\054\002\uffea\003\uffea\004\uffea\006\uffea\010\uffea\016" +
+    "\uffea\021\uffea\026\uffea\027\uffea\030\uffea\031\uffea\032\uffea" +
+    "\033\uffea\034\uffea\045\uffea\047\uffea\050\uffea\051\uffea\052" +
+    "\uffea\053\uffea\054\uffea\001\002\000\012\007\157\025\uffec" +
+    "\035\uffec\045\106\001\002\000\006\025\uffeb\035\uffeb\001" +
+    "\002\000\054\002\uffef\003\uffef\004\uffef\006\uffef\010\uffef" +
+    "\016\uffef\021\uffef\026\uffef\027\uffef\030\uffef\031\uffef\032" +
+    "\uffef\033\uffef\034\uffef\045\uffef\047\uffef\050\uffef\051\uffef" +
+    "\052\uffef\053\uffef\054\uffef\001\002" });
+
+  /** Access to parse-action table. */
+  public short[][] action_table() {return _action_table;}
+
+  /** <code>reduce_goto</code> table. */
+  protected static final short[][] _reduce_table = 
+    unpackFromStrings(new String[] {
+    "\000\156\000\004\005\004\001\001\000\004\002\007\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\004\003\012\001\001\000\002\001\001\000\010\004" +
+    "\116\016\114\021\117\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\016\006" +
+    "\025\007\032\010\037\011\042\012\035\020\026\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\012\010\112\011\042\012\035\020\026" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\012\010\110\011\042\012\035\020\026\001\001\000" +
+    "\016\006\104\007\032\010\037\011\042\012\035\020\026" +
+    "\001\001\000\002\001\001\000\002\001\001\000\012\010" +
+    "\103\011\042\012\035\020\026\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\010\014\045\017\053\020\044\001\001\000\002\001\001" +
+    "\000\002\001\001\000\010\014\045\017\070\020\044\001" +
+    "\001\000\010\014\045\017\064\020\044\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\006\014" +
+    "\060\020\057\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\006" +
+    "\014\060\020\057\001\001\000\002\001\001\000\010\014" +
+    "\045\017\072\020\044\001\001\000\002\001\001\000\006" +
+    "\014\060\020\057\001\001\000\002\001\001\000\006\014" +
+    "\060\020\057\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\014\007\107\010\037\011" +
+    "\042\012\035\020\026\001\001\000\002\001\001\000\012" +
+    "\010\110\011\042\012\035\020\026\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\004\022\140\001\001\000\004\015\132\001\001\000" +
+    "\002\001\001\000\006\004\121\016\114\001\001\000\004" +
+    "\015\122\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\004\015\125\001\001\000\002\001\001" +
+    "\000\002\001\001\000\010\004\116\016\114\021\130\001" +
+    "\001\000\006\004\121\016\114\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\010\004\116\016" +
+    "\114\021\135\001\001\000\006\004\121\016\114\001\001" +
+    "\000\002\001\001\000\002\001\001\000\016\006\142\007" +
+    "\032\010\037\011\042\012\035\020\026\001\001\000\002" +
+    "\001\001\000\010\013\147\023\144\024\150\001\001\000" +
+    "\002\001\001\000\002\001\001\000\016\006\155\007\032" +
+    "\010\037\011\042\012\035\020\026\001\001\000\002\001" +
+    "\001\000\004\023\153\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "" });
+
+  /** Access to <code>reduce_goto</code> table. */
+  public short[][] reduce_table() {return _reduce_table;}
+
+  /** Instance of action encapsulation class. */
+  protected CUP$LexParse$actions action_obj;
+
+  /** Action encapsulation object initializer. */
+  protected void init_actions()
+    {
+      action_obj = new CUP$LexParse$actions(this);
+    }
+
+  /** Invoke a user supplied parse action. */
+  public java_cup.runtime.Symbol do_action(
+    int                        act_num,
+    java_cup.runtime.lr_parser parser,
+    java.util.Stack            stack,
+    int                        top)
+    throws java.lang.Exception
+  {
+    /* call code in generated class */
+    return action_obj.CUP$LexParse$do_action(act_num, parser, stack, top);
+  }
+
+  /** Indicates start state. */
+  public int start_state() {return 0;}
+  /** Indicates start production. */
+  public int start_production() {return 0;}
+
+  /** <code>EOF</code> Symbol index. */
+  public int EOF_sym() {return 0;}
+
+  /** <code>error</code> Symbol index. */
+  public int error_sym() {return 1;}
+
+
+  /** User initialization code. */
+  public void user_init() throws java.lang.Exception
+    {
+
+  action_obj.scanner = this.scanner;
+
+    }
+
+
+   public LexScan scanner;
+
+   public LexParse(LexScan scanner) {
+     super(scanner);
+     this.scanner = scanner;
+   }
+   
+   public CharClasses getCharClasses() {
+     return action_obj.charClasses;
+   }
+
+   public EOFActions getEOFActions() {
+     return action_obj.eofActions;
+   }
+       
+   public void report_error(String message, Object info) {     
+     if ( info instanceof java_cup.runtime.Symbol ) {
+       java_cup.runtime.Symbol s = (java_cup.runtime.Symbol) info;
+  
+       if (s.sym == sym.EOF) 
+         Out.error(ErrorMessages.UNEXPECTED_EOF);
+       else
+         Out.error(scanner.file, ErrorMessages.SYNTAX_ERROR, s.left, s.right);
+     }
+     else 
+       Out.error(ErrorMessages.UNKNOWN_SYNTAX);
+   }
+   
+   public void report_fatal_error(String message, Object info) {
+     // report_error(message, info);
+     throw new GeneratorException();
+   }
+
+
+}
+
+/** Cup generated class to encapsulate user supplied action code.*/
+class CUP$LexParse$actions {
+
+
+
+  LexScan     scanner;
+  CharClasses charClasses = new CharClasses(Options.jlex ? 127 : 0xFFFF);
+  RegExps     regExps     = new RegExps();
+  Macros      macros      = new Macros();
+  Integer     stateNumber;
+  Timer       t           = new Timer();
+  EOFActions  eofActions  = new EOFActions();
+
+  void fatalError(ErrorMessages message, int line, int col) {
+    syntaxError(message, line, col);
+    throw new GeneratorException();
+  }
+
+  void fatalError(ErrorMessages message) {
+    fatalError(message, scanner.currentLine(), -1);
+    throw new GeneratorException();
+  }
+
+  void syntaxError(ErrorMessages message) {
+    Out.error(scanner.file, message, scanner.currentLine(), -1);
+  }
+  
+  void syntaxError(ErrorMessages message, int line) {
+    Out.error(scanner.file, message, line, -1);
+  }
+
+  void syntaxError(ErrorMessages message, int line, int col) {
+    Out.error(scanner.file, message, line, col);
+  }
+
+
+  private boolean check(int type, char c) {
+    switch (type) {
+      case sym.JLETTERCLASS:
+        return Character.isJavaIdentifierStart(c);
+        
+      case sym.JLETTERDIGITCLASS:
+        return Character.isJavaIdentifierPart(c);
+        
+      case sym.LETTERCLASS:
+        return Character.isLetter(c);
+        
+      case sym.DIGITCLASS:
+        return Character.isDigit(c);
+        
+      case sym.UPPERCLASS: 
+        return Character.isUpperCase(c);
+        
+      case sym.LOWERCLASS: 
+        return Character.isLowerCase(c);
+        
+      default: return false;
+    }
+  }
+  
+  private Vector makePreClass(int type) {
+    
+    Vector result = new Vector();
+    
+    char c = 0;
+    char start = 0;
+    char last = charClasses.getMaxCharCode();
+    
+    boolean prev, current;
+    
+    prev = check(type,'\u0000');
+    
+    for (c = 1; c < last; c++) {
+      
+      current = check(type,c);
+      
+      if (!prev && current) start = c;
+      if (prev && !current) {
+        result.addElement(new Interval(start, (char)(c-1)));
+      }
+      
+      prev = current;
+    }
+    
+    // the last iteration is moved out of the loop to
+    // avoid an endless loop if last == maxCharCode and
+    // last+1 == 0
+    current = check(type,c);
+    
+    if (!prev && current) result.addElement(new Interval(c,c));
+    if (prev && current)  result.addElement(new Interval(start, c));    
+    if (prev && !current) result.addElement(new Interval(start, (char)(c-1)));
+
+    return result;
+  }
+  
+  private RegExp makeRepeat(RegExp r, int n1, int n2, int line, int col) {
+
+    if (n1 <= 0 && n2 <= 0) {
+      syntaxError(ErrorMessages.REPEAT_ZERO, line, col);
+      return null;
+    }
+
+    if (n1 > n2) {
+      syntaxError(ErrorMessages.REPEAT_GREATER, line, col);
+      return null;
+    }
+    
+    int i;
+    RegExp result;    
+
+    if (n1 > 0) {
+      result = r;
+      n1--; n2--; // we need one concatenation less than the number of expressions to match
+    }
+    else {
+      result = new RegExp1(sym.QUESTION,r);
+      n2--;
+    }
+
+    for (i = 0; i < n1; i++) 
+      result = new RegExp2(sym.CONCAT, result, r);
+      
+    n2-= n1;  
+    for (i = 0; i < n2; i++)
+      result = new RegExp2(sym.CONCAT, result, new RegExp1(sym.QUESTION,r));
+    
+    return result;
+  }
+
+  private RegExp makeNL() {
+    Vector list = new Vector();
+    list.addElement(new Interval('\n','\r'));
+    list.addElement(new Interval('\u0085','\u0085'));
+    list.addElement(new Interval('\u2028','\u2029'));
+
+	// assumption: line feeds are caseless
+    charClasses.makeClass(list, false);
+    charClasses.makeClass('\n', false);
+    charClasses.makeClass('\r', false);
+
+    RegExp1   c = new RegExp1(sym.CCLASS, list);
+    Character n = new Character('\n');
+    Character r = new Character('\r');
+
+    return new RegExp2(sym.BAR, 
+                       c, 
+                       new RegExp2(sym.CONCAT, 
+                                   new RegExp1(sym.CHAR, r), 
+                                   new RegExp1(sym.CHAR, n)));
+  }
+  
+
+  private final LexParse parser;
+
+  /** Constructor */
+  CUP$LexParse$actions(LexParse parser) {
+    this.parser = parser;
+  }
+
+  /** Method with the actual generated action code. */
+  public final java_cup.runtime.Symbol CUP$LexParse$do_action(
+    int                        CUP$LexParse$act_num,
+    java_cup.runtime.lr_parser CUP$LexParse$parser,
+    java.util.Stack            CUP$LexParse$stack,
+    int                        CUP$LexParse$top)
+    throws java.lang.Exception
+    {
+      /* Symbol object for return from actions */
+      java_cup.runtime.Symbol CUP$LexParse$result;
+
+      /* select the action based on the action number */
+      switch (CUP$LexParse$act_num)
+        {
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 74: // preclass ::= LOWERCLASS 
+            {
+              Vector RESULT =null;
+		 RESULT = makePreClass(sym.LOWERCLASS); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 73: // preclass ::= UPPERCLASS 
+            {
+              Vector RESULT =null;
+		 RESULT = makePreClass(sym.UPPERCLASS); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 72: // preclass ::= DIGITCLASS 
+            {
+              Vector RESULT =null;
+		 RESULT = makePreClass(sym.DIGITCLASS); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 71: // preclass ::= LETTERCLASS 
+            {
+              Vector RESULT =null;
+		 RESULT = makePreClass(sym.LETTERCLASS); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 70: // preclass ::= JLETTERDIGITCLASS 
+            {
+              Vector RESULT =null;
+		 RESULT = makePreClass(sym.JLETTERDIGITCLASS); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 69: // preclass ::= JLETTERCLASS 
+            {
+              Vector RESULT =null;
+		 RESULT = makePreClass(sym.JLETTERCLASS); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 68: // classcontentelem ::= CHAR 
+            {
+              Interval RESULT =null;
+		int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new Interval(c.charValue(), c.charValue()); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 67: // classcontentelem ::= CHAR DASH CHAR 
+            {
+              Interval RESULT =null;
+		int c1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int c1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		Character c1 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int c2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int c2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Character c2 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new Interval(c1.charValue(), c2.charValue()); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 66: // classcontent ::= MACROUSE 
+            {
+              Vector RESULT =null;
+		int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 65: // classcontent ::= classcontent MACROUSE 
+            {
+              Vector RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 64: // classcontent ::= STRING 
+            {
+              Vector RESULT =null;
+		int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                      RESULT = new Vector();
+                      for (int i = 0; i < s.length(); i++)
+                        RESULT.addElement(new Interval(s.charAt(i),s.charAt(i)));
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 63: // classcontent ::= classcontent STRING 
+            {
+              Vector RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                      for (int i = 0; i < s.length(); i++)
+                        list.addElement(new Interval(s.charAt(i),s.charAt(i)));
+                      RESULT = list;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 62: // classcontent ::= preclass 
+            {
+              Vector RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = list; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 61: // classcontent ::= classcontent preclass 
+            {
+              Vector RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int plistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int plistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Vector plist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		
+                     for (Enumeration e = plist.elements(); e.hasMoreElements();)
+                       list.addElement(e.nextElement());
+                     RESULT = list;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 60: // classcontent ::= classcontentelem 
+            {
+              Vector RESULT =null;
+		int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		
+                     Vector list = new Vector();
+                     list.addElement(elem);
+                     RESULT = list;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 59: // classcontent ::= classcontent classcontentelem 
+            {
+              Vector RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		
+                     list.addElement(elem);
+                     RESULT = list;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 58: // charclass ::= OPENCLASS HAT DASH classcontent CLOSECLASS 
+            {
+              RegExp RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     try {
+                       list.addElement(new Interval('-','-'));
+                       charClasses.makeClassNot(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASSNOT,list);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 57: // charclass ::= OPENCLASS DASH classcontent CLOSECLASS 
+            {
+              RegExp RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     try {
+                       list.addElement(new Interval('-','-'));
+                       charClasses.makeClass(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS,list);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 56: // charclass ::= OPENCLASS HAT classcontent CLOSECLASS 
+            {
+              RegExp RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     try {
+                       charClasses.makeClassNot(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASSNOT,list);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 55: // charclass ::= OPENCLASS HAT CLOSECLASS 
+            {
+              RegExp RESULT =null;
+		int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     Vector list = new Vector();
+                     list.addElement(new Interval((char)0,CharClasses.maxChar));
+                     try {
+                       charClasses.makeClass(list, false);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS,list);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 54: // charclass ::= OPENCLASS classcontent CLOSECLASS 
+            {
+              RegExp RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     try {
+                       charClasses.makeClass(list, Options.jlex && scanner.caseless);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS,list);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 53: // charclass ::= OPENCLASS CLOSECLASS 
+            {
+              RegExp RESULT =null;
+		 
+                     RESULT = new RegExp1(sym.CCLASS,null);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 52: // regexp ::= CHAR 
+            {
+              RegExp RESULT =null;
+		int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     try {
+                       if ( scanner.caseless ) {
+                         charClasses.makeClass(c.charValue(), true);
+                         RESULT = new RegExp1(sym.CHAR_I, c);
+                       }
+                       else {
+                         charClasses.makeClass(c.charValue(), false);
+                         RESULT = new RegExp1(sym.CHAR, c); 
+                       }
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CS2SMALL_CHAR, cleft, cright);
+                     }
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 51: // regexp ::= POINT 
+            {
+              RegExp RESULT =null;
+		 
+                      Vector any = new Vector();
+                      any.addElement(new Interval('\n','\n'));
+                      // assumption: there is no upper case for \n
+                      charClasses.makeClass('\n', false);
+                      RESULT = new RegExp1(sym.CCLASSNOT, any); 
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 50: // regexp ::= STRING 
+            {
+              RegExp RESULT =null;
+		int strleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int strright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		String str = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                     try {
+                       if ( scanner.caseless ) {
+                         charClasses.makeClass(str, true);
+                         RESULT = new RegExp1(sym.STRING_I, str);
+                       }
+                       else {
+                         charClasses.makeClass(str, false);
+                         RESULT = new RegExp1(sym.STRING, str); 
+                       }
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CS2SMALL_STRING, strleft, strright);
+                     }
+
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 49: // regexp ::= preclass 
+            {
+              RegExp RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		
+                     try {
+                       // assumption [correct?]: preclasses are already closed under case
+                       charClasses.makeClass(list, false);
+                     }
+                     catch (CharClassException e) {
+                       syntaxError(ErrorMessages.CHARSET_2_SMALL, listleft);
+                     }
+                     RESULT = new RegExp1(sym.CCLASS, list);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 48: // regexp ::= charclass 
+            {
+              RegExp RESULT =null;
+		int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp c = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = c; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 47: // regexp ::= MACROUSE 
+            {
+              RegExp RESULT =null;
+		int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 
+                      if ( !scanner.macroDefinition ) {
+                        if ( ! macros.markUsed(ident) ) 
+                          throw new ScannerException(scanner.file, ErrorMessages.MACRO_UNDECL, 
+                                                     identleft, identright);
+                      }
+                      RESULT = new RegExp1(sym.MACROUSE, ident); 
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 46: // regexp ::= OPENBRACKET series CLOSEBRACKET 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 RESULT = r; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 45: // regexp ::= regexp REPEAT REPEAT RBRACE 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value;
+		int n1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int n1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		Integer n1 = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int n2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int n2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Integer n2 = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 RESULT = makeRepeat(r, n1.intValue(), n2.intValue(), n1left, n2right); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 44: // regexp ::= regexp REPEAT RBRACE 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int nleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int nright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Integer n = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = makeRepeat(r, n.intValue(), n.intValue(), bleft, bright); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 43: // regexp ::= regexp QUESTION 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 RESULT = new RegExp1(sym.QUESTION, r); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 42: // regexp ::= regexp PLUS 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 RESULT = new RegExp1(sym.PLUS, r); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 41: // regexp ::= regexp STAR 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 RESULT = new RegExp1(sym.STAR, r); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 40: // nregexp ::= TILDE nregexp 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new RegExp1(sym.TILDE, r); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 39: // nregexp ::= BANG nregexp 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new RegExp1(sym.BANG, r); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 38: // nregexp ::= regexp 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = r; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 37: // concs ::= nregexp 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = r; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 36: // concs ::= concs nregexp 
+            {
+              RegExp RESULT =null;
+		int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new RegExp2(sym.CONCAT, r1, r2); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 35: // series ::= BAR 
+            {
+              RegExp RESULT =null;
+		int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 syntaxError(ErrorMessages.REGEXP_EXPECTED, bleft, bright); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 34: // series ::= concs 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = r; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 33: // series ::= series BAR concs 
+            {
+              RegExp RESULT =null;
+		int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new RegExp2(sym.BAR, r1, r2); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 32: // hatOPT ::= 
+            {
+              Boolean RESULT =null;
+		 RESULT = new Boolean(false); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 31: // hatOPT ::= HAT 
+            {
+              Boolean RESULT =null;
+		 // assumption: there is no upper case for \n
+                      charClasses.makeClass('\n', false); 
+                      RESULT = new Boolean(true); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 30: // states ::= IDENT COMMA 
+            {
+              Vector RESULT =null;
+		int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object c = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 syntaxError(ErrorMessages.REGEXP_EXPECTED, cleft, cright+1); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 29: // states ::= IDENT 
+            {
+              Vector RESULT =null;
+		int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		
+                     Vector list = new Vector();
+                     stateNumber = scanner.states.getNumber( id );
+                     if ( stateNumber != null )
+                       list.addElement( stateNumber ); 
+                     else {
+                       throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, 
+                                                  idleft, idright);
+                     }
+                     RESULT = list;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 28: // states ::= IDENT COMMA states 
+            {
+              Vector RESULT =null;
+		int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		
+                     stateNumber = scanner.states.getNumber( id );
+                     if ( stateNumber != null )
+                       list.addElement( stateNumber ); 
+                     else {
+                       throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, 
+                                                  idleft, idright);
+                     }
+                     RESULT = list;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 27: // statesOPT ::= 
+            {
+              Vector RESULT =null;
+		 RESULT = new Vector(); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 26: // statesOPT ::= LESSTHAN states MORETHAN 
+            {
+              Vector RESULT =null;
+		int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 RESULT = list; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 25: // actions ::= NOACTION 
+            {
+              Action RESULT =null;
+
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 24: // actions ::= act 
+            {
+              Action RESULT =null;
+		int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = a; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 23: // act ::= REGEXPEND ACTION 
+            {
+              Action RESULT =null;
+		int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = a; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("act",17, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 22: // lookahead ::= LOOKAHEAD series DOLLAR 
+            {
+              RegExp RESULT =null;
+		int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp s = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 RESULT = new RegExp2(sym.CONCAT, s, makeNL()); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 21: // lookahead ::= LOOKAHEAD series 
+            {
+              RegExp RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = r; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 20: // lookahead ::= DOLLAR 
+            {
+              RegExp RESULT =null;
+		 RESULT = makeNL(); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 19: // rule ::= error 
+            {
+              Integer RESULT =null;
+
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 18: // rule ::= statesOPT EOFRULE ACTION 
+            {
+              Integer RESULT =null;
+		int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new Integer(regExps.insert(s, a)); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 17: // rule ::= statesOPT hatOPT series lookahead NOACTION 
+            {
+              Integer RESULT =null;
+		int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left;
+		int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right;
+		Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value;
+		int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left;
+		int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right;
+		Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object a = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 syntaxError(ErrorMessages.LOOKAHEAD_NEEDS_ACTION, aleft, aright+1); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 16: // rule ::= statesOPT hatOPT series lookahead act 
+            {
+              Integer RESULT =null;
+		int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left;
+		int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right;
+		Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value;
+		int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left;
+		int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right;
+		Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, l)); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 15: // rule ::= statesOPT hatOPT series actions 
+            {
+              Integer RESULT =null;
+		int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left;
+		int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right;
+		Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value;
+		int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left;
+		int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right;
+		Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, null)); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 14: // rules ::= rule 
+            {
+              Vector RESULT =null;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 RESULT = new Vector(); RESULT.addElement(r); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 13: // rules ::= LESSTHAN states MORETHAN LBRACE rules RBRACE 
+            {
+              Vector RESULT =null;
+		int statesleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left;
+		int statesright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right;
+		Vector states = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value;
+		int rlistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rlistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector rlist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 
+                     Enumeration rs = rlist.elements();
+                     while ( rs.hasMoreElements() ) {
+                       Integer elem = (Integer) rs.nextElement();
+                       // might be null for error case of "rule"
+                       if (elem != null) { 
+                         regExps.addStates( elem.intValue(), states );
+                       }
+                     }                       
+                     RESULT = rlist;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-5)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 12: // rules ::= rules LESSTHAN states MORETHAN LBRACE rules RBRACE 
+            {
+              Vector RESULT =null;
+		int rlist1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).left;
+		int rlist1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).right;
+		Vector rlist1 = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).value;
+		int statesleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left;
+		int statesright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right;
+		Vector states = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value;
+		int rlist2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rlist2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector rlist2 = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 
+                     Enumeration rs = rlist2.elements();
+                     while ( rs.hasMoreElements() ) {
+                       Integer elem = (Integer) rs.nextElement();
+                       // might be null for error case of "rule"
+                       if (elem != null) { 
+                         regExps.addStates( elem.intValue(), states );
+                       }
+                       rlist1.addElement( elem );
+                     }                       
+                     RESULT = rlist1;
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 11: // rules ::= rules rule 
+            {
+              Vector RESULT =null;
+		int rlistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int rlistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		Vector rlist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 rlist.addElement(r); RESULT = rlist; 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 10: // macro ::= IDENT EQUALS 
+            {
+              Object RESULT =null;
+		int eleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right;
+		Object e = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value;
+		 syntaxError(ErrorMessages.REGEXP_EXPECTED, eleft, eright); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 9: // macro ::= IDENT EQUALS series REGEXPEND 
+            {
+              Object RESULT =null;
+		int nameleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left;
+		int nameright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right;
+		String name = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value;
+		int definitionleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int definitionright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		RegExp definition = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		 macros.insert(name, definition); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 8: // macro ::= UNICODE 
+            {
+              Object RESULT =null;
+		 charClasses.setMaxCharCode(0xFFFF); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 7: // macro ::= FULL 
+            {
+              Object RESULT =null;
+		 charClasses.setMaxCharCode(255); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 6: // macro ::= ASCII 
+            {
+              Object RESULT =null;
+		 charClasses.setMaxCharCode(127); 
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 5: // macros ::= error 
+            {
+              Object RESULT =null;
+
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 4: // macros ::= macros macro 
+            {
+              Object RESULT =null;
+
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 3: // macros ::= 
+            {
+              Object RESULT =null;
+
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 2: // specification ::= 
+            {
+              NFA RESULT =null;
+		 
+                     fatalError(ErrorMessages.NO_LEX_SPEC);
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 1: // specification ::= USERCODE macros DELIMITER rules 
+            {
+              NFA RESULT =null;
+		
+                     scanner.t.stop();
+
+                     Out.checkErrors();
+                     
+                     Out.time(ErrorMessages.PARSING_TOOK, t);
+                     
+                     macros.expand();
+                     Enumeration unused = macros.unused();                     
+                     while ( unused.hasMoreElements() ) {
+                       Out.warning("Macro \""+unused.nextElement()+"\" has been declared but never used.");
+                     }
+
+                     SemCheck.check(regExps, macros, scanner.file);
+  
+                     regExps.checkActions();
+                     regExps.checkLookAheads();
+
+                     Out.checkErrors();
+
+                     if (Options.dump) charClasses.dump();
+
+                     Out.print("Constructing NFA : ");
+
+                     t.start();
+                     int num = regExps.getNum();
+                     
+                     RESULT = new NFA(charClasses.getNumClasses(), 
+                                      scanner, regExps, macros, charClasses);
+                     
+                     eofActions.setNumLexStates(scanner.states.number());
+
+                     for (int i = 0; i < num; i++) {
+                       if (regExps.isEOF(i))
+                         eofActions.add( regExps.getStates(i), regExps.getAction(i) );
+                       else
+                         RESULT.addRegExp(i);
+                     }
+                     
+                     if (scanner.standalone) RESULT.addStandaloneRule();
+                     t.stop();
+       
+                     Out.time("");              
+	                   Out.time(ErrorMessages.NFA_TOOK, t);
+                     
+                   
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          return CUP$LexParse$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 0: // $START ::= specification EOF 
+            {
+              Object RESULT =null;
+		int start_valleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left;
+		int start_valright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right;
+		NFA start_val = (NFA)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value;
+		RESULT = start_val;
+              CUP$LexParse$result = parser.getSymbolFactory().newSymbol("$START",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT);
+            }
+          /* ACCEPT */
+          CUP$LexParse$parser.done_parsing();
+          return CUP$LexParse$result;
+
+          /* . . . . . .*/
+          default:
+            throw new Exception(
+               "Invalid action number found in internal parse table");
+
+        }
+    }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexScan.flex
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexScan.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexScan.flex	(revision 25584)
@@ -0,0 +1,582 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java_cup.runtime.Symbol;
+import java.util.Vector;
+import java.io.*;
+import java.util.Stack;
+
+/**
+ * The lexer of JFlex.
+ *
+ * Generated by <a href="http://www.jflex.de/">JFlex</a>.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+%%
+
+%final
+%public
+%class LexScan
+%implements sym, java_cup.runtime.Scanner
+%function next_token
+
+%type Symbol
+%unicode
+
+%column
+%line
+
+%eofclose
+
+%state COMMENT, STATELIST, MACROS, REGEXPSTART
+%state REGEXP, JAVA_CODE, STATES, STRING_CONTENT
+%state CHARCLASS, COPY, REPEATEXP, EATWSPNL
+%state CTOR_ARG
+
+%cupdebug
+
+%{  
+  int balance = 0;
+  int commentbalance = 0;
+  int action_line = 0;
+  int bufferSize = 16384;
+
+  File file;
+  Stack files = new Stack();
+
+  StringBuffer userCode   = new StringBuffer();
+  
+  String classCode;
+  String initCode;   
+  String initThrow;
+  String eofCode;
+  String eofThrow;
+  String lexThrow;
+  String eofVal;
+  String scanErrorException;
+  String cupSymbol = "sym";
+
+  StringBuffer actionText = new StringBuffer();
+  StringBuffer string     = new StringBuffer();
+  
+  boolean charCount;
+  boolean lineCount;
+  boolean columnCount;
+  boolean cupCompatible;  
+  boolean cupDebug;
+  boolean isInteger;
+  boolean isIntWrap;
+  boolean isYYEOF;
+  boolean notUnix;
+  boolean isPublic;
+  boolean isFinal;
+  boolean isAbstract;
+  boolean bolUsed;
+  boolean standalone;
+  boolean debugOption;
+  boolean useRowMap = Options.gen_method == Options.PACK || Options.gen_method == Options.TABLE;
+  boolean packed = Options.gen_method == Options.PACK;
+  boolean caseless;
+  boolean inclusive_states;
+  boolean eofclose;
+    
+  String isImplementing;
+  String isExtending;
+  String className = "Yylex";
+  String functionName;
+  String tokenType;
+  String visibility = "public";
+    
+  Vector /* String */ ctorArgs = new Vector();
+  Vector /* String */ ctorTypes = new Vector();
+    
+  LexicalStates states = new LexicalStates();
+
+  Vector actions = new Vector();
+  
+  private int nextState;
+
+  boolean macroDefinition;
+
+  Timer t = new Timer();
+
+  public int currentLine() {
+    return yyline;
+  }    
+
+  public void setFile(File file) {
+    this.file = file;
+  }
+
+  private Symbol symbol(int type, Object value) {
+    return new Symbol(type, yyline, yycolumn, value);
+  }
+
+  private Symbol symbol(int type) {
+    return new Symbol(type, yyline, yycolumn);
+  }
+   
+  // updates line and column count to the beginning of the first
+  // non whitespace character in yytext, but leaves yyline+yycolumn 
+  // untouched
+  private Symbol symbol_countUpdate(int type, Object value) {
+     int lc = yyline;
+     int cc = yycolumn;
+     String text = yytext();
+
+     for (int i=0; i < text.length(); i++) {
+      char c = text.charAt(i);
+
+      if (c != '\n' && c != '\r' && c != ' ' && c != '\t' ) 
+        return new Symbol(type, lc, cc, value);
+
+      if (c == '\n') {
+        lc++;
+        cc = 0;
+      }
+      else
+        cc++;
+    }
+   
+    return new Symbol(type, yyline, yycolumn, value);
+  }
+
+  private String makeMacroIdent() {
+    String matched = yytext().trim();
+    return matched.substring(1, matched.length()-1).trim();
+  }
+
+  public static String conc(Object a, Object b) {
+    if (a == null && b == null) return null;
+    if (a == null) return b.toString();
+    if (b == null) return a.toString();
+    
+    return a.toString()+b.toString();
+  }
+
+  public static String concExc(Object a, Object b) {
+    if (a == null && b == null) return null;
+    if (a == null) return b.toString();
+    if (b == null) return a.toString();
+    
+    return a.toString()+", "+b.toString();
+  }
+%}
+
+%init{
+  states.insert("YYINITIAL", true);
+%init}
+
+
+Digit      = [0-9]
+HexDigit   = [0-9a-fA-F]
+OctDigit   = [0-7]
+
+Number     = {Digit}+
+HexNumber  = \\ x {HexDigit} {2}
+Unicode    = \\ u {HexDigit} {1, 4}
+OctNumber  = \\ [0-3]? {OctDigit} {1, 2}  
+
+// see http://www.unicode.org/unicode/reports/tr18/
+WSP        = [ \t\b]
+WSPNL      = [\u2028\u2029\u000A\u000B\u000C\u000D\u0085\t\b\ ]
+NL         = [\u2028\u2029\u000A\u000B\u000C\u000D\u0085] | \u000D\u000A
+NNL        = [^\u2028\u2029\u000A\u000B\u000C\u000D\u0085]
+
+Ident      = {IdentStart} {IdentPart}*
+QualIdent  = {Ident} ( {WSP}* "." {WSP}* {Ident} )*
+QUIL       = {QualIdent} ( {WSP}* "," {WSP}* {QualIdent} )*
+Array      = "[" {WSP}* "]"
+ParamPart  = {IdentStart}|{IdentPart}|"<"|">"|","|{WSP}|"&"|"?"|"."
+GenParam   = "<" {ParamPart}+ ">"
+ClassT     = {Ident} ({WSP}* {GenParam})?
+QClassT    = {QualIdent} ({WSP}* {GenParam})?
+ArrType    = ({GenParam} {WSP}*)? {QClassT} ({WSP}* {Array})*
+
+IdentStart = [:jletter:]
+IdentPart  = [:jletterdigit:]
+
+JFlexCommentChar = [^*/]|"/"+[^*/]|"*"+[^*/]
+JFlexComment = {JFlexCommentChar}*
+
+/* Java comments */
+JavaComment = {TraditionalComment}|{EndOfLineComment}
+TraditionalComment = "/*"{CommentContent}\*+"/"
+EndOfLineComment = "//".*{NL}
+
+CommentContent = ([^*]|\*+[^*/])*
+
+StringCharacter = [^\u2028\u2029\u000A\u000B\u000C\u000D\u0085\"\\]
+
+CharLiteral = \'([^\u2028\u2029\u000A\u000B\u000C\u000D\u0085\'\\]|{EscapeSequence})\'
+StringLiteral = \"({StringCharacter}|{EscapeSequence})*\"
+
+EscapeSequence = \\[^\u2028\u2029\u000A\u000B\u000C\u000D\u0085]|\\+u{HexDigit}{4}|\\[0-3]?{OctDigit}{1,2}
+
+/* \\(b|t|n|f|r|\"|\'|\\|[0-3]?{OctDigit}{1,2}|u{HexDigit}{4}) */
+
+JavaRest = [^\{\}\"\'/]|"/"[^*/]      
+JavaCode = ({JavaRest}|{StringLiteral}|{CharLiteral}|{JavaComment})+
+
+%%
+
+<YYINITIAL> {
+  "%%".*{NL}?              { 
+                             t.start(); 
+                             yybegin(MACROS); 
+                             macroDefinition = true; 
+                             return symbol(USERCODE,userCode); 
+                           }
+  .*{NL}                   { userCode.append(yytext()); }            
+  .*                       { return symbol(EOF); }
+}
+
+<MACROS>   ("%{"|"%init{"|"%initthrow{"|"%eof{"|"%eofthrow{"|"%yylexthrow{"|"%eofval{").*{NL}
+                                     { string.setLength(0); yybegin(COPY); }
+<COPY> {
+  "%}".*{NL}                    { classCode = conc(classCode,string);  yybegin(MACROS);  }
+  "%init}".*{NL}                { initCode = conc(initCode,string);    yybegin(MACROS);  }
+  "%initthrow}".*{NL}           { initThrow = concExc(initThrow,string);  yybegin(MACROS); }
+  "%eof}".*{NL}                 { eofCode = conc(eofCode,string); yybegin(MACROS); }
+  "%eofthrow}".*{NL}            { eofThrow = concExc(eofThrow,string); yybegin(MACROS); }
+  "%yylexthrow}".*{NL}          { lexThrow = concExc(lexThrow,string); yybegin(MACROS); }
+  "%eofval}".*{NL}              { eofVal = string.toString(); yybegin(MACROS); }
+
+  .*{NL}                        { string.append(yytext()); }
+
+  <<EOF>>                       { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); }
+}
+
+
+<MACROS> ^"%s" ("tate" "s"?)? {WSP}+   { inclusive_states = true; yybegin(STATELIST); }
+<MACROS> ^"%x" ("state" "s"?)? {WSP}+  { inclusive_states = false; yybegin(STATELIST); }
+<STATELIST> {
+  {Ident}                             { states.insert(yytext(),inclusive_states); }
+  ([\ \t]*","[\ \t]*)|([\ \t]+)       { }
+  {NL}                                { yybegin(MACROS);  }
+  <<EOF>>                       { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); }
+}
+
+<MACROS> {
+  "%char"                     { charCount = true;  }
+  "%line"                     { lineCount = true;  }
+  "%column"                   { columnCount = true; }
+  "%byaccj"                   { isInteger = true;
+                                if (eofVal == null)
+                                  eofVal = "return 0;";
+                                eofclose = true;
+                              }
+  "%cup"                      { cupCompatible = true;  
+                                isImplementing = concExc(isImplementing, "java_cup.runtime.Scanner");
+                                if (functionName == null)
+                                  functionName = "next_token";
+                                if (tokenType == null)
+                                  tokenType = "java_cup.runtime.Symbol";
+                                if (eofVal == null)
+                                  eofVal = "return new java_cup.runtime.Symbol("+cupSymbol+".EOF);";
+                                if (!Options.jlex) eofclose = true;
+                              }
+  "%cupsym"{WSP}+{QualIdent} {WSP}*  { cupSymbol = yytext().substring(8).trim(); 
+                                if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); }
+  "%cupsym"{WSP}+{NNL}*       { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); }
+  "%cupdebug"                 { cupDebug = true; }
+  "%eofclose"({WSP}+"true")?  { eofclose = true; }
+  "%eofclose"({WSP}+"false")  { eofclose = false; }
+  "%class"{WSP}+{ClassT} {WSP}*     { className = yytext().substring(7).trim();  }
+  "%ctorarg"{WSP}+{ArrType}{WSP}+   { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); }
+  "%function"{WSP}+{Ident} {WSP}*   { functionName = yytext().substring(10).trim(); }
+  "%type"{WSP}+{ArrType} {WSP}*     { tokenType = yytext().substring(6).trim(); }
+  "%integer"|"%int"           { isInteger = true;  }
+  "%intwrap"                  { isIntWrap = true;  }
+  "%yyeof"                    { isYYEOF = true;  }
+  "%notunix"                  { notUnix = true;  }
+  "%7bit"                     { return symbol(ASCII); }
+  "%full"|"%8bit"             { return symbol(FULL); }
+  "%unicode"|"%16bit"         { return symbol(UNICODE);  }
+  "%caseless"|"%ignorecase"   { caseless = true; }
+  "%implements"{WSP}+.*       { isImplementing = concExc(isImplementing, yytext().substring(12).trim());  }
+  "%extends"{WSP}+{QClassT}{WSP}* { isExtending = yytext().substring(9).trim(); }
+  "%public"                   { isPublic = true; }
+  "%apiprivate"               { visibility = "private"; Skeleton.makePrivate(); }
+  "%final"                    { isFinal = true; }
+  "%abstract"                 { isAbstract = true; }
+  "%debug"                    { debugOption = true; }
+  "%standalone"               { standalone = true; isInteger = true; }
+  "%switch"                   { packed = false; useRowMap = false; }
+  "%table"                    { packed = false; useRowMap = true; }
+  "%pack"                     { packed = true; useRowMap = true; }
+  "%include" {WSP}+ .*        { File f = new File(yytext().substring(9).trim());
+                                if ( !f.canRead() )
+                                  throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); 
+                                // check for cycle
+                                if (files.search(f) > 0)
+                                  throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline);
+                                try {
+                                  yypushStream( new FileReader(f) );
+                                  files.push(file);
+                                  file = f;
+                                  Out.println("Including \""+file+"\"");
+                                }
+                                catch (FileNotFoundException e) {
+                                  throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); 
+                                } 
+                              }
+  "%buffer" {WSP}+ {Number} {WSP}*   { bufferSize = Integer.parseInt(yytext().substring(8).trim()); }
+  "%buffer" {WSP}+ {NNL}*     { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); }
+  "%initthrow" {WSP}+ {QUIL} {WSP}* { initThrow = concExc(initThrow,yytext().substring(11).trim()); }
+  "%initthrow" {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); }
+  "%eofthrow"  {WSP}+ {QUIL} {WSP}*  { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); }
+  "%eofthrow"  {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); }
+  "%yylexthrow"{WSP}+ {QUIL} {WSP}*  { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); }
+  "%throws"    {WSP}+ {QUIL} {WSP}*  { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); }
+  "%yylexthrow"{WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); }
+  "%throws"    {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); }
+  "%scanerror" {WSP}+ {QualIdent} {WSP}* { scanErrorException = yytext().substring(11).trim(); }
+  "%scanerror" {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); }
+
+  {Ident}                     { return symbol(IDENT, yytext()); }
+  "="{WSP}*                   { yybegin(REGEXP); return symbol(EQUALS); }
+
+  "/*"                        { nextState = MACROS; yybegin(COMMENT); }
+  
+  {EndOfLineComment}          { }
+
+  /* no {NL} at the end of this expression, because <REGEXPSTART> 
+     needs at least one {WSPNL} to start a regular expression! */   
+  ^"%%" {NNL}*                { macroDefinition = false; yybegin(REGEXPSTART); return symbol(DELIMITER); }
+  "%"{Ident}                  { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); }
+  "%"                         { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); }
+  ^{WSP}+"%"                  { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); }
+
+  {WSP}+                      { }
+  {NL}+                       { }                        
+  <<EOF>>                     { if ( yymoreStreams() ) {
+                                  file = (File) files.pop();
+                                  yypopStream();
+                                }
+                                else
+                                  throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); 
+                              }
+}
+
+<CTOR_ARG> {
+  {Ident} {WSP}*   { yybegin(MACROS); ctorArgs.add(yytext().trim()); }
+  [^]              { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); }
+}
+
+<REGEXPSTART> {
+  {WSPNL}* "/*"               { nextState = REGEXPSTART; yybegin(COMMENT); }
+  {WSPNL}+                    { yybegin(REGEXP); }
+  {WSPNL}* "<"                { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); }
+  {WSPNL}* "}"                { return symbol_countUpdate(RBRACE, null); }
+  {WSPNL}* "//" {NNL}*        { }  
+  {WSPNL}* "<<EOF>>" {WSPNL}* "{" 
+                              { actionText.setLength(0); yybegin(JAVA_CODE); 
+                                Symbol s = symbol_countUpdate(EOFRULE, null);
+                                action_line = s.left+1; 
+                                return s;
+                              }
+}
+
+<STATES> {
+  {Ident}                     { return symbol(IDENT, yytext()); }
+  ","                         { return symbol(COMMA); }
+  {WSPNL}+                    { }
+
+  // "{" will be caught in REGEXP  
+  ">"{WSPNL}*                 { yybegin(REGEXP); return symbol(MORETHAN); }
+
+  <<EOF>>                     { throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); }
+}
+
+
+<REGEXP> {
+  "<<EOF>>" {WSPNL}+ "{"  { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); }
+  "<<EOF>>"               { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); }
+
+  {WSPNL}*"|"{WSP}*$      { if (macroDefinition) {
+                              yybegin(EATWSPNL);
+                              return symbol(BAR); 
+                            }
+                            else { 
+                              yybegin(REGEXPSTART); 
+                              return symbol(NOACTION); 
+                            }
+                          }
+
+  // stategroup
+  "{"          { yybegin(REGEXPSTART); return symbol(LBRACE); }
+
+  {WSPNL}*"|"  { return symbol(BAR); }
+
+  {WSPNL}*\"   { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); }
+  {WSPNL}*"!"  { return symbol(BANG); }
+  {WSPNL}*"~"  { return symbol(TILDE); }
+  {WSPNL}*"("  { return symbol(OPENBRACKET); }
+  {WSPNL}*")"  { return symbol(CLOSEBRACKET); }
+  {WSPNL}*"*"  { return symbol(STAR); }
+  {WSPNL}*"+"  { return symbol(PLUS); }
+  {WSPNL}*"?"  { return symbol(QUESTION); }
+  {WSPNL}*"$"  { return symbol(DOLLAR); }
+  {WSPNL}*"^"  { bolUsed = true; return symbol(HAT); }
+  {WSPNL}*"."  { return symbol(POINT); }
+  {WSPNL}*"["  { yybegin(CHARCLASS); return symbol(OPENCLASS); }
+  {WSPNL}*"/"  { return symbol(LOOKAHEAD); }
+  
+  {WSPNL}* "{" {WSP}* {Ident} {WSP}* "}" { return symbol_countUpdate(MACROUSE, makeMacroIdent()); }
+  {WSPNL}* "{" {WSP}* {Number}   { yybegin(REPEATEXP); return symbol(REPEAT, new Integer(yytext().trim().substring(1).trim())); }
+
+  {WSPNL}+ "{"    { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); }
+  {NL}            { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); }
+
+  {WSPNL}*"/*"    { nextState = REGEXP; yybegin(COMMENT); }
+
+  {WSPNL}*"//"{NNL}*  { }
+
+  {WSP}+          { }
+
+  <CHARCLASS> {
+    {WSPNL}*"[:jletter:]"  { return symbol(JLETTERCLASS); }
+    {WSPNL}*"[:jletterdigit:]" { return symbol(JLETTERDIGITCLASS); }
+    {WSPNL}*"[:letter:]"     { return symbol(LETTERCLASS); }
+    {WSPNL}*"[:digit:]"      { return symbol(DIGITCLASS); }
+    {WSPNL}*"[:uppercase:]"  { return symbol(UPPERCLASS); }
+    {WSPNL}*"[:lowercase:]"  { return symbol(LOWERCLASS); }
+  }
+
+  . { return symbol(CHAR, new Character(yytext().charAt(0))); }
+}
+
+<EATWSPNL> {WSPNL}+  { yybegin(REGEXP); }
+
+
+<REPEATEXP> {
+  "}"          { yybegin(REGEXP); return symbol(RBRACE); }
+  "," {WSP}* {Number}  { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); }
+  {WSP}+       { }
+
+  <<EOF>>                 { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }
+}
+
+<CHARCLASS> {
+  "{"{Ident}"}" { return symbol(MACROUSE, yytext().substring(1,yytext().length()-1)); }
+  "["  { balance++; return symbol(OPENCLASS); }
+  "]"  { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); }
+  "^"  { return symbol(HAT); }
+  "-"  { return symbol(DASH); }
+
+  // this is a hack to keep JLex compatibilty with char class 
+  // expressions like [+-]
+  "-]" { yypushback(1); yycolumn--; return symbol(CHAR, new Character(yytext().charAt(0))); }  
+
+  \"   { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); }
+
+  .    { return symbol(CHAR, new Character(yytext().charAt(0))); }
+
+  \n   { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); }
+
+  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }
+}
+
+<STRING_CONTENT> {
+  \"       { yybegin(nextState); return symbol(STRING, string.toString()); }
+  \\\"     { string.append('\"'); }
+  [^\"\\\u2028\u2029\u000A\u000B\u000C\u000D\u0085]+ { string.append(yytext()); }
+
+  {NL}     { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); }
+
+  {HexNumber} { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); }
+  {Unicode}   { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); }
+  {OctNumber} { string.append( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8)); }
+
+  \\b { string.append('\b'); }
+  \\n { string.append('\n'); }
+  \\t { string.append('\t'); }
+  \\f { string.append('\f'); }
+  \\r { string.append('\r'); }
+
+  \\. { string.append(yytext().charAt(1)); }
+
+  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); }
+}
+
+
+<REGEXP, CHARCLASS> {
+  {HexNumber} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); }
+  {Unicode} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); }
+  {OctNumber} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8))); }
+
+  \\b { return symbol(CHAR,new Character('\b')); }
+  \\n { return symbol(CHAR,new Character('\n')); }
+  \\t { return symbol(CHAR,new Character('\t')); }
+  \\f { return symbol(CHAR,new Character('\f')); }
+  \\r { return symbol(CHAR,new Character('\r')); }
+
+  \\. { return symbol(CHAR, new Character(yytext().charAt(1))); }
+}
+
+
+<JAVA_CODE> {
+  "{"        { balance++; actionText.append('{'); }
+  "}"        { if (balance > 0) {
+                 balance--;     
+                 actionText.append('}'); 
+               }
+               else {
+                 yybegin(REGEXPSTART); 
+                 Action a = new Action(actionText.toString(), action_line);
+                 actions.addElement(a);
+                 return symbol(ACTION, a);
+               }
+             } 
+           
+  {JavaCode}     { actionText.append(yytext()); } 
+
+  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); }
+}
+
+<COMMENT> {
+   
+  "/"+ "*"  { commentbalance++; }
+  "*"+ "/"  { if (commentbalance > 0) 
+                commentbalance--; 
+              else
+                yybegin(nextState); 
+            }
+  
+  {JFlexComment} { /* ignore */ }
+
+  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); }
+}
+
+
+.  { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); }
+\n { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); }
+
+<<EOF>>  { if ( yymoreStreams() ) {
+             file = (File) files.pop();
+             yypopStream();
+           }
+           else 
+             return symbol(EOF); }
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexScan.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexScan.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexScan.java	(revision 25584)
@@ -0,0 +1,3012 @@
+/* The following code was generated by JFlex 1.4.3 on 1/31/09 11:52 PM */
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java_cup.runtime.Symbol;
+import java.util.Vector;
+import java.io.*;
+import java.util.Stack;
+
+/**
+ * The lexer of JFlex.
+ *
+ * Generated by <a href="http://www.jflex.de/">JFlex</a>.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+
+public final class LexScan implements sym, java_cup.runtime.Scanner {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+  private static final int ZZ_BUFFERSIZE = 16384;
+
+  /** lexical states */
+  public static final int STRING_CONTENT = 16;
+  public static final int REGEXPSTART = 8;
+  public static final int MACROS = 6;
+  public static final int STATELIST = 4;
+  public static final int CTOR_ARG = 26;
+  public static final int EATWSPNL = 24;
+  public static final int CHARCLASS = 18;
+  public static final int JAVA_CODE = 12;
+  public static final int REGEXP = 10;
+  public static final int YYINITIAL = 0;
+  public static final int REPEATEXP = 22;
+  public static final int COMMENT = 2;
+  public static final int STATES = 14;
+  public static final int COPY = 20;
+
+  /**
+   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
+   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
+   *                  at the beginning of a line
+   * l is of the form l = 2*k, k a non negative integer
+   */
+  private static final int ZZ_LEXSTATE[] = { 
+     0,  0,  1,  1,  2,  2,  3,  4,  5,  5,  6,  6,  7,  7,  8,  8, 
+     9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14
+  };
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\10\25\1\26\1\10\1\13\2\11\1\12\16\25\4\0\1\10\1\76"+
+    "\1\32\1\0\1\103\1\35\1\22\1\33\1\100\1\101\1\30\1\102"+
+    "\1\15\1\106\1\14\1\31\1\7\1\66\2\7\2\3\1\67\1\64"+
+    "\1\65\1\1\1\105\1\0\1\20\1\71\1\21\1\23\1\0\4\2"+
+    "\1\72\1\74\10\24\1\73\13\24\1\16\1\4\1\17\1\104\1\24"+
+    "\1\0\1\53\1\57\1\55\1\62\1\46\1\47\1\63\1\42\1\37"+
+    "\1\60\1\70\1\51\1\56\1\40\1\44\1\61\1\24\1\43\1\54"+
+    "\1\41\1\6\1\52\1\45\1\5\1\50\1\24\1\36\1\75\1\34"+
+    "\1\77\6\25\1\27\32\25\2\0\4\24\4\0\1\24\2\0\1\25"+
+    "\7\0\1\24\4\0\1\24\5\0\27\24\1\0\37\24\1\0\u013f\24"+
+    "\31\0\162\24\4\0\14\24\16\0\5\24\11\0\1\24\21\0\130\25"+
+    "\5\0\23\25\12\0\1\24\13\0\1\24\1\0\3\24\1\0\1\24"+
+    "\1\0\24\24\1\0\54\24\1\0\46\24\1\0\5\24\4\0\202\24"+
+    "\1\0\4\25\3\0\105\24\1\0\46\24\2\0\2\24\6\0\20\24"+
+    "\41\0\46\24\2\0\1\24\7\0\47\24\11\0\21\25\1\0\27\25"+
+    "\1\0\3\25\1\0\1\25\1\0\2\25\1\0\1\25\13\0\33\24"+
+    "\5\0\3\24\15\0\4\25\14\0\6\25\13\0\32\24\5\0\13\24"+
+    "\16\25\7\0\12\25\4\0\2\24\1\25\143\24\1\0\1\24\10\25"+
+    "\1\0\6\25\2\24\2\25\1\0\4\25\2\24\12\25\3\24\2\0"+
+    "\1\24\17\0\1\25\1\24\1\25\36\24\33\25\2\0\3\24\60\0"+
+    "\46\24\13\25\1\24\u014f\0\3\25\66\24\2\0\1\25\1\24\20\25"+
+    "\2\0\1\24\4\25\3\0\12\24\2\25\2\0\12\25\21\0\3\25"+
+    "\1\0\10\24\2\0\2\24\2\0\26\24\1\0\7\24\1\0\1\24"+
+    "\3\0\4\24\2\0\1\25\1\24\7\25\2\0\2\25\2\0\3\25"+
+    "\11\0\1\25\4\0\2\24\1\0\3\24\2\25\2\0\12\25\4\24"+
+    "\15\0\3\25\1\0\6\24\4\0\2\24\2\0\26\24\1\0\7\24"+
+    "\1\0\2\24\1\0\2\24\1\0\2\24\2\0\1\25\1\0\5\25"+
+    "\4\0\2\25\2\0\3\25\13\0\4\24\1\0\1\24\7\0\14\25"+
+    "\3\24\14\0\3\25\1\0\11\24\1\0\3\24\1\0\26\24\1\0"+
+    "\7\24\1\0\2\24\1\0\5\24\2\0\1\25\1\24\10\25\1\0"+
+    "\3\25\1\0\3\25\2\0\1\24\17\0\2\24\2\25\2\0\12\25"+
+    "\1\0\1\24\17\0\3\25\1\0\10\24\2\0\2\24\2\0\26\24"+
+    "\1\0\7\24\1\0\2\24\1\0\5\24\2\0\1\25\1\24\6\25"+
+    "\3\0\2\25\2\0\3\25\10\0\2\25\4\0\2\24\1\0\3\24"+
+    "\4\0\12\25\1\0\1\24\20\0\1\25\1\24\1\0\6\24\3\0"+
+    "\3\24\1\0\4\24\3\0\2\24\1\0\1\24\1\0\2\24\3\0"+
+    "\2\24\3\0\3\24\3\0\10\24\1\0\3\24\4\0\5\25\3\0"+
+    "\3\25\1\0\4\25\11\0\1\25\17\0\11\25\11\0\1\24\7\0"+
+    "\3\25\1\0\10\24\1\0\3\24\1\0\27\24\1\0\12\24\1\0"+
+    "\5\24\4\0\7\25\1\0\3\25\1\0\4\25\7\0\2\25\11\0"+
+    "\2\24\4\0\12\25\22\0\2\25\1\0\10\24\1\0\3\24\1\0"+
+    "\27\24\1\0\12\24\1\0\5\24\2\0\1\25\1\24\7\25\1\0"+
+    "\3\25\1\0\4\25\7\0\2\25\7\0\1\24\1\0\2\24\4\0"+
+    "\12\25\22\0\2\25\1\0\10\24\1\0\3\24\1\0\27\24\1\0"+
+    "\20\24\4\0\6\25\2\0\3\25\1\0\4\25\11\0\1\25\10\0"+
+    "\2\24\4\0\12\25\22\0\2\25\1\0\22\24\3\0\30\24\1\0"+
+    "\11\24\1\0\1\24\2\0\7\24\3\0\1\25\4\0\6\25\1\0"+
+    "\1\25\1\0\10\25\22\0\2\25\15\0\60\24\1\25\2\24\7\25"+
+    "\4\0\10\24\10\25\1\0\12\25\47\0\2\24\1\0\1\24\2\0"+
+    "\2\24\1\0\1\24\2\0\1\24\6\0\4\24\1\0\7\24\1\0"+
+    "\3\24\1\0\1\24\1\0\1\24\2\0\2\24\1\0\4\24\1\25"+
+    "\2\24\6\25\1\0\2\25\1\24\2\0\5\24\1\0\1\24\1\0"+
+    "\6\25\2\0\12\25\2\0\2\24\42\0\1\24\27\0\2\25\6\0"+
+    "\12\25\13\0\1\25\1\0\1\25\1\0\1\25\4\0\2\25\10\24"+
+    "\1\0\42\24\6\0\24\25\1\0\2\25\4\24\4\0\10\25\1\0"+
+    "\44\25\11\0\1\25\71\0\42\24\1\0\5\24\1\0\2\24\1\0"+
+    "\7\25\3\0\4\25\6\0\12\25\6\0\6\24\4\25\106\0\46\24"+
+    "\12\0\51\24\7\0\132\24\5\0\104\24\5\0\122\24\6\0\7\24"+
+    "\1\0\77\24\1\0\1\24\1\0\4\24\2\0\7\24\1\0\1\24"+
+    "\1\0\4\24\2\0\47\24\1\0\1\24\1\0\4\24\2\0\37\24"+
+    "\1\0\1\24\1\0\4\24\2\0\7\24\1\0\1\24\1\0\4\24"+
+    "\2\0\7\24\1\0\7\24\1\0\27\24\1\0\37\24\1\0\1\24"+
+    "\1\0\4\24\2\0\7\24\1\0\47\24\1\0\23\24\16\0\11\25"+
+    "\56\0\125\24\14\0\u026c\24\2\0\10\24\12\0\32\24\5\0\113\24"+
+    "\3\0\3\24\17\0\15\24\1\0\4\24\3\25\13\0\22\24\3\25"+
+    "\13\0\22\24\2\25\14\0\15\24\1\0\3\24\1\0\2\25\14\0"+
+    "\64\24\40\25\3\0\1\24\3\0\2\24\1\25\2\0\12\25\41\0"+
+    "\3\25\2\0\12\25\6\0\130\24\10\0\51\24\1\25\126\0\35\24"+
+    "\3\0\14\25\4\0\14\25\12\0\12\25\36\24\2\0\5\24\u038b\0"+
+    "\154\24\224\0\234\24\4\0\132\24\6\0\26\24\2\0\6\24\2\0"+
+    "\46\24\2\0\6\24\2\0\10\24\1\0\1\24\1\0\1\24\1\0"+
+    "\1\24\1\0\37\24\2\0\65\24\1\0\7\24\1\0\1\24\3\0"+
+    "\3\24\1\0\7\24\3\0\4\24\2\0\6\24\4\0\15\24\5\0"+
+    "\3\24\1\0\7\24\17\0\4\25\30\0\2\11\5\25\20\0\2\24"+
+    "\23\0\1\24\13\0\4\25\6\0\6\25\1\0\1\24\15\0\1\24"+
+    "\40\0\22\24\36\0\15\25\4\0\1\25\3\0\6\25\27\0\1\24"+
+    "\4\0\1\24\2\0\12\24\1\0\1\24\3\0\5\24\6\0\1\24"+
+    "\1\0\1\24\1\0\1\24\1\0\4\24\1\0\3\24\1\0\7\24"+
+    "\3\0\3\24\5\0\5\24\26\0\44\24\u0e81\0\3\24\31\0\11\24"+
+    "\6\25\1\0\5\24\2\0\5\24\4\0\126\24\2\0\2\25\2\0"+
+    "\3\24\1\0\137\24\5\0\50\24\4\0\136\24\21\0\30\24\70\0"+
+    "\20\24\u0200\0\u19b6\24\112\0\u51a6\24\132\0\u048d\24\u0773\0\u2ba4\24\u215c\0"+
+    "\u012e\24\2\0\73\24\225\0\7\24\14\0\5\24\5\0\1\24\1\25"+
+    "\12\24\1\0\15\24\1\0\5\24\1\0\1\24\1\0\2\24\1\0"+
+    "\2\24\1\0\154\24\41\0\u016b\24\22\0\100\24\2\0\66\24\50\0"+
+    "\15\24\3\0\20\25\20\0\4\25\17\0\2\24\30\0\3\24\31\0"+
+    "\1\24\6\0\5\24\1\0\207\24\2\0\1\25\4\0\1\24\13\0"+
+    "\12\25\7\0\32\24\4\0\1\24\1\0\32\24\12\0\132\24\3\0"+
+    "\6\24\2\0\6\24\2\0\6\24\2\0\3\24\3\0\2\24\3\0"+
+    "\2\24\22\0\3\25\4\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\1\1\1\2\15\0\1\1\2\3\1\1\1\2\3\4"+
+    "\1\5\1\6\2\7\1\6\1\10\2\6\1\4\1\11"+
+    "\1\12\1\6\1\11\1\13\1\14\1\4\1\15\2\16"+
+    "\1\6\2\17\1\20\1\21\1\16\1\22\1\23\1\24"+
+    "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
+    "\1\35\1\36\1\37\3\4\1\40\1\41\1\6\1\42"+
+    "\1\43\1\44\1\4\2\45\1\46\1\16\1\47\1\50"+
+    "\1\51\1\52\1\16\1\53\1\54\1\4\2\44\1\4"+
+    "\1\55\1\4\1\56\1\13\1\57\1\60\1\61\3\0"+
+    "\1\62\1\63\1\0\1\64\1\0\2\11\1\0\15\11"+
+    "\3\0\1\65\1\11\1\66\1\11\2\0\1\67\1\6"+
+    "\1\70\1\71\2\70\1\71\1\72\1\73\1\74\1\75"+
+    "\1\76\1\0\1\77\2\0\1\100\1\101\3\0\2\102"+
+    "\10\0\1\103\1\104\2\103\1\104\1\105\1\106\1\107"+
+    "\1\110\1\111\1\112\3\0\1\113\5\0\1\114\1\0"+
+    "\1\60\1\61\2\6\1\11\2\115\35\11\3\0\2\116"+
+    "\1\11\2\117\1\11\1\0\1\71\1\0\1\120\6\0"+
+    "\1\121\1\122\1\0\1\37\4\0\1\104\1\0\1\123"+
+    "\1\124\2\125\3\0\2\11\1\126\24\11\1\127\12\11"+
+    "\3\0\2\11\1\0\2\120\14\0\2\123\3\0\20\11"+
+    "\1\130\3\11\1\131\10\11\1\132\6\11\1\133\1\11"+
+    "\1\134\1\130\1\0\2\11\1\0\1\120\13\0\1\123"+
+    "\5\0\11\11\1\0\1\11\1\135\5\11\1\136\1\137"+
+    "\17\11\1\140\1\141\2\11\7\0\2\37\10\0\2\142"+
+    "\3\0\11\11\1\143\1\0\11\11\1\144\4\11\1\145"+
+    "\1\0\3\11\1\146\1\147\2\11\6\0\1\150\1\37"+
+    "\3\0\1\37\6\0\2\151\4\0\1\141\1\11\1\152"+
+    "\1\126\3\11\1\153\2\154\1\143\4\0\11\11\2\155"+
+    "\2\11\1\156\1\11\2\157\1\11\1\160\6\0\1\37"+
+    "\6\0\1\37\13\0\1\11\1\161\2\11\1\154\1\162"+
+    "\1\154\1\143\3\0\2\11\1\163\2\11\1\164\3\11"+
+    "\1\155\1\165\1\155\1\166\1\0\1\11\1\156\1\0"+
+    "\1\167\1\157\2\170\1\157\4\0\1\171\1\172\2\37"+
+    "\4\0\2\37\7\0\2\173\1\0\3\11\2\162\2\143"+
+    "\1\174\2\175\1\0\1\11\1\0\5\11\2\165\2\0"+
+    "\1\11\1\0\2\170\2\0\1\176\2\0\1\37\2\0"+
+    "\2\37\4\0\1\37\2\0\2\37\7\0\2\177\1\11"+
+    "\1\162\1\0\1\143\1\0\1\174\1\0\1\175\1\200"+
+    "\1\175\2\0\2\11\1\201\1\11\1\202\1\203\2\204"+
+    "\1\165\1\0\1\205\3\0\1\205\1\0\1\205\1\156"+
+    "\3\0\1\206\1\0\4\37\3\0\4\37\3\0\2\207"+
+    "\1\0\1\177\1\210\1\177\1\211\3\0\2\200\2\0"+
+    "\2\11\1\201\2\212\1\204\1\213\1\204\12\0\3\37"+
+    "\5\0\3\37\1\0\2\214\1\0\2\210\2\143\1\174"+
+    "\1\200\3\0\2\11\1\212\1\215\1\212\2\213\1\205"+
+    "\2\0\1\216\1\217\4\0\1\37\3\0\1\37\2\220"+
+    "\1\210\1\0\1\143\1\163\1\0\1\163\1\11\2\215"+
+    "\1\213\1\0\2\205\1\0\1\205\3\0\1\37\2\0"+
+    "\1\37\2\221\1\215\10\0\1\222\3\205";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[826];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\107\0\216\0\325\0\u011c\0\u0163\0\u01aa\0\u01f1"+
+    "\0\u0238\0\u027f\0\u02c6\0\u030d\0\u0354\0\u039b\0\u03e2\0\u0429"+
+    "\0\u0429\0\u0470\0\u04b7\0\u04fe\0\u0545\0\u058c\0\u0470\0\u05d3"+
+    "\0\u061a\0\u0470\0\u0661\0\u06a8\0\u06ef\0\u0736\0\u077d\0\u07c4"+
+    "\0\u080b\0\u0852\0\u0899\0\u08e0\0\u0927\0\u096e\0\u09b5\0\u0470"+
+    "\0\u0470\0\u09fc\0\u0a43\0\u0a8a\0\u0ad1\0\u0470\0\u0b18\0\u0b5f"+
+    "\0\u0470\0\u0470\0\u0ba6\0\u0470\0\u0bed\0\u0c34\0\u0470\0\u0470"+
+    "\0\u0470\0\u0470\0\u0470\0\u0470\0\u0470\0\u0c7b\0\u0cc2\0\u0d09"+
+    "\0\u0d50\0\u0470\0\u0470\0\u0d97\0\u0470\0\u0dde\0\u0e25\0\u0e6c"+
+    "\0\u0470\0\u0eb3\0\u0470\0\u0efa\0\u0efa\0\u0b18\0\u0470\0\u0470"+
+    "\0\u0f41\0\u0470\0\u0f88\0\u0fcf\0\u0fcf\0\u0470\0\u1016\0\u0470"+
+    "\0\u105d\0\u0470\0\u10a4\0\u0470\0\u10eb\0\u1132\0\u1179\0\u11c0"+
+    "\0\u0545\0\u0470\0\u0470\0\u058c\0\u0470\0\u1207\0\u124e\0\u1295"+
+    "\0\u12dc\0\u1323\0\u136a\0\u13b1\0\u13f8\0\u143f\0\u1486\0\u14cd"+
+    "\0\u1514\0\u155b\0\u15a2\0\u15e9\0\u1630\0\u1677\0\u16be\0\u1705"+
+    "\0\u174c\0\u0470\0\u1793\0\u17da\0\u1821\0\u09b5\0\u1868\0\u0470"+
+    "\0\u18af\0\u0470\0\u18f6\0\u193d\0\u1984\0\u19cb\0\u0470\0\u0470"+
+    "\0\u0470\0\u0470\0\u0470\0\u0a8a\0\u0bed\0\u1a12\0\u1a59\0\u0470"+
+    "\0\u1aa0\0\u1ae7\0\u0bed\0\u0c34\0\u0470\0\u1b2e\0\u0cc2\0\u0d09"+
+    "\0\u0d50\0\u1b75\0\u1bbc\0\u1c03\0\u1c4a\0\u1c91\0\u0470\0\u1cd8"+
+    "\0\u1d1f\0\u1d66\0\u1dad\0\u0470\0\u0470\0\u0470\0\u0470\0\u0470"+
+    "\0\u0470\0\u0efa\0\u0b18\0\u1df4\0\u0470\0\u0fcf\0\u1e3b\0\u1e82"+
+    "\0\u1ec9\0\u1f10\0\u1f57\0\u105d\0\u1f9e\0\u0470\0\u1207\0\u0470"+
+    "\0\u1fe5\0\u12dc\0\u0470\0\u202c\0\u2073\0\u20ba\0\u2101\0\u2148"+
+    "\0\u218f\0\u21d6\0\u221d\0\u2264\0\u22ab\0\u22f2\0\u2339\0\u2380"+
+    "\0\u23c7\0\u240e\0\u2455\0\u249c\0\u24e3\0\u252a\0\u2571\0\u25b8"+
+    "\0\u25ff\0\u2646\0\u268d\0\u26d4\0\u271b\0\u2762\0\u27a9\0\u27f0"+
+    "\0\u2837\0\u287e\0\u28c5\0\u290c\0\u2953\0\u299a\0\u29e1\0\u2a28"+
+    "\0\u2a6f\0\u2ab6\0\u0470\0\u2afd\0\u2b44\0\u2b8b\0\u2bd2\0\u2c19"+
+    "\0\u2c60\0\u2ca7\0\u2cee\0\u0470\0\u0470\0\u2d35\0\u2d7c\0\u2dc3"+
+    "\0\u2e0a\0\u2e51\0\u2e98\0\u0470\0\u2edf\0\u2f26\0\u0470\0\u1e3b"+
+    "\0\u0470\0\u2f6d\0\u2fb4\0\u2ffb\0\u3042\0\u3089\0\u30d0\0\u3117"+
+    "\0\u315e\0\u31a5\0\u31ec\0\u3233\0\u327a\0\u32c1\0\u3308\0\u334f"+
+    "\0\u3396\0\u33dd\0\u3424\0\u346b\0\u34b2\0\u34f9\0\u3540\0\u3587"+
+    "\0\u35ce\0\u3615\0\u365c\0\u36a3\0\u36ea\0\u3731\0\u3778\0\u37bf"+
+    "\0\u3806\0\u384d\0\u3894\0\u38db\0\u3922\0\u3969\0\u39b0\0\u39f7"+
+    "\0\u3a3e\0\u3a85\0\u3acc\0\u3b13\0\u0470\0\u3b5a\0\u3ba1\0\u3be8"+
+    "\0\u3c2f\0\u3c76\0\u3cbd\0\u3d04\0\u3d4b\0\u3d92\0\u3dd9\0\u3e20"+
+    "\0\u3e67\0\u3eae\0\u0470\0\u3ef5\0\u3f3c\0\u3f83\0\u3fca\0\u4011"+
+    "\0\u4058\0\u409f\0\u40e6\0\u412d\0\u4174\0\u41bb\0\u4202\0\u4249"+
+    "\0\u4290\0\u42d7\0\u431e\0\u4365\0\u43ac\0\u43f3\0\u443a\0\u124e"+
+    "\0\u4481\0\u44c8\0\u450f\0\u124e\0\u4556\0\u459d\0\u45e4\0\u462b"+
+    "\0\u4672\0\u46b9\0\u4700\0\u4747\0\u124e\0\u478e\0\u47d5\0\u481c"+
+    "\0\u4863\0\u48aa\0\u48f1\0\u124e\0\u4938\0\u0470\0\u0470\0\u497f"+
+    "\0\u49c6\0\u4a0d\0\u4a54\0\u2afd\0\u4a9b\0\u4ae2\0\u4b29\0\u4b70"+
+    "\0\u4bb7\0\u4bfe\0\u4c45\0\u4c8c\0\u4cd3\0\u4d1a\0\u4d61\0\u2edf"+
+    "\0\u4da8\0\u4def\0\u4e36\0\u4e7d\0\u4ec4\0\u4f0b\0\u4f52\0\u4f99"+
+    "\0\u4fe0\0\u5027\0\u506e\0\u50b5\0\u50fc\0\u5143\0\u518a\0\u51d1"+
+    "\0\u124e\0\u5218\0\u525f\0\u52a6\0\u52ed\0\u5334\0\u124e\0\u124e"+
+    "\0\u537b\0\u53c2\0\u5409\0\u5450\0\u5497\0\u54de\0\u5525\0\u556c"+
+    "\0\u55b3\0\u55fa\0\u5641\0\u5688\0\u56cf\0\u5716\0\u575d\0\u124e"+
+    "\0\u0470\0\u57a4\0\u57eb\0\u5832\0\u5879\0\u58c0\0\u5907\0\u594e"+
+    "\0\u5995\0\u59dc\0\u5a23\0\u5a6a\0\u5ab1\0\u5af8\0\u5b3f\0\u5b86"+
+    "\0\u5bcd\0\u5c14\0\u5c5b\0\u5ca2\0\u4def\0\u0470\0\u5ce9\0\u5d30"+
+    "\0\u5d77\0\u5dbe\0\u5e05\0\u5e4c\0\u5e93\0\u5eda\0\u5f21\0\u5f68"+
+    "\0\u5faf\0\u5ff6\0\u603d\0\u6084\0\u60cb\0\u6112\0\u6159\0\u61a0"+
+    "\0\u61e7\0\u622e\0\u6275\0\u62bc\0\u6303\0\u124e\0\u634a\0\u6391"+
+    "\0\u63d8\0\u641f\0\u124e\0\u6466\0\u64ad\0\u64f4\0\u653b\0\u124e"+
+    "\0\u124e\0\u6582\0\u2a28\0\u65c9\0\u6610\0\u6657\0\u669e\0\u66e5"+
+    "\0\u672c\0\u6773\0\u67ba\0\u6801\0\u6848\0\u688f\0\u68d6\0\u691d"+
+    "\0\u6964\0\u69ab\0\u69f2\0\u6a39\0\u6a80\0\u5c5b\0\u0470\0\u6ac7"+
+    "\0\u6b0e\0\u6b55\0\u6b9c\0\u124e\0\u6be3\0\u124e\0\u124e\0\u6c2a"+
+    "\0\u6c71\0\u6cb8\0\u124e\0\u6cff\0\u6d46\0\u6d8d\0\u6dd4\0\u6e1b"+
+    "\0\u6e62\0\u6ea9\0\u6ef0\0\u6f37\0\u6f7e\0\u6fc5\0\u700c\0\u7053"+
+    "\0\u709a\0\u70e1\0\u7128\0\u716f\0\u71b6\0\u71fd\0\u7244\0\u728b"+
+    "\0\u72d2\0\u7319\0\u7360\0\u2953\0\u0470\0\u73a7\0\u73ee\0\u7435"+
+    "\0\u747c\0\u74c3\0\u750a\0\u7551\0\u7598\0\u75df\0\u7626\0\u766d"+
+    "\0\u76b4\0\u76fb\0\u7742\0\u7789\0\u77d0\0\u7817\0\u785e\0\u78a5"+
+    "\0\u78ec\0\u7933\0\u797a\0\u79c1\0\u7a08\0\u7a4f\0\u7a96\0\u7add"+
+    "\0\u7b24\0\u7b6b\0\u7bb2\0\u7bf9\0\u7c40\0\u7c87\0\u7cce\0\u7d15"+
+    "\0\u7d5c\0\u7da3\0\u7dea\0\u7e31\0\u7e78\0\u7ebf\0\u124e\0\u7f06"+
+    "\0\u7f4d\0\u7f94\0\u7fdb\0\u8022\0\u8069\0\u124e\0\u80b0\0\u80f7"+
+    "\0\u813e\0\u8185\0\u124e\0\u81cc\0\u8213\0\u825a\0\u82a1\0\u82e8"+
+    "\0\u832f\0\u8376\0\u83bd\0\u0470\0\u0470\0\u8404\0\u844b\0\u8492"+
+    "\0\u84d9\0\u8520\0\u8567\0\u85ae\0\u85f5\0\u863c\0\u8683\0\u86ca"+
+    "\0\u8711\0\u8758\0\u879f\0\u87e6\0\u7a08\0\u0470\0\u882d\0\u8874"+
+    "\0\u88bb\0\u8902\0\u8949\0\u8990\0\u89d7\0\u8a1e\0\u8a65\0\u8aac"+
+    "\0\u8af3\0\u8b3a\0\u8b81\0\u8bc8\0\u8c0f\0\u8c56\0\u8c9d\0\u8ce4"+
+    "\0\u8d2b\0\u8d72\0\u8db9\0\u8e00\0\u8e47\0\u8e8e\0\u8ed5\0\u8f1c"+
+    "\0\u8f63\0\u8faa\0\u8ff1\0\u0470\0\u9038\0\u907f\0\u90c6\0\u910d"+
+    "\0\u9154\0\u919b\0\u91e2\0\u9229\0\u9270\0\u92b7\0\u92fe\0\u9345"+
+    "\0\u938c\0\u93d3\0\u941a\0\u9461\0\u94a8\0\u94ef\0\u9536\0\u957d"+
+    "\0\u95c4\0\u960b\0\u9652\0\u9699\0\u96e0\0\u9727\0\u976e\0\u97b5"+
+    "\0\u97fc\0\u9843\0\u988a\0\u98d1\0\u9918\0\u995f\0\u99a6\0\u99ed"+
+    "\0\u9a34\0\u9a7b\0\u9ac2\0\u9b09\0\u9b50\0\u124e\0\u124e\0\u9b97"+
+    "\0\u9bde\0\u9c25\0\u9c6c\0\u9cb3\0\u9cfa\0\u9d41\0\u9d88\0\u8e00"+
+    "\0\u9dcf\0\u8e8e\0\u9e16\0\u9e5d\0\u9ea4\0\u9eeb\0\u0470\0\u9f32"+
+    "\0\u9f79\0\u9fc0\0\ua007\0\ua04e\0\ua095\0\ua0dc\0\ua123\0\ua16a"+
+    "\0\ua1b1\0\ua1f8\0\ua23f\0\ua286\0\ua2cd\0\ua314\0\u960b\0\u0470"+
+    "\0\ua35b\0\ua3a2\0\ua3e9\0\ua430\0\ua477\0\ua4be\0\ua505\0\ua54c"+
+    "\0\ua593\0\ua5da\0\ua621\0\ua668\0\ua6af\0\ua6f6\0\ua73d\0\ua784"+
+    "\0\ua7cb\0\ua812\0\ua859\0\ua8a0\0\ua8e7\0\ua92e\0\ua975\0\ua9bc"+
+    "\0\uaa03\0\uaa4a\0\uaa91\0\uaad8\0\uab1f\0\uab66\0\uabad\0\uabf4"+
+    "\0\uac3b\0\uac82\0\uacc9\0\uad10\0\uad57\0\uad9e\0\uade5\0\uae2c"+
+    "\0\uae73\0\uaeba\0\ua314\0\u0470\0\uaf01\0\uaf48\0\uaf8f\0\uafd6"+
+    "\0\ub01d\0\ub064\0\ub0ab\0\ub0f2\0\ub139\0\ub180\0\ub1c7\0\ub20e"+
+    "\0\ub255\0\ub29c\0\ub2e3\0\ub32a\0\ub371\0\ua8e7\0\ub3b8\0\ub3ff"+
+    "\0\u0470\0\u0470\0\ub446\0\ub48d\0\ub4d4\0\ub51b\0\ub562\0\ub5a9"+
+    "\0\ub5f0\0\ub637\0\ub67e\0\uaf01\0\u0470\0\ub6c5\0\ub70c\0\ub753"+
+    "\0\u0470\0\ub79a\0\u124e\0\ub7e1\0\ub828\0\ub86f\0\ub8b6\0\ub8fd"+
+    "\0\ub3b8\0\ub944\0\ub98b\0\ub3ff\0\ub9d2\0\uba19\0\uba60\0\ubaa7"+
+    "\0\ubaee\0\ubb35\0\ubb7c\0\u0470\0\u124e\0\ubbc3\0\ubc0a\0\ubc51"+
+    "\0\ubc98\0\ubcdf\0\ubd26\0\ubd6d\0\ubdb4\0\ubdfb\0\u0470\0\ubdb4"+
+    "\0\ube42\0\ubdfb";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[826];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\11\20\2\21\1\22\13\20\1\21\5\20\1\23\51\20"+
+    "\30\24\1\25\1\26\55\24\2\27\1\30\2\27\2\30"+
+    "\1\27\1\31\1\32\1\33\1\32\1\27\1\34\6\27"+
+    "\1\30\2\27\1\32\7\27\25\30\4\27\1\30\1\27"+
+    "\3\30\6\27\1\30\5\27\1\35\2\27\2\35\1\27"+
+    "\1\36\3\37\10\27\1\35\1\27\1\36\1\37\1\27"+
+    "\1\40\3\27\1\41\1\27\25\35\4\27\1\35\1\42"+
+    "\3\35\6\27\1\35\5\27\1\35\2\27\2\35\1\27"+
+    "\1\43\3\37\10\27\1\35\1\27\1\43\1\37\1\27"+
+    "\1\40\3\27\1\44\1\27\25\35\4\27\1\35\1\42"+
+    "\3\35\6\27\1\35\13\27\4\45\4\27\1\46\5\27"+
+    "\2\45\1\27\1\47\2\27\1\50\52\27\4\51\1\52"+
+    "\3\51\1\53\1\54\1\55\1\54\1\56\1\51\1\57"+
+    "\1\51\1\60\2\51\1\61\2\51\1\53\1\54\1\62"+
+    "\1\63\1\64\3\51\1\65\36\51\1\66\1\67\1\70"+
+    "\1\71\1\72\1\73\1\74\1\75\2\51\31\76\1\77"+
+    "\1\100\1\101\1\102\1\76\1\103\50\76\2\27\1\35"+
+    "\2\27\2\35\1\27\4\104\1\27\1\105\3\27\1\106"+
+    "\2\27\1\35\1\27\2\104\7\27\25\35\4\27\1\35"+
+    "\1\27\3\35\6\27\1\35\3\27\4\107\1\110\4\107"+
+    "\1\111\1\112\1\111\13\107\1\111\2\107\1\113\54\107"+
+    "\4\51\1\52\3\51\3\114\1\115\2\51\1\116\1\117"+
+    "\6\51\2\114\2\51\1\120\3\51\1\121\45\51\1\122"+
+    "\1\51\1\123\11\124\2\125\1\126\13\124\1\125\5\124"+
+    "\1\127\51\124\10\27\1\36\2\27\1\130\1\27\1\131"+
+    "\10\27\1\36\5\27\1\132\62\27\4\133\12\27\2\133"+
+    "\57\27\2\134\1\135\2\134\2\135\15\134\1\135\12\134"+
+    "\25\135\4\134\1\135\1\134\3\135\6\134\1\135\3\134"+
+    "\11\20\2\21\1\22\13\20\1\21\57\20\107\0\11\20"+
+    "\2\21\1\22\13\20\1\21\5\20\1\136\51\20\30\24"+
+    "\1\137\1\140\105\24\1\141\1\142\105\24\1\143\1\144"+
+    "\55\24\1\0\3\30\1\0\3\30\14\0\4\30\7\0"+
+    "\32\30\1\0\3\30\6\0\1\30\13\0\1\31\4\0"+
+    "\1\34\104\0\1\32\103\0\1\34\77\0\3\35\1\0"+
+    "\3\35\14\0\4\35\7\0\32\35\1\0\3\35\6\0"+
+    "\1\35\13\0\1\36\15\0\1\36\71\0\3\37\13\0"+
+    "\1\37\107\0\1\145\1\146\57\0\1\147\2\0\1\147"+
+    "\1\150\15\0\1\147\11\0\1\151\1\152\1\153\1\154"+
+    "\4\147\1\155\1\156\1\157\1\160\1\147\1\161\1\162"+
+    "\1\163\1\147\1\164\1\147\1\165\1\166\1\147\1\167"+
+    "\1\170\1\171\1\0\1\147\1\0\3\147\6\0\1\147"+
+    "\13\0\1\42\15\0\1\42\70\0\1\43\15\0\1\43"+
+    "\6\0\1\172\53\0\1\147\2\0\1\173\1\150\15\0"+
+    "\1\147\10\0\1\174\1\151\1\152\1\153\1\154\4\147"+
+    "\1\155\1\156\1\157\1\160\1\147\1\161\1\175\1\163"+
+    "\1\147\1\164\1\147\1\165\1\166\1\147\1\167\1\170"+
+    "\1\171\1\0\1\147\1\0\3\147\6\0\1\147\13\0"+
+    "\4\45\4\0\1\46\5\0\2\45\1\0\1\176\2\0"+
+    "\1\50\72\0\1\177\116\0\1\200\1\201\55\0\3\202"+
+    "\1\203\1\202\1\204\1\205\1\206\3\202\1\0\24\202"+
+    "\1\207\1\210\1\202\1\211\3\202\1\212\7\202\1\213"+
+    "\4\202\1\203\1\202\1\206\1\203\17\202\10\0\1\53"+
+    "\3\214\1\56\1\0\1\57\4\0\1\61\2\0\1\53"+
+    "\1\214\1\62\1\63\1\64\3\0\1\215\36\0\1\66"+
+    "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\12\0"+
+    "\4\214\1\56\1\0\1\57\4\0\1\61\2\0\2\214"+
+    "\1\62\1\63\1\64\3\0\1\215\36\0\1\66\1\67"+
+    "\1\70\1\71\1\72\1\73\1\74\1\75\12\0\3\214"+
+    "\1\54\1\56\1\0\1\57\4\0\1\61\2\0\2\214"+
+    "\1\62\1\63\1\64\3\0\1\215\36\0\1\66\1\67"+
+    "\1\70\1\71\1\72\1\73\1\74\1\75\107\0\1\216"+
+    "\21\0\1\217\116\0\1\220\1\201\56\0\1\221\1\222"+
+    "\1\221\1\0\2\222\1\221\1\223\13\0\1\222\1\0"+
+    "\1\223\10\0\25\222\4\221\1\222\1\0\3\222\6\0"+
+    "\1\222\13\0\1\224\1\225\1\226\1\225\12\0\1\224"+
+    "\1\225\57\0\31\76\1\227\1\230\1\231\1\0\1\76"+
+    "\1\0\100\76\1\232\1\233\55\76\4\230\1\234\4\230"+
+    "\3\0\13\230\1\0\2\230\1\76\54\230\4\235\1\236"+
+    "\4\235\3\0\13\235\1\0\3\235\1\0\53\235\10\0"+
+    "\4\104\12\0\2\104\67\0\4\106\12\0\2\106\57\0"+
+    "\4\107\1\0\4\107\3\0\13\107\1\0\2\107\1\0"+
+    "\54\107\3\237\1\240\1\237\1\241\1\242\1\243\3\237"+
+    "\1\0\16\237\1\244\5\237\1\245\1\246\1\237\1\247"+
+    "\3\237\1\250\7\237\1\251\4\237\1\240\1\237\1\243"+
+    "\1\240\17\237\13\0\1\111\103\0\4\252\2\0\1\253"+
+    "\7\0\2\252\61\0\1\254\2\0\2\254\15\0\1\254"+
+    "\12\0\25\254\4\0\1\254\1\0\3\254\6\0\1\254"+
+    "\22\0\1\255\67\0\11\256\2\125\1\126\13\256\1\125"+
+    "\70\256\2\125\1\126\13\256\1\125\4\256\1\257\2\256"+
+    "\1\260\6\256\1\261\1\256\1\262\36\256\1\0\1\263"+
+    "\1\0\1\263\3\0\1\263\1\264\15\0\1\264\35\0"+
+    "\4\263\27\0\4\133\12\0\2\133\60\0\3\135\1\0"+
+    "\3\135\1\265\13\0\4\135\7\0\32\135\1\0\3\135"+
+    "\6\0\1\135\3\0\13\136\1\266\73\136\30\24\1\137"+
+    "\1\0\105\24\1\0\1\140\55\24\11\146\2\267\1\270"+
+    "\13\146\1\267\57\146\1\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\271"+
+    "\30\147\1\0\3\147\6\0\1\147\3\0\11\151\2\272"+
+    "\1\273\13\151\1\272\57\151\1\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\1\147\1\274\15\147\1\275\4\147"+
+    "\1\276\5\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\5\147\1\277\24\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\3\147\1\300\5\147\1\301\2\147"+
+    "\1\302\15\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\1\303\2\147\14\0\4\147\7\0\5\147\1\304"+
+    "\24\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\1\147\1\305\1\147\14\0\4\147\7\0\1\306\31\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\11\147\1\307\20\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\1\310\31\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\20\147\1\311"+
+    "\1\147\1\312\7\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\2\147\1\313"+
+    "\3\147\1\314\7\147\1\315\13\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\1\147\1\316\1\147\14\0"+
+    "\4\147\7\0\2\147\1\317\1\320\1\147\1\321\4\147"+
+    "\1\322\1\147\1\323\15\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\1\147\1\324\1\147\14\0\4\147"+
+    "\7\0\11\147\1\325\20\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\1\147\1\326\1\147\14\0\4\147"+
+    "\7\0\14\147\1\327\15\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+
+    "\1\330\22\147\1\0\3\147\6\0\1\147\62\0\1\331"+
+    "\106\0\1\332\116\0\1\333\20\0\3\147\1\0\3\147"+
+    "\1\334\13\0\2\147\1\335\1\147\7\0\15\147\1\336"+
+    "\14\147\1\0\3\147\6\0\1\147\3\0\11\174\3\0"+
+    "\13\174\1\0\57\174\1\0\3\147\1\0\3\147\1\337"+
+    "\13\0\2\147\1\340\1\147\7\0\2\147\1\341\3\147"+
+    "\1\314\7\147\1\315\13\147\1\0\3\147\6\0\1\147"+
+    "\75\0\1\342\14\0\11\201\3\0\13\201\1\0\57\201"+
+    "\3\0\1\343\3\0\1\343\54\0\1\343\1\0\2\343"+
+    "\20\0\3\344\3\0\1\344\36\0\2\344\3\0\1\344"+
+    "\1\0\1\344\1\0\1\344\2\0\1\344\1\0\4\344"+
+    "\2\0\1\344\1\0\1\344\13\0\3\345\3\0\1\345"+
+    "\36\0\2\345\3\0\1\345\1\0\1\345\1\0\1\345"+
+    "\2\0\1\345\1\0\4\345\2\0\1\345\1\0\1\345"+
+    "\15\0\1\203\3\0\1\203\54\0\1\203\1\0\2\203"+
+    "\25\0\1\346\42\0\1\347\6\0\1\350\1\0\1\351"+
+    "\116\0\1\352\15\0\1\221\1\0\1\221\3\0\1\221"+
+    "\54\0\4\221\20\0\3\222\1\0\3\222\1\353\13\0"+
+    "\4\222\4\0\1\354\2\0\32\222\1\0\3\222\6\0"+
+    "\1\222\16\0\1\355\73\0\30\232\1\356\56\232\11\233"+
+    "\2\357\1\76\13\233\1\357\57\233\11\230\3\0\13\230"+
+    "\1\0\57\230\33\0\1\76\53\0\3\235\1\360\1\361"+
+    "\1\235\1\362\1\363\1\235\3\0\13\235\1\0\34\235"+
+    "\1\360\1\235\1\363\1\360\17\235\3\0\1\364\3\0"+
+    "\1\364\54\0\1\364\1\0\2\364\20\0\3\365\3\0"+
+    "\1\365\36\0\2\365\3\0\1\365\1\0\1\365\1\0"+
+    "\1\365\2\0\1\365\1\0\4\365\2\0\1\365\1\0"+
+    "\1\365\13\0\3\366\3\0\1\366\36\0\2\366\3\0"+
+    "\1\366\1\0\1\366\1\0\1\366\2\0\1\366\1\0"+
+    "\4\366\2\0\1\366\1\0\1\366\15\0\1\240\3\0"+
+    "\1\240\54\0\1\240\1\0\2\240\20\0\3\254\1\0"+
+    "\3\254\14\0\4\254\4\0\1\367\2\0\32\254\1\0"+
+    "\3\254\6\0\1\254\3\0\11\257\2\370\1\371\13\257"+
+    "\1\370\57\257\11\256\2\125\1\126\13\256\1\125\10\256"+
+    "\1\372\57\256\2\125\1\126\13\256\1\125\14\256\1\373"+
+    "\53\256\2\125\1\126\13\256\1\125\20\256\1\374\36\256"+
+    "\1\0\1\263\1\0\1\263\3\0\1\263\54\0\4\263"+
+    "\27\0\1\265\15\0\1\265\61\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\1\375\31\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\1\376\1\147\1\377\13\147\1\u0100\13\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\22\147\1\u0101\7\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+
+    "\1\u0102\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0103\27\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\4\147\1\u0104\25\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\22\147\1\u0105\7\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\20\147"+
+    "\1\u0106\11\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0107\27\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\10\147\1\u0108\21\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\1\147\1\u0109\10\147\1\u010a\17\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\1\147\1\u010b\30\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+
+    "\1\u010c\2\147\1\u010d\17\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+
+    "\1\u010e\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\15\147\1\u010f\14\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\1\u0110\31\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\14\147\1\u0111\15\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\1\u0112\31\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\14\147\1\u0113\15\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\22\147\1\u0114\7\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+
+    "\1\u0115\24\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0116\15\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\12\147\1\u0117\17\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\14\147\1\u0118\15\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+
+    "\1\u0119\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\10\147\1\u011a\21\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\14\147\1\u011b\15\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\20\147\1\u011c\11\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+
+    "\1\u011d\13\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\20\147\1\u011e\11\147"+
+    "\1\0\3\147\6\0\1\147\42\0\1\u011f\106\0\1\u0120"+
+    "\126\0\1\u0121\37\0\1\334\15\0\1\334\61\0\3\147"+
+    "\1\0\3\147\1\334\13\0\2\147\1\335\1\147\7\0"+
+    "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\2\147\1\u0122\27\147\1\0"+
+    "\3\147\6\0\1\147\13\0\1\337\15\0\1\337\61\0"+
+    "\3\147\1\0\3\147\1\337\13\0\2\147\1\340\1\147"+
+    "\7\0\32\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0123\15\147"+
+    "\1\0\3\147\6\0\1\147\76\0\1\u0124\14\0\3\u0125"+
+    "\3\0\1\u0125\36\0\2\u0125\3\0\1\u0125\1\0\1\u0125"+
+    "\1\0\1\u0125\2\0\1\u0125\1\0\4\u0125\2\0\1\u0125"+
+    "\1\0\1\u0125\13\0\3\u0126\3\0\1\u0126\36\0\2\u0126"+
+    "\3\0\1\u0126\1\0\1\u0126\1\0\1\u0126\2\0\1\u0126"+
+    "\1\0\4\u0126\2\0\1\u0126\1\0\1\u0126\73\0\1\u0127"+
+    "\71\0\1\u0128\1\0\1\u0129\111\0\1\u012a\74\0\1\u012b"+
+    "\142\0\1\u012c\23\0\1\353\15\0\1\353\5\0\1\354"+
+    "\52\0\30\232\1\356\1\76\55\232\13\357\1\76\15\357"+
+    "\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\50\357\3\0"+
+    "\1\235\3\0\1\235\23\0\1\76\30\0\1\235\1\0"+
+    "\2\235\23\0\1\u0130\1\0\1\u0131\24\0\1\76\54\0"+
+    "\3\u0132\3\0\1\u0132\23\0\1\76\12\0\2\u0132\3\0"+
+    "\1\u0132\1\0\1\u0132\1\0\1\u0132\2\0\1\u0132\1\0"+
+    "\4\u0132\2\0\1\u0132\1\0\1\u0132\15\0\1\360\3\0"+
+    "\1\360\23\0\1\76\30\0\1\360\1\0\2\360\20\0"+
+    "\3\u0133\3\0\1\u0133\36\0\2\u0133\3\0\1\u0133\1\0"+
+    "\1\u0133\1\0\1\u0133\2\0\1\u0133\1\0\4\u0133\2\0"+
+    "\1\u0133\1\0\1\u0133\13\0\3\u0134\3\0\1\u0134\36\0"+
+    "\2\u0134\3\0\1\u0134\1\0\1\u0134\1\0\1\u0134\2\0"+
+    "\1\u0134\1\0\4\u0134\2\0\1\u0134\1\0\1\u0134\12\0"+
+    "\11\256\2\125\1\126\13\256\1\125\7\256\1\u0135\60\256"+
+    "\2\125\1\126\13\256\1\125\17\256\1\u0136\50\256\2\125"+
+    "\1\126\13\256\1\125\21\256\1\u0137\35\256\1\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\16\147\1\u0138\13\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\2\147\1\u0139\27\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\6\147\1\u013a\1\u013b\22\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\12\147\1\u013c\17\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u013d"+
+    "\17\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\5\147\1\u013e\24\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\1\147\1\u013f"+
+    "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\5\147\1\u0140\24\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\7\147\1\u0141"+
+    "\22\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\12\147\1\u0142\17\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\7\147\1\u0143\22\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\6\0"+
+    "\1\151\2\147\1\u0144\10\147\1\u0145\2\147\1\u0146\13\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\16\147\1\u0147\13\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\12\147\1\u0148\17\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\14\147"+
+    "\1\u0149\15\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\5\147\1\u014a\24\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\7\147\1\u014b\22\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\7\147\1\u014c\22\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+
+    "\1\u014d\27\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\22\147\1\u014e\7\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\1\147\1\u014f\30\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\2\147\1\u0150\27\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+
+    "\1\u0151\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0152\5\147"+
+    "\1\u0153\6\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\4\147\1\u0154\25\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\4\147\1\u0155\25\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\1\147\1\u0156\1\147"+
+    "\14\0\4\147\7\0\32\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+
+    "\1\u0157\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\7\147\1\u0158\22\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\10\147\1\u0159\21\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\16\147\1\u015a\13\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\12\147"+
+    "\1\u015b\17\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\31\147\1\u015c\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\1\147\1\u015d"+
+    "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+
+    "\1\147\44\0\1\u015e\106\0\1\u015f\104\0\1\u0160\50\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\14\147\1\u0161"+
+    "\15\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\1\147\1\u014f\1\u0162\27\147"+
+    "\1\0\3\147\6\0\1\147\77\0\1\u0163\13\0\3\u0164"+
+    "\3\0\1\u0164\36\0\2\u0164\3\0\1\u0164\1\0\1\u0164"+
+    "\1\0\1\u0164\2\0\1\u0164\1\0\4\u0164\2\0\1\u0164"+
+    "\1\0\1\u0164\73\0\1\u0165\72\0\1\u0166\102\0\1\u0167"+
+    "\113\0\1\u0168\123\0\1\u0169\117\0\1\u016a\12\0\13\357"+
+    "\1\76\14\357\1\u016b\1\233\55\357\4\u012e\1\u016c\4\u012e"+
+    "\2\357\1\76\13\u012e\1\357\2\u012e\1\357\54\u012e\4\u016d"+
+    "\1\u016e\4\u016d\2\357\1\76\13\u016d\1\357\3\u016d\1\233"+
+    "\53\u016d\4\0\1\u0130\1\0\1\u0131\101\0\3\u0132\3\0"+
+    "\1\u0132\36\0\2\u0132\3\0\1\u0132\1\0\1\u0132\1\0"+
+    "\1\u0132\2\0\1\u0132\1\0\4\u0132\2\0\1\u0132\1\0"+
+    "\1\u0132\13\0\3\u016f\3\0\1\u016f\36\0\2\u016f\3\0"+
+    "\1\u016f\1\0\1\u016f\1\0\1\u016f\2\0\1\u016f\1\0"+
+    "\4\u016f\2\0\1\u016f\1\0\1\u016f\13\0\3\u0170\3\0"+
+    "\1\u0170\36\0\2\u0170\3\0\1\u0170\1\0\1\u0170\1\0"+
+    "\1\u0170\2\0\1\u0170\1\0\4\u0170\2\0\1\u0170\1\0"+
+    "\1\u0170\12\0\11\256\2\125\1\126\13\256\1\125\11\256"+
+    "\1\u0171\56\256\2\125\1\126\13\256\1\125\4\256\1\u0172"+
+    "\4\256\1\u0173\10\256\1\u0174\45\256\2\125\1\126\13\256"+
+    "\1\125\16\256\1\u0175\40\256\1\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\5\147\1\u0176\24\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\6\0\1\151\2\147\1\u0177\27\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\4\147\1\u0178\25\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\24\147\1\u0179"+
+    "\5\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\1\147\1\u017a\1\147\14\0\4\147\7\0\32\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\7\147\1\u017b\22\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\4\147\1\u017c\25\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u017d"+
+    "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\6\147\1\u017e\23\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\u017f"+
+    "\13\0\2\147\1\u0180\1\147\7\0\32\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\7\147\1\u0181\22\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+
+    "\1\u0182\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\3\147\1\u0183\26\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\14\147\1\u0184\15\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\12\147\1\u0185\17\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+
+    "\1\u0186\27\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\12\147\1\u0187\17\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\10\147\1\u0188\21\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\1\u0189\2\147\14\0"+
+    "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u018a"+
+    "\25\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\4\147\1\u018b\25\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\23\147\1\u018c\6\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\16\147\1\u018d\13\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\7\147\1\u018e"+
+    "\22\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\11\147\1\u018f\20\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\7\147\1\u0190\22\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\14\147\1\u0191\15\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\17\147\1\u0192"+
+    "\12\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\15\147\1\u0193\14\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\12\147\1\u0194\17\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\7\147\1\u0195\22\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\16\147\1\u0196"+
+    "\13\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\1\u0197\31\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\24\147\1\u0198\5\147\1\0\3\147\6\0\1\147"+
+    "\44\0\1\u0199\46\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\2\147\1\u019a\27\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+
+    "\1\u019b\22\147\1\0\3\147\6\0\1\147\24\0\1\u019c"+
+    "\133\0\1\u019d\106\0\1\u019e\101\0\1\u019f\106\0\1\u01a0"+
+    "\104\0\1\u01a1\70\0\1\u01a2\65\0\11\u016b\2\u01a3\1\u01a4"+
+    "\13\u016b\1\u01a3\1\u01a5\56\u016b\11\u012e\2\357\1\76\13\u012e"+
+    "\1\357\57\u012e\11\233\2\357\1\76\13\233\1\357\3\233"+
+    "\1\357\53\233\3\u016d\1\u01a6\1\u01a7\1\u016d\1\u01a8\1\u01a9"+
+    "\1\u016d\2\357\1\76\13\u016d\1\357\34\u016d\1\u01a6\1\u016d"+
+    "\1\u01a9\1\u01a6\17\u016d\1\0\3\u01aa\3\0\1\u01aa\36\0"+
+    "\2\u01aa\3\0\1\u01aa\1\0\1\u01aa\1\0\1\u01aa\2\0"+
+    "\1\u01aa\1\0\4\u01aa\2\0\1\u01aa\1\0\1\u01aa\12\0"+
+    "\11\256\2\125\1\126\13\256\1\125\4\256\1\u01ab\4\256"+
+    "\1\u01ac\45\256\11\u0172\2\u01ad\1\u01ae\13\u0172\1\u01ad\57\u0172"+
+    "\11\256\2\125\1\126\13\256\1\125\12\256\1\u01af\55\256"+
+    "\2\125\1\126\13\256\1\125\23\256\1\u01b0\40\256\1\u01b1"+
+    "\3\256\2\125\1\126\13\256\1\125\57\256\1\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b2\6\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\3\147\1\u01b3\26\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\14\147\1\u01b4\15\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+
+    "\1\u01b5\22\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b6\6\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\17\147\1\u01b7\12\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\7\147\1\u01b8\22\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\u01b9"+
+    "\31\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\15\147\1\u01ba\14\147\1\0"+
+    "\3\147\6\0\1\147\5\0\1\u01bb\2\0\2\u01bb\1\0"+
+    "\1\u017f\7\0\1\u01bc\3\0\1\u01bb\1\0\1\u017f\10\0"+
+    "\25\u01bb\4\0\1\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0"+
+    "\1\147\1\u01bb\1\147\1\0\2\u01bb\1\147\1\u017f\7\0"+
+    "\1\u01bc\3\0\1\u01bb\1\147\1\u0180\1\147\7\0\25\u01bb"+
+    "\4\147\1\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01bd\6\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\4\147\1\u01be\25\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\12\147\1\u01bf\17\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+
+    "\1\u01c0\24\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\1\u01c1\31\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\2\147\1\u01c2\27\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\14\147\1\u01c3\15\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\1\u01c4\31\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\14\147\1\u01c5\15\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\3\147\1\u01c6\26\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+
+    "\1\u01c7\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\17\147\1\u01c8\12\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\20\147\1\u01c9\11\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\4\147\1\u01ca\25\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+
+    "\1\u01cb\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\1\u01cc\13\0\2\147\1\u01cd\1\147\7\0"+
+    "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\7\147\1\u01ce\22\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\4\147\1\u01cf\25\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\21\147\1\u01d0\10\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\16\147\1\u01d1"+
+    "\13\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\7\147\1\u01d2\22\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\337"+
+    "\13\0\2\147\1\340\1\147\7\0\15\147\1\u01d3\14\147"+
+    "\1\0\3\147\6\0\1\147\24\0\1\u01d4\130\0\1\u01d5"+
+    "\106\0\1\u01d6\111\0\1\u01d7\101\0\1\u01d8\106\0\1\u01d9"+
+    "\66\0\1\u01da\65\0\13\u01a3\1\u01a4\14\u01a3\1\u01db\1\u01dc"+
+    "\1\u01dd\1\u01de\1\u016b\1\u01a3\1\u016b\50\u01a3\30\u01a4\1\u01df"+
+    "\1\u01e0\1\u01e1\1\u01e2\1\232\1\u01a4\1\232\50\u01a4\11\u016b"+
+    "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\1\357\55\u016b\3\233"+
+    "\1\u016d\3\233\1\u016d\1\233\2\357\1\76\13\233\1\357"+
+    "\3\233\1\357\30\233\1\u016d\1\233\2\u016d\23\233\1\u01e3"+
+    "\1\233\1\u01e4\2\233\2\357\1\76\13\233\1\357\3\233"+
+    "\1\357\54\233\3\u01e5\3\233\1\u01e5\1\233\2\357\1\76"+
+    "\13\233\1\357\3\233\1\357\12\233\2\u01e5\3\233\1\u01e5"+
+    "\1\233\1\u01e5\1\233\1\u01e5\2\233\1\u01e5\1\233\4\u01e5"+
+    "\2\233\1\u01e5\1\233\1\u01e5\15\233\1\u01a6\3\233\1\u01a6"+
+    "\1\233\2\357\1\76\13\233\1\357\3\233\1\357\30\233"+
+    "\1\u01a6\1\233\2\u01a6\17\233\1\0\3\235\3\0\1\235"+
+    "\36\0\2\235\3\0\1\235\1\0\1\235\1\0\1\235"+
+    "\2\0\1\235\1\0\4\235\2\0\1\235\1\0\1\235"+
+    "\12\0\11\u01ab\2\u01e6\1\u01e7\13\u01ab\1\u01e6\57\u01ab\11\256"+
+    "\2\125\1\126\13\256\1\125\12\256\1\u01e8\55\256\2\125"+
+    "\1\126\13\256\1\125\13\256\1\u01e9\54\256\2\125\1\126"+
+    "\13\256\1\125\21\256\1\u01ea\46\256\2\125\1\126\13\256"+
+    "\1\125\11\256\1\u01eb\45\256\1\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\7\147\1\u01ec\22\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\4\147\1\u01ed\25\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\22\147"+
+    "\1\u01ee\7\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\4\147\1\u01ef\25\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\7\147\1\u01f0\22\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\7\147\1\u01f1\22\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+
+    "\1\u01f2\13\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\1\u01f3\2\147\14\0\4\147\7\0\32\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\u01f4"+
+    "\13\0\2\147\1\u01f5\1\147\7\0\32\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\u01bb\1\0\3\u01bb\1\u01f6\3\0"+
+    "\1\u01f7\1\0\1\u01f8\1\0\1\u01f9\3\0\4\u01bb\7\0"+
+    "\32\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0\3\u01fa\1\0"+
+    "\4\u01fa\3\0\2\u01fa\2\0\10\u01fa\7\0\32\u01fa\1\0"+
+    "\3\u01fa\6\0\1\u01fa\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\15\147\1\u01fb\14\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\5\147\1\u01fc\24\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\6\0\1\151\32\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\15\147\1\u01fd\14\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\5\147\1\u01fe\24\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\3\147"+
+    "\1\u01ff\26\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\16\147\1\u0200\13\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\13\147\1\u0201\16\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\12\147\1\u0202\17\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+
+    "\1\u0203\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\1\u0204\13\0\2\147\1\u0205\1\147\7\0"+
+    "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\1\147\1\u0206\1\147\14\0\4\147\7\0\32\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\24\147\1\u0207\5\147\1\0\3\147\6\0"+
+    "\1\147\5\0\1\u0208\2\0\2\u0208\1\0\1\u01cc\13\0"+
+    "\1\u0208\1\0\1\u01cc\10\0\25\u0208\4\0\1\u0208\1\0"+
+    "\3\u0208\6\0\1\u0208\4\0\1\147\1\u0208\1\147\1\0"+
+    "\2\u0208\1\147\1\u01cc\13\0\1\u0208\1\147\1\u01cd\1\147"+
+    "\7\0\25\u0208\4\147\1\u0208\1\0\3\u0208\6\0\1\u0208"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+
+    "\1\u0209\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\1\u020a\13\0\2\147\1\u020b\1\147\7\0"+
+    "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\1\334\13\0\2\147\1\335\1\147\7\0\15\147"+
+    "\1\u020c\14\147\1\0\3\147\6\0\1\147\13\0\4\u01d4"+
+    "\12\0\2\u01d4\6\0\1\u020d\125\0\1\u020e\106\0\1\u020f"+
+    "\74\0\1\u0210\111\0\1\u0211\145\0\1\u0212\11\0\4\u0213"+
+    "\12\0\2\u0213\57\0\13\u01a3\1\u01a4\14\u01a3\1\u01db\1\u0214"+
+    "\1\u01dd\1\u01de\1\u016b\1\u01a3\1\u016b\63\u01a3\1\u01a4\14\u01a3"+
+    "\1\u0215\1\u016b\55\u01a3\4\u01dd\1\u0216\4\u01dd\2\u01a3\1\u01a4"+
+    "\13\u01dd\1\u01a3\1\u0217\1\u01dd\1\u01a3\54\u01dd\4\u0218\1\u0219"+
+    "\4\u0218\2\u01a3\1\u01a4\13\u0218\1\u01a3\1\u021a\2\u0218\1\u016b"+
+    "\53\u0218\30\u01a4\1\u01df\1\u021b\1\u01e1\1\u01e2\1\232\1\u01a4"+
+    "\1\232\100\u01a4\1\u021c\1\u016b\55\u01a4\4\u01e1\1\u021d\4\u01e1"+
+    "\3\232\13\u01e1\1\232\1\u021e\1\u01e1\1\u01a4\54\u01e1\4\u021f"+
+    "\1\u0220\4\u021f\3\232\13\u021f\1\232\1\u0221\2\u021f\1\232"+
+    "\53\u021f\4\233\1\u01e3\1\233\1\u01e4\2\233\2\357\1\76"+
+    "\13\233\1\357\60\233\3\u01e5\3\233\1\u01e5\1\233\2\357"+
+    "\1\76\13\233\1\357\16\233\2\u01e5\3\233\1\u01e5\1\233"+
+    "\1\u01e5\1\233\1\u01e5\2\233\1\u01e5\1\233\4\u01e5\2\233"+
+    "\1\u01e5\1\233\1\u01e5\13\233\3\u0222\3\233\1\u0222\1\233"+
+    "\2\357\1\76\13\233\1\357\16\233\2\u0222\3\233\1\u0222"+
+    "\1\233\1\u0222\1\233\1\u0222\2\233\1\u0222\1\233\4\u0222"+
+    "\2\233\1\u0222\1\233\1\u0222\12\233\11\256\2\125\1\126"+
+    "\13\256\1\125\13\256\1\u0223\54\256\2\125\1\126\13\256"+
+    "\1\125\14\256\1\u0224\53\256\2\125\1\126\13\256\1\125"+
+    "\4\256\1\u0225\63\256\2\125\1\126\13\256\1\125\12\256"+
+    "\1\u0226\44\256\1\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\5\147\1\u0227\24\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\1\u0228\13\0\2\147\1\u0228"+
+    "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0229"+
+    "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\14\147\1\u022a\15\147\1\0"+
+    "\3\147\6\0\1\147\3\0\2\u022b\1\u022c\2\u022b\2\u022c"+
+    "\1\u022b\1\u01f4\3\0\10\u022b\1\u022c\1\u022b\1\u01f4\1\0"+
+    "\7\u022b\25\u022c\4\u022b\1\u022c\1\u022b\3\u022c\6\u022b\1\u022c"+
+    "\4\u022b\1\u022d\1\u022c\1\u022d\1\u022b\2\u022c\1\u022d\1\u01f4"+
+    "\3\0\10\u022b\1\u022c\1\u022d\1\u01f5\1\147\7\u022b\25\u022c"+
+    "\4\u022d\1\u022c\1\u022b\3\u022c\6\u022b\1\u022c\3\u022b\10\0"+
+    "\1\u01f6\3\0\1\u01f7\1\0\1\u01f8\1\0\1\u01f9\5\0"+
+    "\1\u01f6\62\0\1\u01bb\2\0\2\u01bb\1\0\1\u01f7\13\0"+
+    "\1\u01bb\1\0\1\u01f7\10\0\25\u01bb\4\0\1\u01bb\1\0"+
+    "\3\u01bb\6\0\1\u01bb\13\0\1\u01f8\6\0\1\u022e\6\0"+
+    "\1\u01f8\61\0\3\u022f\1\0\4\u022f\3\0\2\u022f\2\0"+
+    "\10\u022f\7\0\32\u022f\1\0\3\u022f\6\0\1\u022f\4\0"+
+    "\3\u01fa\1\0\4\u01fa\3\0\2\u01fa\2\0\1\u01fa\1\u0230"+
+    "\6\u01fa\7\0\32\u01fa\1\0\3\u01fa\6\0\1\u01fa\4\0"+
+    "\3\147\1\0\3\147\1\u0231\13\0\2\147\1\u0232\1\147"+
+    "\7\0\32\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\6\147\1\u0233\23\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\7\147\1\u0234\22\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\1\147\1\u0235\30\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+
+    "\1\u0236\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0237\27\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\14\147\1\u0238\15\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\5\147\1\u0239\24\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+
+    "\1\u023a\24\147\1\0\3\147\6\0\1\147\3\0\2\u023b"+
+    "\1\u023c\2\u023b\2\u023c\1\u023b\1\u0204\3\0\10\u023b\1\u023c"+
+    "\1\u023b\1\u0204\1\0\7\u023b\25\u023c\4\u023b\1\u023c\1\u023b"+
+    "\3\u023c\6\u023b\1\u023c\4\u023b\1\u023d\1\u023c\1\u023d\1\u023b"+
+    "\2\u023c\1\u023d\1\u0204\3\0\10\u023b\1\u023c\1\u023d\1\u0205"+
+    "\1\147\7\u023b\25\u023c\4\u023d\1\u023c\1\u023b\3\u023c\6\u023b"+
+    "\1\u023c\3\u023b\1\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\24\147\1\u023e\5\147\1\0\3\147\6\0\1\147"+
+    "\4\0\3\147\1\0\3\147\1\u023f\13\0\2\147\1\u0240"+
+    "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\u0208\1\0\3\u0208\1\u0241\7\0\1\u0242\3\0\4\u0208"+
+    "\7\0\32\u0208\1\0\3\u0208\6\0\1\u0208\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0243\14\147"+
+    "\1\0\3\147\6\0\1\147\3\0\1\u0244\1\u0245\1\u0244"+
+    "\1\u0245\3\u0244\1\u0245\1\u020a\3\0\12\u0244\1\u020a\1\0"+
+    "\34\u0244\4\u0245\20\u0244\1\u0246\1\u0247\1\u0246\1\u0244\2\u0247"+
+    "\1\u0246\1\u020a\3\0\10\u0244\2\u0247\1\u020b\1\147\7\u0244"+
+    "\25\u0247\4\u0246\1\u0247\1\u0244\3\u0247\6\u0244\1\u0247\3\u0244"+
+    "\53\0\1\u0248\106\0\1\u0249\140\0\1\u024a\44\0\1\u024b"+
+    "\62\0\1\u024c\77\0\4\u0213\12\0\2\u0213\6\0\1\u024d"+
+    "\50\0\13\357\1\76\14\357\1\u01a3\1\u012d\1\u024e\1\u024f"+
+    "\53\357\11\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\1\u01a3"+
+    "\55\u016b\11\u01dd\2\u01a3\1\u01a4\13\u01dd\1\u01a3\1\u0217\62\u01dd"+
+    "\1\u0216\4\u01dd\2\u01a3\1\u01a4\13\u01dd\1\u01a3\1\u0217\1\u024e"+
+    "\1\u01a3\54\u01dd\11\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5"+
+    "\2\u016b\1\u01a3\53\u016b\3\u0218\1\u0250\1\u0251\1\u0218\1\u0252"+
+    "\1\u0253\1\u0218\2\u01a3\1\u01a4\13\u0218\1\u01a3\1\u021a\33\u0218"+
+    "\1\u0250\1\u0218\1\u0253\1\u0250\17\u0218\11\u016b\2\u01a3\1\u01a4"+
+    "\13\u016b\1\u01a3\1\u01a5\1\357\1\u016b\1\u01a3\53\u016b\30\76"+
+    "\1\u01a4\1\u012d\1\u0254\1\u0255\53\76\30\232\1\356\1\u01a4"+
+    "\55\232\11\u01e1\3\232\13\u01e1\1\232\1\u021e\62\u01e1\1\u021d"+
+    "\4\u01e1\3\232\13\u01e1\1\232\1\u021e\1\u0254\1\u01a4\54\u01e1"+
+    "\30\232\1\356\2\232\1\u01a4\53\232\3\u021f\1\u0256\1\u0257"+
+    "\1\u021f\1\u0258\1\u0259\1\u021f\3\232\13\u021f\1\232\1\u0221"+
+    "\33\u021f\1\u0256\1\u021f\1\u0259\1\u0256\17\u021f\30\232\1\356"+
+    "\1\76\1\232\1\u01a4\53\232\1\233\3\u025a\3\233\1\u025a"+
+    "\1\233\2\357\1\76\13\233\1\357\16\233\2\u025a\3\233"+
+    "\1\u025a\1\233\1\u025a\1\233\1\u025a\2\233\1\u025a\1\233"+
+    "\4\u025a\2\233\1\u025a\1\233\1\u025a\12\233\11\256\2\125"+
+    "\1\126\13\256\1\125\14\256\1\u025b\53\256\2\125\1\126"+
+    "\13\256\1\125\15\256\1\u025c\41\256\11\u0225\2\u025d\1\u025e"+
+    "\13\u0225\1\u025d\57\u0225\11\256\2\125\1\126\13\256\1\125"+
+    "\13\256\1\u025f\43\256\1\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\6\147\1\u0260\23\147\1\0\3\147\6\0"+
+    "\1\147\3\0\13\u0228\1\0\73\u0228\1\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\2\147\1\u0261\27\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\15\147\1\u0262\14\147\1\0\3\147\6\0"+
+    "\1\147\3\0\11\u022b\3\0\13\u022b\1\0\60\u022b\3\u022c"+
+    "\1\u022b\3\u022c\1\u0263\3\0\2\u01f4\6\u022b\3\u022c\1\u0264"+
+    "\7\u022b\32\u022c\1\u022b\3\u022c\6\u022b\1\u022c\4\u022b\3\u022d"+
+    "\1\u022b\3\u022d\1\u022b\3\0\10\u022b\3\u022d\1\147\7\u022b"+
+    "\32\u022d\1\u022b\3\u022d\6\u022b\1\u022d\3\u022b\10\0\1\u022e"+
+    "\5\0\1\u01f8\7\0\1\u022e\61\0\3\u022f\1\0\4\u022f"+
+    "\3\0\2\u022f\2\0\1\u022f\1\u0265\6\u022f\7\0\32\u022f"+
+    "\1\0\3\u022f\6\0\1\u022f\4\0\1\u01fa\1\u0266\1\u01fa"+
+    "\1\0\2\u0266\1\u01fa\1\u0230\3\0\2\u01fa\2\0\1\u01fa"+
+    "\1\u0230\2\u01fa\1\u0266\1\u01fa\1\u0230\1\u01fa\7\0\25\u0266"+
+    "\4\u01fa\1\u0266\1\0\3\u0266\6\0\1\u0266\5\0\1\u0267"+
+    "\2\0\2\u0267\1\0\1\u0231\13\0\1\u0267\1\0\1\u0231"+
+    "\10\0\25\u0267\4\0\1\u0267\1\0\3\u0267\6\0\1\u0267"+
+    "\4\0\1\147\1\u0267\1\147\1\0\2\u0267\1\147\1\u0231"+
+    "\13\0\1\u0267\1\147\1\u0232\1\147\7\0\25\u0267\4\147"+
+    "\1\u0267\1\0\3\u0267\6\0\1\u0267\4\0\3\147\1\0"+
+    "\3\147\1\u0268\13\0\2\147\1\u0269\1\147\6\0\1\151"+
+    "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\1\u026a\13\0\2\147\1\u026b\1\147\7\0\32\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\1\u026c\13\0\2\147\1\u026d\1\147\7\0\32\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\5\147\1\u026e\24\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\2\147\1\u026f\27\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0270"+
+    "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\4\147\1\u0271\25\147\1\0"+
+    "\3\147\6\0\1\147\3\0\11\u023b\3\0\13\u023b\1\0"+
+    "\60\u023b\3\u023c\1\u023b\3\u023c\1\u0272\3\0\1\u0204\7\u023b"+
+    "\3\u023c\1\u0273\7\u023b\32\u023c\1\u023b\3\u023c\6\u023b\1\u023c"+
+    "\4\u023b\3\u023d\1\u023b\3\u023d\1\u023b\3\0\10\u023b\3\u023d"+
+    "\1\147\7\u023b\32\u023d\1\u023b\3\u023d\6\u023b\1\u023d\3\u023b"+
+    "\2\0\1\u0274\2\0\2\u0274\1\0\1\u023f\7\0\1\u0275"+
+    "\3\0\1\u0274\1\0\1\u023f\10\0\25\u0274\4\0\1\u0274"+
+    "\1\0\3\u0274\6\0\1\u0274\4\0\1\147\1\u0276\1\147"+
+    "\1\0\2\u0276\1\147\1\u023f\7\0\1\u0275\3\0\1\u0276"+
+    "\1\147\1\u0240\1\147\7\0\25\u0276\4\147\1\u0276\1\0"+
+    "\3\u0276\6\0\1\u0276\13\0\1\u0241\7\0\1\u0242\5\0"+
+    "\1\u0241\61\0\3\u0277\1\0\4\u0277\3\0\2\u0277\2\0"+
+    "\10\u0277\7\0\32\u0277\1\0\3\u0277\6\0\1\u0277\3\0"+
+    "\11\u0244\3\0\13\u0244\1\0\60\u0244\1\u0245\1\u0244\1\u0245"+
+    "\3\u0244\1\u0245\1\u0278\3\0\12\u0244\1\u0278\1\0\34\u0244"+
+    "\4\u0245\20\u0244\1\u0246\1\u0247\1\u0246\1\u0244\2\u0247\1\u0246"+
+    "\1\u0278\3\0\10\u0244\2\u0247\1\u0279\1\147\7\u0244\25\u0247"+
+    "\4\u0246\1\u0247\1\u0244\3\u0247\6\u0244\1\u0247\4\u0244\3\u0247"+
+    "\1\u0244\3\u0247\1\u0244\3\0\10\u0244\3\u0247\1\147\7\u0244"+
+    "\32\u0247\1\u0244\3\u0247\6\u0244\1\u0247\3\u0244\54\0\1\u027a"+
+    "\106\0\1\u027b\51\0\1\u027c\151\0\1\u027d\22\0\1\u027e"+
+    "\1\0\4\u024e\1\u027f\4\u024e\2\357\1\76\13\u024e\1\357"+
+    "\1\u024e\1\u0280\1\u024e\1\u0281\1\u012e\1\u024e\1\u012e\50\u024e"+
+    "\4\u0282\1\u0283\4\u0282\2\357\1\76\13\u0282\1\357\1\u0282"+
+    "\1\u012d\1\u0284\1\u012f\1\u016d\1\u0282\1\u016d\50\u0282\3\u016b"+
+    "\1\u0218\3\u016b\1\u0218\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+
+    "\1\u01a5\2\u016b\1\u01a3\30\u016b\1\u0218\1\u016b\2\u0218\23\u016b"+
+    "\1\u0285\1\u016b\1\u0286\2\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+
+    "\1\u01a5\2\u016b\1\u01a3\54\u016b\3\u0287\3\u016b\1\u0287\1\u016b"+
+    "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\2\u016b\1\u01a3\12\u016b"+
+    "\2\u0287\3\u016b\1\u0287\1\u016b\1\u0287\1\u016b\1\u0287\2\u016b"+
+    "\1\u0287\1\u016b\4\u0287\2\u016b\1\u0287\1\u016b\1\u0287\15\u016b"+
+    "\1\u0250\3\u016b\1\u0250\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+
+    "\1\u01a5\2\u016b\1\u01a3\30\u016b\1\u0250\1\u016b\2\u0250\17\u016b"+
+    "\4\u0254\1\u0288\4\u0254\3\76\13\u0254\1\76\1\u0254\1\u0289"+
+    "\1\u0254\1\u028a\1\230\1\u0254\1\230\50\u0254\4\u028b\1\u028c"+
+    "\4\u028b\3\76\13\u028b\1\76\1\u028b\1\227\1\u028d\1\231"+
+    "\1\235\1\u028b\1\235\50\u028b\3\232\1\u021f\3\232\1\u021f"+
+    "\20\232\1\356\2\232\1\u01a4\30\232\1\u021f\1\232\2\u021f"+
+    "\23\232\1\u028e\1\232\1\u028f\21\232\1\356\2\232\1\u01a4"+
+    "\54\232\3\u0290\3\232\1\u0290\20\232\1\356\2\232\1\u01a4"+
+    "\12\232\2\u0290\3\232\1\u0290\1\232\1\u0290\1\232\1\u0290"+
+    "\2\232\1\u0290\1\232\4\u0290\2\232\1\u0290\1\232\1\u0290"+
+    "\15\232\1\u0256\3\232\1\u0256\20\232\1\356\2\232\1\u01a4"+
+    "\30\232\1\u0256\1\232\2\u0256\17\232\1\233\3\u016d\3\233"+
+    "\1\u016d\1\233\2\357\1\76\13\233\1\357\16\233\2\u016d"+
+    "\3\233\1\u016d\1\233\1\u016d\1\233\1\u016d\2\233\1\u016d"+
+    "\1\233\4\u016d\2\233\1\u016d\1\233\1\u016d\12\233\11\256"+
+    "\2\125\1\126\13\256\1\125\15\256\1\u0291\52\256\2\125"+
+    "\1\126\13\256\1\125\4\256\1\u0292\63\256\2\125\1\126"+
+    "\13\256\1\125\14\256\1\u0293\42\256\1\0\3\147\1\0"+
+    "\3\147\1\u0294\13\0\2\147\1\u0295\1\147\6\0\1\151"+
+    "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\15\147\1\u0296\14\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\7\147\1\u0243\22\147\1\0\3\147\6\0"+
+    "\1\147\3\0\10\u022b\1\u0263\3\0\2\u01f4\10\u022b\1\u0263"+
+    "\1\0\57\u022b\1\0\3\u0264\1\0\3\u0264\1\u0297\3\0"+
+    "\2\u0298\6\0\4\u0264\7\0\32\u0264\1\0\3\u0264\6\0"+
+    "\1\u0264\4\0\3\u022f\1\0\3\u022f\1\u0265\3\0\2\u022f"+
+    "\1\u01f8\1\0\1\u022f\1\u0265\4\u022f\1\u0265\1\u022f\7\0"+
+    "\32\u022f\1\0\3\u022f\6\0\1\u022f\4\0\3\u0266\1\0"+
+    "\3\u0266\1\u0299\3\0\1\u0230\1\u01fa\1\u01f8\1\0\1\u029a"+
+    "\1\u0230\2\u01fa\4\u0266\7\0\32\u0266\1\0\3\u0266\6\0"+
+    "\1\u0266\4\0\3\u0267\1\0\3\u0267\1\u029b\3\0\1\u0231"+
+    "\3\0\1\u029c\3\0\4\u0267\7\0\32\u0267\1\0\3\u0267"+
+    "\6\0\1\u0267\3\0\2\u029d\1\u029e\2\u029d\2\u029e\1\u029d"+
+    "\1\u0268\3\0\10\u029d\1\u029e\1\u029d\1\u0268\1\0\7\u029d"+
+    "\25\u029e\4\u029d\1\u029e\1\u029d\3\u029e\6\u029d\1\u029e\4\u029d"+
+    "\1\u029f\1\u029e\1\u029f\1\u029d\2\u029e\1\u029f\1\u0268\3\0"+
+    "\10\u029d\1\u029e\1\u029f\1\u0269\1\147\7\u029d\25\u029e\4\u029f"+
+    "\1\u029e\1\u029d\3\u029e\6\u029d\1\u029e\3\u029d\10\0\1\u026a"+
+    "\15\0\1\u026a\12\0\1\u02a0\5\0\1\u02a1\40\0\3\147"+
+    "\1\0\3\147\1\u026a\13\0\2\147\1\u026b\1\147\7\0"+
+    "\2\147\1\u02a2\5\147\1\u02a3\21\147\1\0\3\147\6\0"+
+    "\1\147\5\0\1\u02a4\2\0\2\u02a4\1\0\1\u026c\13\0"+
+    "\1\u02a4\1\0\1\u026c\10\0\25\u02a4\4\0\1\u02a4\1\0"+
+    "\3\u02a4\6\0\1\u02a4\4\0\1\147\1\u02a4\1\147\1\0"+
+    "\2\u02a4\1\147\1\u026c\13\0\1\u02a4\1\147\1\u026d\1\147"+
+    "\7\0\25\u02a4\4\147\1\u02a4\1\0\3\u02a4\6\0\1\u02a4"+
+    "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\6\147"+
+    "\1\u02a5\23\147\1\0\3\147\6\0\1\147\4\0\3\147"+
+    "\1\0\3\147\14\0\4\147\7\0\7\147\1\u02a6\22\147"+
+    "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+
+    "\14\0\4\147\7\0\7\147\1\u02a7\22\147\1\0\3\147"+
+    "\6\0\1\147\4\0\3\147\1\0\3\147\1\u02a8\13\0"+
+    "\2\147\1\u02a9\1\147\7\0\32\147\1\0\3\147\6\0"+
+    "\1\147\3\0\10\u023b\1\u0272\3\0\1\u0204\11\u023b\1\u0272"+
+    "\1\0\57\u023b\1\0\3\u0273\1\0\3\u0273\1\u02aa\3\0"+
+    "\1\u02ab\7\0\4\u0273\7\0\32\u0273\1\0\3\u0273\6\0"+
+    "\1\u0273\4\0\3\u0274\1\0\3\u0274\1\u02ac\3\0\1\u02ad"+
+    "\1\0\1\u02ae\1\0\1\u02af\3\0\2\u0274\1\u02b0\1\u0274"+
+    "\7\0\32\u0274\1\0\3\u0274\6\0\1\u0274\4\0\3\u02b1"+
+    "\1\0\4\u02b1\3\0\2\u02b1\2\0\10\u02b1\7\0\32\u02b1"+
+    "\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0276\1\0\3\u0276"+
+    "\1\u02ac\3\0\1\u02ad\1\0\1\u02ae\1\0\1\u02af\3\0"+
+    "\2\u0276\1\u02b2\1\u0276\7\0\32\u0276\1\0\3\u0276\6\0"+
+    "\1\u0276\4\0\3\u0277\1\0\4\u0277\3\0\2\u0277\2\0"+
+    "\1\u0277\1\u02b3\6\u0277\7\0\32\u0277\1\0\3\u0277\6\0"+
+    "\1\u0277\3\0\10\u0244\1\u0278\3\0\12\u0244\1\u0278\1\0"+
+    "\60\u0244\3\u0247\1\u0244\3\u0247\1\u0278\3\0\10\u0244\2\u0247"+
+    "\1\u0279\1\147\7\u0244\32\u0247\1\u0244\3\u0247\6\u0244\1\u0247"+
+    "\3\u0244\46\0\1\u02b4\106\0\1\u02b5\77\0\1\u02b6\66\0"+
+    "\1\u02b7\67\0\11\u024e\2\357\1\76\13\u024e\1\357\1\u024e"+
+    "\1\u0280\1\u012e\1\u0281\1\u012e\1\u024e\1\u012e\54\u024e\1\u027f"+
+    "\4\u024e\2\357\1\76\13\u024e\1\357\1\u01dd\1\u012e\1\357"+
+    "\54\u024e\4\u0284\1\u02b8\4\u0284\2\357\1\76\13\u0284\1\357"+
+    "\2\u0284\1\u0282\1\u012e\53\u0284\13\357\1\76\15\357\1\u012d"+
+    "\1\u012e\1\u024f\1\233\1\357\1\233\50\357\3\u0282\1\u02b9"+
+    "\1\u02ba\1\u0282\1\u02bb\1\u02bc\1\u0282\2\357\1\76\13\u0282"+
+    "\1\357\1\u0282\1\u012d\1\u0284\1\u02bd\1\u016d\1\u0282\1\u016d"+
+    "\25\u0282\1\u02b9\1\u0282\1\u02bc\1\u02b9\17\u0282\4\u012e\1\u016c"+
+    "\4\u012e\2\357\1\76\13\u012e\1\357\2\u012e\1\357\1\u024e"+
+    "\53\u012e\4\u016b\1\u0285\1\u016b\1\u0286\2\u016b\2\u01a3\1\u01a4"+
+    "\13\u016b\1\u01a3\1\u01a5\57\u016b\3\u0287\3\u016b\1\u0287\1\u016b"+
+    "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b\2\u0287\3\u016b"+
+    "\1\u0287\1\u016b\1\u0287\1\u016b\1\u0287\2\u016b\1\u0287\1\u016b"+
+    "\4\u0287\2\u016b\1\u0287\1\u016b\1\u0287\13\u016b\3\u02be\3\u016b"+
+    "\1\u02be\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b"+
+    "\2\u02be\3\u016b\1\u02be\1\u016b\1\u02be\1\u016b\1\u02be\2\u016b"+
+    "\1\u02be\1\u016b\4\u02be\2\u016b\1\u02be\1\u016b\1\u02be\12\u016b"+
+    "\11\u0254\3\76\13\u0254\1\76\1\u0254\1\u0289\1\230\1\u028a"+
+    "\1\230\1\u0254\1\230\54\u0254\1\u0288\4\u0254\3\76\13\u0254"+
+    "\1\76\1\u01e1\1\u012e\1\76\54\u0254\4\u028d\1\u02bf\4\u028d"+
+    "\3\0\13\u028d\1\0\2\u028d\1\u028b\1\230\53\u028d\31\76"+
+    "\1\227\1\230\1\u0255\1\0\1\76\1\0\50\76\3\u028b"+
+    "\1\u02c0\1\u02c1\1\u028b\1\u02c2\1\u02c3\1\u028b\3\76\13\u028b"+
+    "\1\76\1\u028b\1\227\1\u028d\1\u02c4\1\235\1\u028b\1\235"+
+    "\25\u028b\1\u02c0\1\u028b\1\u02c3\1\u02c0\17\u028b\4\230\1\234"+
+    "\4\230\3\0\13\230\1\0\2\230\1\76\1\u0254\53\230"+
+    "\4\232\1\u028e\1\232\1\u028f\21\232\1\356\57\232\3\u0290"+
+    "\3\232\1\u0290\20\232\1\356\15\232\2\u0290\3\232\1\u0290"+
+    "\1\232\1\u0290\1\232\1\u0290\2\232\1\u0290\1\232\4\u0290"+
+    "\2\232\1\u0290\1\232\1\u0290\13\232\3\u02c5\3\232\1\u02c5"+
+    "\20\232\1\356\15\232\2\u02c5\3\232\1\u02c5\1\232\1\u02c5"+
+    "\1\232\1\u02c5\2\232\1\u02c5\1\232\4\u02c5\2\232\1\u02c5"+
+    "\1\232\1\u02c5\12\232\11\256\2\125\1\126\13\256\1\125"+
+    "\4\256\1\u02c6\52\256\11\u0292\2\u02c7\1\u02c8\13\u0292\1\u02c7"+
+    "\57\u0292\11\256\2\125\1\126\13\256\1\125\15\256\1\u02c9"+
+    "\41\256\2\u02ca\1\u02cb\2\u02ca\2\u02cb\1\u02ca\1\u0294\3\0"+
+    "\10\u02ca\1\u02cb\1\u02ca\1\u0294\1\0\7\u02ca\25\u02cb\4\u02ca"+
+    "\1\u02cb\1\u02ca\3\u02cb\6\u02ca\1\u02cb\4\u02ca\1\u02cc\1\u02cb"+
+    "\1\u02cc\1\u02ca\2\u02cb\1\u02cc\1\u0294\3\0\10\u02ca\1\u02cb"+
+    "\1\u02cc\1\u0295\1\147\7\u02ca\25\u02cb\4\u02cc\1\u02cb\1\u02ca"+
+    "\3\u02cb\6\u02ca\1\u02cb\3\u02ca\1\0\3\147\1\0\3\147"+
+    "\1\u02cd\13\0\2\147\1\u02cd\1\147\7\0\32\147\1\0"+
+    "\3\147\6\0\1\147\13\0\1\u0297\3\0\2\u0298\10\0"+
+    "\1\u0297\62\0\1\u0264\2\0\2\u0264\1\0\1\u0298\13\0"+
+    "\1\u0264\1\0\1\u0298\10\0\25\u0264\4\0\1\u0264\1\0"+
+    "\3\u0264\6\0\1\u0264\4\0\3\u01fa\1\0\3\u01fa\1\u0299"+
+    "\3\0\1\u0230\1\u01fa\1\u01f8\1\0\1\u029a\1\u0230\4\u01fa"+
+    "\1\u0299\1\u01fa\7\0\32\u01fa\1\0\3\u01fa\6\0\1\u01fa"+
+    "\4\0\3\u02ce\1\0\4\u02ce\3\0\2\u02ce\2\0\1\u02ce"+
+    "\1\u02cf\6\u02ce\7\0\32\u02ce\1\0\3\u02ce\6\0\1\u02ce"+
+    "\13\0\1\u029b\3\0\1\u0231\3\0\1\u029c\5\0\1\u029b"+
+    "\61\0\3\u02d0\1\0\4\u02d0\3\0\2\u02d0\2\0\10\u02d0"+
+    "\7\0\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\3\0\11\u029d"+
+    "\3\0\13\u029d\1\0\60\u029d\3\u029e\1\u029d\3\u029e\1\u02d1"+
+    "\3\0\2\u0268\6\u029d\3\u029e\1\u02d2\7\u029d\32\u029e\1\u029d"+
+    "\3\u029e\6\u029d\1\u029e\4\u029d\3\u029f\1\u029d\3\u029f\1\u029d"+
+    "\3\0\10\u029d\3\u029f\1\147\7\u029d\32\u029f\1\u029d\3\u029f"+
+    "\6\u029d\1\u029f\3\u029d\43\0\1\u02d3\116\0\1\u02d4\34\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u02d5"+
+    "\25\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+
+    "\3\147\14\0\4\147\7\0\14\147\1\u02d6\15\147\1\0"+
+    "\3\147\6\0\1\147\4\0\3\u02a4\1\0\3\u02a4\1\u02d7"+
+    "\13\0\4\u02a4\7\0\32\u02a4\1\0\3\u02a4\6\0\1\u02a4"+
+    "\4\0\3\147\1\0\3\147\1\u02d8\13\0\2\147\1\u02d9"+
+    "\1\147\6\0\1\151\32\147\1\0\3\147\6\0\1\147"+
+    "\3\0\2\u02da\1\u02db\2\u02da\2\u02db\1\u02da\1\u02a8\3\0"+
+    "\10\u02da\1\u02db\1\u02da\1\u02a8\1\0\7\u02da\25\u02db\4\u02da"+
+    "\1\u02db\1\u02da\3\u02db\6\u02da\1\u02db\4\u02da\1\u02dc\1\u02db"+
+    "\1\u02dc\1\u02da\2\u02db\1\u02dc\1\u02a8\3\0\10\u02da\1\u02db"+
+    "\1\u02dc\1\u02a9\1\147\7\u02da\25\u02db\4\u02dc\1\u02db\1\u02da"+
+    "\3\u02db\6\u02da\1\u02db\3\u02da\10\0\1\u02aa\3\0\1\u02ab"+
+    "\11\0\1\u02aa\62\0\1\u0273\2\0\2\u0273\1\0\1\u02ab"+
+    "\13\0\1\u0273\1\0\1\u02ab\10\0\25\u0273\4\0\1\u0273"+
+    "\1\0\3\u0273\6\0\1\u0273\13\0\1\u02ac\3\0\1\u02ad"+
+    "\1\0\1\u02ae\1\0\1\u02af\5\0\1\u02ac\62\0\1\u0274"+
+    "\2\0\2\u0274\1\0\1\u02ad\13\0\1\u0274\1\0\1\u02ad"+
+    "\10\0\25\u0274\4\0\1\u0274\1\0\3\u0274\6\0\1\u0274"+
+    "\13\0\1\u02ae\6\0\1\u02dd\6\0\1\u02ae\61\0\3\u02de"+
+    "\1\0\4\u02de\3\0\2\u02de\2\0\10\u02de\7\0\32\u02de"+
+    "\1\0\3\u02de\6\0\1\u02de\4\0\3\u02b1\1\0\4\u02b1"+
+    "\3\0\2\u02b1\2\0\1\u02b1\1\u02df\6\u02b1\7\0\32\u02b1"+
+    "\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0277\1\0\3\u0277"+
+    "\1\u02b3\3\0\2\u0277\2\0\1\u0277\1\u02b3\4\u0277\1\u02b3"+
+    "\1\u0277\7\0\32\u0277\1\0\3\u0277\6\0\1\u0277\110\0"+
+    "\1\u02e0\106\0\1\u02e1\64\0\1\u02e2\23\0\3\u0284\1\u02e3"+
+    "\1\u02e4\1\u0284\1\u02e5\1\u02e6\1\u0284\2\357\1\76\13\u0284"+
+    "\1\357\34\u0284\1\u02e3\1\u0284\1\u02e6\1\u02e3\17\u0284\3\357"+
+    "\1\u0282\3\357\1\u0282\3\357\1\76\15\357\1\u012d\1\u012e"+
+    "\1\u024f\1\233\1\357\1\233\25\357\1\u0282\1\357\2\u0282"+
+    "\23\357\1\u02e7\1\357\1\u02e8\4\357\1\76\15\357\1\u012d"+
+    "\1\u012e\1\u024f\1\233\1\357\1\233\51\357\3\u02e9\3\357"+
+    "\1\u02e9\3\357\1\76\15\357\1\u012d\1\u012e\1\u024f\1\233"+
+    "\1\357\1\233\7\357\2\u02e9\3\357\1\u02e9\1\357\1\u02e9"+
+    "\1\357\1\u02e9\2\357\1\u02e9\1\357\4\u02e9\2\357\1\u02e9"+
+    "\1\357\1\u02e9\15\357\1\u02b9\3\357\1\u02b9\3\357\1\76"+
+    "\15\357\1\u012d\1\u012e\1\u024f\1\233\1\357\1\233\25\357"+
+    "\1\u02b9\1\357\2\u02b9\17\357\4\u016d\1\u016e\4\u016d\2\357"+
+    "\1\76\13\u016d\1\357\3\u016d\1\357\53\u016d\1\u016b\3\u02ea"+
+    "\3\u016b\1\u02ea\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5"+
+    "\15\u016b\2\u02ea\3\u016b\1\u02ea\1\u016b\1\u02ea\1\u016b\1\u02ea"+
+    "\2\u016b\1\u02ea\1\u016b\4\u02ea\2\u016b\1\u02ea\1\u016b\1\u02ea"+
+    "\12\u016b\3\u028d\1\u02eb\1\u02ec\1\u028d\1\u02ed\1\u02ee\1\u028d"+
+    "\3\0\13\u028d\1\0\34\u028d\1\u02eb\1\u028d\1\u02ee\1\u02eb"+
+    "\17\u028d\3\76\1\u028b\3\76\1\u028b\21\76\1\227\1\230"+
+    "\1\u0255\1\0\1\76\1\0\25\76\1\u028b\1\76\2\u028b"+
+    "\23\76\1\u02ef\1\76\1\u02f0\22\76\1\227\1\230\1\u0255"+
+    "\1\0\1\76\1\0\51\76\3\u02f1\3\76\1\u02f1\21\76"+
+    "\1\227\1\230\1\u0255\1\0\1\76\1\0\7\76\2\u02f1"+
+    "\3\76\1\u02f1\1\76\1\u02f1\1\76\1\u02f1\2\76\1\u02f1"+
+    "\1\76\4\u02f1\2\76\1\u02f1\1\76\1\u02f1\15\76\1\u02c0"+
+    "\3\76\1\u02c0\21\76\1\227\1\230\1\u0255\1\0\1\76"+
+    "\1\0\25\76\1\u02c0\1\76\2\u02c0\17\76\4\235\1\236"+
+    "\4\235\3\0\13\235\1\0\3\235\1\76\53\235\1\232"+
+    "\3\u02f2\3\232\1\u02f2\20\232\1\356\15\232\2\u02f2\3\232"+
+    "\1\u02f2\1\232\1\u02f2\1\232\1\u02f2\2\232\1\u02f2\1\232"+
+    "\4\u02f2\2\232\1\u02f2\1\232\1\u02f2\12\232\11\u02c6\2\u02f3"+
+    "\1\u02f4\13\u02c6\1\u02f3\57\u02c6\11\256\2\125\1\126\13\256"+
+    "\1\125\4\256\1\u02f5\52\256\11\u02ca\3\0\13\u02ca\1\0"+
+    "\60\u02ca\3\u02cb\1\u02ca\3\u02cb\1\u02f6\3\0\2\u0294\6\u02ca"+
+    "\3\u02cb\1\u02f7\7\u02ca\32\u02cb\1\u02ca\3\u02cb\6\u02ca\1\u02cb"+
+    "\4\u02ca\3\u02cc\1\u02ca\3\u02cc\1\u02ca\3\0\10\u02ca\3\u02cc"+
+    "\1\147\7\u02ca\32\u02cc\1\u02ca\3\u02cc\6\u02ca\1\u02cc\3\u02ca"+
+    "\13\u02cd\1\0\73\u02cd\1\0\3\u02ce\1\0\4\u02ce\3\0"+
+    "\2\u02ce\2\0\1\u02ce\1\u02f8\6\u02ce\7\0\32\u02ce\1\0"+
+    "\3\u02ce\6\0\1\u02ce\4\0\1\u02ce\1\u02f9\1\u02ce\1\0"+
+    "\2\u02f9\1\u02ce\1\u02cf\3\0\2\u02ce\2\0\1\u02ce\1\u02f8"+
+    "\2\u02ce\1\u02f9\1\u02ce\1\u02cf\1\u02ce\7\0\25\u02f9\4\u02ce"+
+    "\1\u02f9\1\0\3\u02f9\6\0\1\u02f9\4\0\3\u02d0\1\0"+
+    "\4\u02d0\3\0\2\u02d0\2\0\1\u02d0\1\u02fa\6\u02d0\7\0"+
+    "\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\3\0\10\u029d\1\u02d1"+
+    "\3\0\2\u0268\10\u029d\1\u02d1\1\0\57\u029d\1\0\3\u02d2"+
+    "\1\0\3\u02d2\1\u02fb\3\0\2\u02fc\6\0\4\u02d2\7\0"+
+    "\32\u02d2\1\0\3\u02d2\6\0\1\u02d2\11\0\1\u02fd\151\0"+
+    "\1\u02fe\36\0\3\147\1\0\1\147\1\u02ff\1\147\14\0"+
+    "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+
+    "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u0300"+
+    "\17\147\1\0\3\147\6\0\1\147\13\0\1\u02d7\15\0"+
+    "\1\u02d7\60\0\2\u0301\1\u0302\2\u0301\2\u0302\1\u0301\1\u02d8"+
+    "\3\0\10\u0301\1\u0302\1\u0301\1\u02d8\1\0\7\u0301\25\u0302"+
+    "\4\u0301\1\u0302\1\u0301\3\u0302\6\u0301\1\u0302\4\u0301\1\u0303"+
+    "\1\u0302\1\u0303\1\u0301\2\u0302\1\u0303\1\u02d8\3\0\10\u0301"+
+    "\1\u0302\1\u0303\1\u02d9\1\147\7\u0301\25\u0302\4\u0303\1\u0302"+
+    "\1\u0301\3\u0302\6\u0301\1\u0302\3\u0301\11\u02da\3\0\13\u02da"+
+    "\1\0\60\u02da\3\u02db\1\u02da\3\u02db\1\u0304\3\0\1\u02a8"+
+    "\7\u02da\3\u02db\1\u0305\7\u02da\32\u02db\1\u02da\3\u02db\6\u02da"+
+    "\1\u02db\4\u02da\3\u02dc\1\u02da\3\u02dc\1\u02da\3\0\10\u02da"+
+    "\3\u02dc\1\147\7\u02da\32\u02dc\1\u02da\3\u02dc\6\u02da\1\u02dc"+
+    "\3\u02da\10\0\1\u0306\5\0\1\u02ae\7\0\1\u0306\61\0"+
+    "\3\u02de\1\0\4\u02de\3\0\2\u02de\2\0\1\u02de\1\u0307"+
+    "\6\u02de\7\0\32\u02de\1\0\3\u02de\6\0\1\u02de\4\0"+
+    "\1\u02b1\1\u0308\1\u02b1\1\0\2\u0308\1\u02b1\1\u02df\3\0"+
+    "\2\u02b1\2\0\1\u02b1\1\u02df\2\u02b1\1\u0308\1\u02b1\1\u02df"+
+    "\1\u02b1\7\0\25\u0308\4\u02b1\1\u0308\1\0\3\u0308\6\0"+
+    "\1\u0308\22\0\1\u0309\106\0\1\u030a\126\0\1\u030b\47\0"+
+    "\3\u012e\1\u0284\1\u016c\2\u012e\1\u0284\1\u012e\2\357\1\76"+
+    "\13\u012e\1\357\2\u012e\1\357\1\u024e\30\u012e\1\u0284\1\u012e"+
+    "\2\u0284\23\u012e\1\u030c\1\u012e\1\u030d\2\u012e\2\357\1\76"+
+    "\13\u012e\1\357\2\u012e\1\357\1\u024e\54\u012e\3\u030e\1\u016c"+
+    "\2\u012e\1\u030e\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+
+    "\1\357\1\u024e\12\u012e\2\u030e\3\u012e\1\u030e\1\u012e\1\u030e"+
+    "\1\u012e\1\u030e\2\u012e\1\u030e\1\u012e\4\u030e\2\u012e\1\u030e"+
+    "\1\u012e\1\u030e\15\u012e\1\u02e3\1\u016c\2\u012e\1\u02e3\1\u012e"+
+    "\2\357\1\76\13\u012e\1\357\2\u012e\1\357\1\u024e\30\u012e"+
+    "\1\u02e3\1\u012e\2\u02e3\17\u012e\4\357\1\u02e7\1\357\1\u02e8"+
+    "\4\357\1\76\15\357\1\u012d\1\u012e\1\u012f\1\233\1\357"+
+    "\1\233\51\357\3\u02e9\3\357\1\u02e9\3\357\1\76\15\357"+
+    "\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\7\357\2\u02e9"+
+    "\3\357\1\u02e9\1\357\1\u02e9\1\357\1\u02e9\2\357\1\u02e9"+
+    "\1\357\4\u02e9\2\357\1\u02e9\1\357\1\u02e9\13\357\3\u030f"+
+    "\3\357\1\u030f\3\357\1\76\15\357\1\u012d\1\u012e\1\u012f"+
+    "\1\233\1\357\1\233\7\357\2\u030f\3\357\1\u030f\1\357"+
+    "\1\u030f\1\357\1\u030f\2\357\1\u030f\1\357\4\u030f\2\357"+
+    "\1\u030f\1\357\1\u030f\12\357\1\u016b\3\u0218\3\u016b\1\u0218"+
+    "\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b\2\u0218"+
+    "\3\u016b\1\u0218\1\u016b\1\u0218\1\u016b\1\u0218\2\u016b\1\u0218"+
+    "\1\u016b\4\u0218\2\u016b\1\u0218\1\u016b\1\u0218\12\u016b\3\230"+
+    "\1\u028d\1\234\2\230\1\u028d\1\230\3\0\13\230\1\0"+
+    "\2\230\1\76\1\u0254\30\230\1\u028d\1\230\2\u028d\23\230"+
+    "\1\u0310\1\230\1\u0311\2\230\3\0\13\230\1\0\2\230"+
+    "\1\76\1\u0254\54\230\3\u0312\1\234\2\230\1\u0312\1\230"+
+    "\3\0\13\230\1\0\2\230\1\76\1\u0254\12\230\2\u0312"+
+    "\3\230\1\u0312\1\230\1\u0312\1\230\1\u0312\2\230\1\u0312"+
+    "\1\230\4\u0312\2\230\1\u0312\1\230\1\u0312\15\230\1\u02eb"+
+    "\1\234\2\230\1\u02eb\1\230\3\0\13\230\1\0\2\230"+
+    "\1\76\1\u0254\30\230\1\u02eb\1\230\2\u02eb\17\230\4\76"+
+    "\1\u02ef\1\76\1\u02f0\22\76\1\227\1\230\1\231\1\0"+
+    "\1\76\1\0\51\76\3\u02f1\3\76\1\u02f1\21\76\1\227"+
+    "\1\230\1\231\1\0\1\76\1\0\7\76\2\u02f1\3\76"+
+    "\1\u02f1\1\76\1\u02f1\1\76\1\u02f1\2\76\1\u02f1\1\76"+
+    "\4\u02f1\2\76\1\u02f1\1\76\1\u02f1\13\76\3\u0313\3\76"+
+    "\1\u0313\21\76\1\227\1\230\1\231\1\0\1\76\1\0"+
+    "\7\76\2\u0313\3\76\1\u0313\1\76\1\u0313\1\76\1\u0313"+
+    "\2\76\1\u0313\1\76\4\u0313\2\76\1\u0313\1\76\1\u0313"+
+    "\12\76\1\232\3\u021f\3\232\1\u021f\20\232\1\356\15\232"+
+    "\2\u021f\3\232\1\u021f\1\232\1\u021f\1\232\1\u021f\2\232"+
+    "\1\u021f\1\232\4\u021f\2\232\1\u021f\1\232\1\u021f\12\232"+
+    "\11\u02f5\2\u0314\1\u0315\13\u02f5\1\u0314\57\u02f5\10\u02ca\1\u02f6"+
+    "\3\0\2\u0294\10\u02ca\1\u02f6\1\0\57\u02ca\1\0\3\u02f7"+
+    "\1\0\3\u02f7\1\u0316\3\0\2\u0317\6\0\4\u02f7\7\0"+
+    "\32\u02f7\1\0\3\u02f7\6\0\1\u02f7\4\0\1\u02ce\1\u02f9"+
+    "\1\u02ce\1\0\2\u02f9\1\u02ce\1\u02f8\3\0\2\u02ce\1\u01f8"+
+    "\1\0\1\u02ce\1\u02f8\2\u02ce\1\u02f9\1\u02ce\1\u02f8\1\u02ce"+
+    "\7\0\25\u02f9\4\u02ce\1\u02f9\1\0\3\u02f9\6\0\1\u02f9"+
+    "\4\0\3\u02f9\1\0\3\u02f9\1\u0318\3\0\1\u02cf\1\u02ce"+
+    "\1\u01f8\1\0\1\u02ce\1\u02f8\2\u02ce\4\u02f9\7\0\32\u02f9"+
+    "\1\0\3\u02f9\6\0\1\u02f9\4\0\3\u02d0\1\0\3\u02d0"+
+    "\1\u02fa\3\0\2\u02d0\2\0\1\u02d0\1\u02fa\4\u02d0\1\u02fa"+
+    "\1\u02d0\7\0\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\13\0"+
+    "\1\u02fb\3\0\2\u02fc\10\0\1\u02fb\62\0\1\u02d2\2\0"+
+    "\2\u02d2\1\0\1\u02fc\13\0\1\u02d2\1\0\1\u02fc\10\0"+
+    "\25\u02d2\4\0\1\u02d2\1\0\3\u02d2\6\0\1\u02d2\51\0"+
+    "\1\u0319\114\0\1\u031a\33\0\3\147\1\0\3\147\14\0"+
+    "\4\147\7\0\7\147\1\u031b\22\147\1\0\3\147\6\0"+
+    "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+
+    "\15\147\1\u031c\14\147\1\0\3\147\6\0\1\147\3\0"+
+    "\11\u0301\3\0\13\u0301\1\0\60\u0301\3\u0302\1\u0301\3\u0302"+
+    "\1\u031d\3\0\2\u02d8\6\u0301\3\u0302\1\u031e\7\u0301\32\u0302"+
+    "\1\u0301\3\u0302\6\u0301\1\u0302\4\u0301\3\u0303\1\u0301\3\u0303"+
+    "\1\u0301\3\0\10\u0301\3\u0303\1\147\7\u0301\32\u0303\1\u0301"+
+    "\3\u0303\6\u0301\1\u0303\3\u0301\10\u02da\1\u0304\3\0\1\u02a8"+
+    "\11\u02da\1\u0304\1\0\57\u02da\1\0\3\u0305\1\0\3\u0305"+
+    "\1\u031f\3\0\1\u0320\7\0\4\u0305\7\0\32\u0305\1\0"+
+    "\3\u0305\6\0\1\u0305\4\0\3\u02de\1\0\3\u02de\1\u0321"+
+    "\3\0\2\u02de\1\u02ae\1\0\1\u02de\1\u0307\4\u02de\1\u0321"+
+    "\1\u02de\7\0\32\u02de\1\0\3\u02de\6\0\1\u02de\4\0"+
+    "\3\u0308\1\0\3\u0308\1\u0322\3\0\1\u02df\1\u02b1\1\u02ae"+
+    "\1\0\1\u0323\1\u02df\2\u02b1\2\u0308\1\u0324\1\u0308\7\0"+
+    "\32\u0308\1\0\3\u0308\6\0\1\u0308\44\0\1\u0325\45\0"+
+    "\4\u012e\1\u0326\1\u012e\1\u030d\2\u012e\2\357\1\76\13\u012e"+
+    "\1\357\60\u012e\3\u030e\1\u016c\2\u012e\1\u030e\1\u012e\2\357"+
+    "\1\76\13\u012e\1\357\2\u012e\1\357\13\u012e\2\u030e\3\u012e"+
+    "\1\u030e\1\u012e\1\u030e\1\u012e\1\u030e\2\u012e\1\u030e\1\u012e"+
+    "\4\u030e\2\u012e\1\u030e\1\u012e\1\u030e\13\u012e\3\u0327\1\u016c"+
+    "\2\u012e\1\u0327\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+
+    "\1\357\13\u012e\2\u0327\3\u012e\1\u0327\1\u012e\1\u0327\1\u012e"+
+    "\1\u0327\2\u012e\1\u0327\1\u012e\4\u0327\2\u012e\1\u0327\1\u012e"+
+    "\1\u0327\12\u012e\1\357\3\u0328\3\357\1\u0328\3\357\1\76"+
+    "\15\357\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\7\357"+
+    "\2\u0328\3\357\1\u0328\1\357\1\u0328\1\357\1\u0328\2\357"+
+    "\1\u0328\1\357\4\u0328\2\357\1\u0328\1\357\1\u0328\12\357"+
+    "\4\230\1\u0329\1\230\1\u0311\2\230\3\0\13\230\1\0"+
+    "\60\230\3\u0312\1\234\2\230\1\u0312\1\230\3\0\13\230"+
+    "\1\0\2\230\1\76\13\230\2\u0312\3\230\1\u0312\1\230"+
+    "\1\u0312\1\230\1\u0312\2\230\1\u0312\1\230\4\u0312\2\230"+
+    "\1\u0312\1\230\1\u0312\13\230\3\u032a\1\234\2\230\1\u032a"+
+    "\1\230\3\0\13\230\1\0\2\230\1\76\13\230\2\u032a"+
+    "\3\230\1\u032a\1\230\1\u032a\1\230\1\u032a\2\230\1\u032a"+
+    "\1\230\4\u032a\2\230\1\u032a\1\230\1\u032a\12\230\1\76"+
+    "\3\u032b\3\76\1\u032b\21\76\1\227\1\230\1\231\1\0"+
+    "\1\76\1\0\7\76\2\u032b\3\76\1\u032b\1\76\1\u032b"+
+    "\1\76\1\u032b\2\76\1\u032b\1\76\4\u032b\2\76\1\u032b"+
+    "\1\76\1\u032b\12\76\10\0\1\u0316\3\0\2\u0317\10\0"+
+    "\1\u0316\62\0\1\u02f7\2\0\2\u02f7\1\0\1\u0317\13\0"+
+    "\1\u02f7\1\0\1\u0317\10\0\25\u02f7\4\0\1\u02f7\1\0"+
+    "\3\u02f7\6\0\1\u02f7\4\0\3\u02ce\1\0\3\u02ce\1\u0318"+
+    "\3\0\1\u02cf\1\u02ce\1\u01f8\1\0\1\u02ce\1\u02f8\4\u02ce"+
+    "\1\u0318\1\u02ce\7\0\32\u02ce\1\0\3\u02ce\6\0\1\u02ce"+
+    "\51\0\1\u032c\41\0\3\147\1\0\3\147\14\0\4\147"+
+    "\7\0\7\147\1\u032d\22\147\1\0\3\147\6\0\1\147"+
+    "\3\0\10\u0301\1\u031d\3\0\2\u02d8\10\u0301\1\u031d\1\0"+
+    "\57\u0301\1\0\3\u031e\1\0\3\u031e\1\u032e\3\0\2\u032f"+
+    "\6\0\4\u031e\7\0\32\u031e\1\0\3\u031e\6\0\1\u031e"+
+    "\13\0\1\u031f\3\0\1\u0320\11\0\1\u031f\62\0\1\u0305"+
+    "\2\0\2\u0305\1\0\1\u0320\13\0\1\u0305\1\0\1\u0320"+
+    "\10\0\25\u0305\4\0\1\u0305\1\0\3\u0305\6\0\1\u0305"+
+    "\4\0\3\u02b1\1\0\3\u02b1\1\u0322\3\0\1\u02df\1\u02b1"+
+    "\1\u02ae\1\0\1\u0323\1\u02df\4\u02b1\1\u0322\1\u02b1\7\0"+
+    "\32\u02b1\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0330\1\0"+
+    "\4\u0330\3\0\2\u0330\2\0\1\u0330\1\u0331\6\u0330\7\0"+
+    "\32\u0330\1\0\3\u0330\6\0\1\u0330\110\0\1\u0332\1\0"+
+    "\4\u012e\1\u030c\1\u012e\1\u030d\2\u012e\2\357\1\76\13\u012e"+
+    "\1\357\2\u012e\1\357\55\u012e\3\u0333\1\u016c\2\u012e\1\u0333"+
+    "\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e\1\357\13\u012e"+
+    "\2\u0333\3\u012e\1\u0333\1\u012e\1\u0333\1\u012e\1\u0333\2\u012e"+
+    "\1\u0333\1\u012e\4\u0333\2\u012e\1\u0333\1\u012e\1\u0333\12\u012e"+
+    "\1\357\3\u0282\3\357\1\u0282\3\357\1\76\15\357\1\u012d"+
+    "\1\u012e\1\u012f\1\233\1\357\1\233\7\357\2\u0282\3\357"+
+    "\1\u0282\1\357\1\u0282\1\357\1\u0282\2\357\1\u0282\1\357"+
+    "\4\u0282\2\357\1\u0282\1\357\1\u0282\12\357\4\230\1\u0310"+
+    "\1\230\1\u0311\2\230\3\0\13\230\1\0\2\230\1\76"+
+    "\55\230\3\u0334\1\234\2\230\1\u0334\1\230\3\0\13\230"+
+    "\1\0\2\230\1\76\13\230\2\u0334\3\230\1\u0334\1\230"+
+    "\1\u0334\1\230\1\u0334\2\230\1\u0334\1\230\4\u0334\2\230"+
+    "\1\u0334\1\230\1\u0334\12\230\1\76\3\u028b\3\76\1\u028b"+
+    "\21\76\1\227\1\230\1\231\1\0\1\76\1\0\7\76"+
+    "\2\u028b\3\76\1\u028b\1\76\1\u028b\1\76\1\u028b\2\76"+
+    "\1\u028b\1\76\4\u028b\2\76\1\u028b\1\76\1\u028b\12\76"+
+    "\10\0\1\u032e\3\0\2\u032f\10\0\1\u032e\62\0\1\u031e"+
+    "\2\0\2\u031e\1\0\1\u032f\13\0\1\u031e\1\0\1\u032f"+
+    "\10\0\25\u031e\4\0\1\u031e\1\0\3\u031e\6\0\1\u031e"+
+    "\4\0\3\u0330\1\0\4\u0330\3\0\2\u0330\2\0\1\u0330"+
+    "\1\u0335\6\u0330\7\0\32\u0330\1\0\3\u0330\6\0\1\u0330"+
+    "\4\0\1\u0330\1\u0336\1\u0330\1\0\2\u0336\1\u0330\1\u0331"+
+    "\3\0\2\u0330\2\0\1\u0330\1\u0335\2\u0330\1\u0336\1\u0330"+
+    "\1\u0331\1\u0330\7\0\25\u0336\4\u0330\1\u0336\1\0\3\u0336"+
+    "\6\0\1\u0336\22\0\1\u0337\67\0\1\u012e\3\u0284\1\u016c"+
+    "\2\u012e\1\u0284\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+
+    "\1\357\13\u012e\2\u0284\3\u012e\1\u0284\1\u012e\1\u0284\1\u012e"+
+    "\1\u0284\2\u012e\1\u0284\1\u012e\4\u0284\2\u012e\1\u0284\1\u012e"+
+    "\1\u0284\12\u012e\1\230\3\u028d\1\234\2\230\1\u028d\1\230"+
+    "\3\0\13\230\1\0\2\230\1\76\13\230\2\u028d\3\230"+
+    "\1\u028d\1\230\1\u028d\1\230\1\u028d\2\230\1\u028d\1\230"+
+    "\4\u028d\2\230\1\u028d\1\230\1\u028d\12\230\1\0\1\u0330"+
+    "\1\u0336\1\u0330\1\0\2\u0336\1\u0330\1\u0338\3\0\2\u0330"+
+    "\1\u02ae\1\0\1\u0330\1\u0335\2\u0330\1\u0336\1\u0330\1\u0338"+
+    "\1\u0330\7\0\25\u0336\4\u0330\1\u0336\1\0\3\u0336\6\0"+
+    "\1\u0336\4\0\3\u0336\1\0\3\u0336\1\u0339\3\0\1\u0331"+
+    "\1\u0330\1\u02ae\1\0\1\u0330\1\u0335\2\u0330\2\u0336\1\u033a"+
+    "\1\u0336\7\0\32\u0336\1\0\3\u0336\6\0\1\u0336\4\0"+
+    "\3\u0330\1\0\3\u0330\1\u0339\3\0\1\u0331\1\u0330\1\u02ae"+
+    "\1\0\1\u0330\1\u0335\4\u0330\1\u0339\1\u0330\7\0\32\u0330"+
+    "\1\0\3\u0330\6\0\1\u0330\3\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[48777];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\2\1\15\0\2\1\1\11\4\1\1\11\2\1\1\11"+
+    "\15\1\2\11\4\1\1\11\2\1\2\11\1\1\1\11"+
+    "\2\1\7\11\4\1\2\11\1\1\1\11\3\1\1\11"+
+    "\1\1\1\11\3\1\2\11\1\1\1\11\3\1\1\11"+
+    "\1\1\1\11\1\1\1\11\1\1\1\11\2\1\3\0"+
+    "\2\11\1\0\1\11\1\0\2\1\1\0\15\1\3\0"+
+    "\1\11\3\1\2\0\1\11\1\1\1\11\4\1\5\11"+
+    "\1\0\1\1\2\0\1\11\1\1\3\0\1\11\1\1"+
+    "\10\0\1\11\4\1\6\11\3\0\1\11\5\0\1\1"+
+    "\1\0\1\1\1\11\1\1\1\11\2\1\1\11\35\1"+
+    "\3\0\6\1\1\0\1\11\1\0\1\1\6\0\2\11"+
+    "\1\0\1\1\4\0\1\11\1\0\1\1\1\11\1\1"+
+    "\1\11\3\0\42\1\3\0\2\1\1\0\1\11\1\1"+
+    "\14\0\1\11\1\1\3\0\46\1\2\11\1\0\2\1"+
+    "\1\0\1\1\13\0\1\1\5\0\11\1\1\0\31\1"+
+    "\1\11\2\1\7\0\2\1\10\0\1\1\1\11\3\0"+
+    "\12\1\1\0\17\1\1\0\7\1\6\0\2\1\3\0"+
+    "\1\1\6\0\1\1\1\11\4\0\13\1\4\0\22\1"+
+    "\1\11\6\0\1\1\6\0\1\1\13\0\10\1\3\0"+
+    "\15\1\1\0\2\1\1\0\5\1\4\0\2\11\2\1"+
+    "\4\0\2\1\7\0\1\1\1\11\1\0\12\1\1\0"+
+    "\1\1\1\0\7\1\2\0\1\1\1\0\2\1\2\0"+
+    "\1\11\2\0\1\1\2\0\2\1\4\0\1\1\2\0"+
+    "\2\1\7\0\4\1\1\0\1\1\1\0\1\1\1\0"+
+    "\3\1\2\0\11\1\1\0\1\1\3\0\1\1\1\0"+
+    "\2\1\3\0\1\11\1\0\4\1\3\0\4\1\3\0"+
+    "\1\1\1\11\1\0\4\1\3\0\2\1\2\0\10\1"+
+    "\12\0\3\1\5\0\3\1\1\0\1\1\1\11\1\0"+
+    "\6\1\3\0\10\1\2\0\2\11\4\0\1\1\3\0"+
+    "\2\1\1\11\1\1\1\0\1\1\1\11\1\0\5\1"+
+    "\1\0\2\1\1\0\1\1\3\0\1\1\2\0\1\1"+
+    "\1\11\2\1\10\0\1\11\3\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[826];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+  
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** number of newlines encountered up to the start of the matched text */
+  private int yyline;
+
+  /** the number of characters up to the start of the matched text */
+  private int yychar;
+
+  /**
+   * the number of characters from the last newline up to the start of the 
+   * matched text
+   */
+  private int yycolumn;
+
+  /** 
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /** denotes if the user-EOF-code has already been executed */
+  private boolean zzEOFDone;
+
+  /** the stack of open (nested) input streams to read from */
+  private java.util.Stack zzStreams = new java.util.Stack();
+
+  /**
+   * inner class used to store info for nested
+   * input streams
+   */
+  private static final class ZzFlexStreamInfo {
+    java.io.Reader zzReader;
+    int zzEndRead;
+    int zzStartRead;
+    int zzCurrentPos;
+    int zzMarkedPos;
+    int yyline;
+    int yycolumn;
+    char [] zzBuffer;
+    boolean zzAtEOF;
+    boolean zzEOFDone;
+
+    /** sets all values stored in this class */
+    ZzFlexStreamInfo(java.io.Reader zzReader, int zzEndRead, int zzStartRead,
+                  int zzCurrentPos, int zzMarkedPos, 
+                  char [] zzBuffer, boolean zzAtEOF, int yyline, int yycolumn) {
+      this.zzReader      = zzReader;
+      this.zzEndRead     = zzEndRead;
+      this.zzStartRead   = zzStartRead;
+      this.zzCurrentPos  = zzCurrentPos;
+      this.zzMarkedPos   = zzMarkedPos;
+      this.zzBuffer      = zzBuffer;
+      this.zzAtEOF       = zzAtEOF;
+      this.zzEOFDone     = zzEOFDone;
+      this.yyline         = yyline;
+      this.yycolumn       = yycolumn;
+    }
+  }
+
+  /* user code: */
+  int balance = 0;
+  int commentbalance = 0;
+  int action_line = 0;
+  int bufferSize = 16384;
+
+  File file;
+  Stack files = new Stack();
+
+  StringBuffer userCode   = new StringBuffer();
+  
+  String classCode;
+  String initCode;   
+  String initThrow;
+  String eofCode;
+  String eofThrow;
+  String lexThrow;
+  String eofVal;
+  String scanErrorException;
+  String cupSymbol = "sym";
+
+  StringBuffer actionText = new StringBuffer();
+  StringBuffer string     = new StringBuffer();
+  
+  boolean charCount;
+  boolean lineCount;
+  boolean columnCount;
+  boolean cupCompatible;  
+  boolean cupDebug;
+  boolean isInteger;
+  boolean isIntWrap;
+  boolean isYYEOF;
+  boolean notUnix;
+  boolean isPublic;
+  boolean isFinal;
+  boolean isAbstract;
+  boolean bolUsed;
+  boolean standalone;
+  boolean debugOption;
+  boolean useRowMap = Options.gen_method == Options.PACK || Options.gen_method == Options.TABLE;
+  boolean packed = Options.gen_method == Options.PACK;
+  boolean caseless;
+  boolean inclusive_states;
+  boolean eofclose;
+    
+  String isImplementing;
+  String isExtending;
+  String className = "Yylex";
+  String functionName;
+  String tokenType;
+  String visibility = "public";
+    
+  Vector /* String */ ctorArgs = new Vector();
+  Vector /* String */ ctorTypes = new Vector();
+    
+  LexicalStates states = new LexicalStates();
+
+  Vector actions = new Vector();
+  
+  private int nextState;
+
+  boolean macroDefinition;
+
+  Timer t = new Timer();
+
+  public int currentLine() {
+    return yyline;
+  }    
+
+  public void setFile(File file) {
+    this.file = file;
+  }
+
+  private Symbol symbol(int type, Object value) {
+    return new Symbol(type, yyline, yycolumn, value);
+  }
+
+  private Symbol symbol(int type) {
+    return new Symbol(type, yyline, yycolumn);
+  }
+   
+  // updates line and column count to the beginning of the first
+  // non whitespace character in yytext, but leaves yyline+yycolumn 
+  // untouched
+  private Symbol symbol_countUpdate(int type, Object value) {
+     int lc = yyline;
+     int cc = yycolumn;
+     String text = yytext();
+
+     for (int i=0; i < text.length(); i++) {
+      char c = text.charAt(i);
+
+      if (c != '\n' && c != '\r' && c != ' ' && c != '\t' ) 
+        return new Symbol(type, lc, cc, value);
+
+      if (c == '\n') {
+        lc++;
+        cc = 0;
+      }
+      else
+        cc++;
+    }
+   
+    return new Symbol(type, yyline, yycolumn, value);
+  }
+
+  private String makeMacroIdent() {
+    String matched = yytext().trim();
+    return matched.substring(1, matched.length()-1).trim();
+  }
+
+  public static String conc(Object a, Object b) {
+    if (a == null && b == null) return null;
+    if (a == null) return b.toString();
+    if (b == null) return a.toString();
+    
+    return a.toString()+b.toString();
+  }
+
+  public static String concExc(Object a, Object b) {
+    if (a == null && b == null) return null;
+    if (a == null) return b.toString();
+    if (b == null) return a.toString();
+    
+    return a.toString()+", "+b.toString();
+  }
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public LexScan(java.io.Reader in) {
+    states.insert("YYINITIAL", true);
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public LexScan(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 1788) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Refills the input buffer.
+   *
+   * @return      <code>false</code>, iff there was new input.
+   * 
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  private boolean zzRefill() throws java.io.IOException {
+
+    /* first: make room (if you can) */
+    if (zzStartRead > 0) {
+      System.arraycopy(zzBuffer, zzStartRead,
+                       zzBuffer, 0,
+                       zzEndRead-zzStartRead);
+
+      /* translate stored positions */
+      zzEndRead-= zzStartRead;
+      zzCurrentPos-= zzStartRead;
+      zzMarkedPos-= zzStartRead;
+      zzStartRead = 0;
+    }
+
+    /* is the buffer big enough? */
+    if (zzCurrentPos >= zzBuffer.length) {
+      /* if not: blow it up */
+      char newBuffer[] = new char[zzCurrentPos*2];
+      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
+      zzBuffer = newBuffer;
+    }
+
+    /* finally: fill the buffer with new input */
+    int numRead = zzReader.read(zzBuffer, zzEndRead,
+                                            zzBuffer.length-zzEndRead);
+
+    if (numRead > 0) {
+      zzEndRead+= numRead;
+      return false;
+    }
+    // unlikely but not impossible: read 0 characters, but not at end of stream
+    if (numRead == 0) {
+      int c = zzReader.read();
+      if (c == -1) {
+        return true;
+      } else {
+        zzBuffer[zzEndRead++] = (char) c;
+        return false;
+      }     
+    }
+    
+    // numRead < 0) 
+    return true;
+  }
+
+    
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Stores the current input stream on a stack, and
+   * reads from a new stream. Lexical state, line,
+   * char, and column counting remain untouched.
+   *
+   * The current input stream can be restored with
+   * yypopstream (usually in an <<EOF>> action).
+   *
+   * @param reader the new input stream to read from
+   *
+   * @see #yypopStream()
+   */
+  public final void yypushStream(java.io.Reader reader) {
+    zzStreams.push(
+      new ZzFlexStreamInfo(zzReader, zzEndRead, zzStartRead, zzCurrentPos,
+                        zzMarkedPos, zzBuffer, zzAtEOF,
+                        yyline, yycolumn)
+    );
+    zzAtEOF  = false;
+    zzBuffer = new char[ZZ_BUFFERSIZE];
+    zzReader = reader;
+    zzEndRead = zzStartRead = 0;
+    zzCurrentPos = zzMarkedPos = 0;
+    yyline = yycolumn = 0;
+  }
+    
+
+  /**
+   * Closes the current input stream and continues to
+   * read from the one on top of the stream stack. 
+   *
+   * @throws java.util.EmptyStackException
+   *         if there is no further stream to read from.
+   *
+   * @throws java.io.IOException
+   *         if there was an error in closing the stream.
+   *
+   * @see #yypushStream(java.io.Reader)
+   */
+  public final void yypopStream() throws java.io.IOException {
+    zzReader.close();
+    ZzFlexStreamInfo s = (ZzFlexStreamInfo) zzStreams.pop();
+    zzBuffer      = s.zzBuffer;
+    zzReader      = s.zzReader;
+    zzEndRead     = s.zzEndRead;
+    zzStartRead   = s.zzStartRead;
+    zzCurrentPos  = s.zzCurrentPos;
+    zzMarkedPos   = s.zzMarkedPos ;
+    zzAtEOF       = s.zzAtEOF;
+    zzEOFDone     = s.zzEOFDone;
+    yyline         = s.yyline;
+    yycolumn       = s.yycolumn;
+  }
+
+
+  /**
+   * Returns true iff there are still streams left 
+   * to read from on the stream stack.
+   */
+  public final boolean yymoreStreams() {
+    return !zzStreams.isEmpty();
+  }
+
+
+  /**
+   * Resets the scanner to read from a new input stream.
+   * Does not close the old reader.
+   *
+   * All internal variables are reset, the old input stream 
+   * <b>cannot</b> be reused (internal buffer is discarded and lost).
+   * Lexical state is set to <tt>ZZ_INITIAL</tt>.
+   *
+   * @param reader   the new input stream 
+   *
+   * @see #yypushStream(java.io.Reader)
+   * @see #yypopStream()
+   */
+  public final void yyreset(java.io.Reader reader) {
+    zzReader = reader;
+    zzAtBOL  = true;
+    zzAtEOF  = false;
+    zzEOFDone = false;
+    zzEndRead = zzStartRead = 0;
+    zzCurrentPos = zzMarkedPos = 0;
+    yyline = yychar = yycolumn = 0;
+    zzLexicalState = YYINITIAL;
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Contains user EOF-code, which will be executed exactly once,
+   * when the end of file is reached
+   */
+  private void zzDoEOF() throws java.io.IOException {
+    if (!zzEOFDone) {
+      zzEOFDone = true;
+      yyclose();
+    }
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public Symbol next_token() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      // cached fields:
+      int zzCurrentPosL;
+      int zzMarkedPosL = zzMarkedPos;
+      int zzEndReadL = zzEndRead;
+      char [] zzBufferL = zzBuffer;
+      char [] zzCMapL = ZZ_CMAP;
+
+      boolean zzR = false;
+      for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL;
+                                                             zzCurrentPosL++) {
+        switch (zzBufferL[zzCurrentPosL]) {
+        case '\u000B':
+        case '\u000C':
+        case '\u0085':
+        case '\u2028':
+        case '\u2029':
+          yyline++;
+          yycolumn = 0;
+          zzR = false;
+          break;
+        case '\r':
+          yyline++;
+          yycolumn = 0;
+          zzR = true;
+          break;
+        case '\n':
+          if (zzR)
+            zzR = false;
+          else {
+            yyline++;
+            yycolumn = 0;
+          }
+          break;
+        default:
+          zzR = false;
+          yycolumn++;
+        }
+      }
+
+      if (zzR) {
+        // peek one character ahead if it is \n (if we have counted one line too much)
+        boolean zzPeek;
+        if (zzMarkedPosL < zzEndReadL)
+          zzPeek = zzBufferL[zzMarkedPosL] == '\n';
+        else if (zzAtEOF)
+          zzPeek = false;
+        else {
+          boolean eof = zzRefill();
+          zzEndReadL = zzEndRead;
+          zzMarkedPosL = zzMarkedPos;
+          zzBufferL = zzBuffer;
+          if (eof) 
+            zzPeek = false;
+          else 
+            zzPeek = zzBufferL[zzMarkedPosL] == '\n';
+        }
+        if (zzPeek) yyline--;
+      }
+      if (zzMarkedPosL > zzStartRead) {
+        switch (zzBufferL[zzMarkedPosL-1]) {
+        case '\n':
+        case '\u000B':
+        case '\u000C':
+        case '\u0085':
+        case '\u2028':
+        case '\u2029':
+          zzAtBOL = true;
+          break;
+        case '\r': 
+          if (zzMarkedPosL < zzEndReadL)
+            zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          else if (zzAtEOF)
+            zzAtBOL = false;
+          else {
+            boolean eof = zzRefill();
+            zzMarkedPosL = zzMarkedPos;
+            zzEndReadL = zzEndRead;
+            zzBufferL = zzBuffer;
+            if (eof) 
+              zzAtBOL = false;
+            else 
+              zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          }
+          break;
+        default:
+          zzAtBOL = false;
+        }
+      }
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      if (zzAtBOL)
+        zzState = ZZ_LEXSTATE[zzLexicalState+1];
+      else
+        zzState = ZZ_LEXSTATE[zzLexicalState];
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 118: 
+          { cupDebug = true;
+          }
+        case 147: break;
+        case 122: 
+          { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE);
+          }
+        case 148: break;
+        case 113: 
+          { File f = new File(yytext().substring(9).trim());
+                                if ( !f.canRead() )
+                                  throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); 
+                                // check for cycle
+                                if (files.search(f) > 0)
+                                  throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline);
+                                try {
+                                  yypushStream( new FileReader(f) );
+                                  files.push(file);
+                                  file = f;
+                                  Out.println("Including \""+file+"\"");
+                                }
+                                catch (FileNotFoundException e) {
+                                  throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); 
+                                }
+          }
+        case 149: break;
+        case 88: 
+          { return symbol(FULL);
+          }
+        case 150: break;
+        case 92: 
+          { return symbol(ASCII);
+          }
+        case 151: break;
+        case 21: 
+          { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT);
+          }
+        case 152: break;
+        case 142: 
+          { return symbol(UPPERCLASS);
+          }
+        case 153: break;
+        case 34: 
+          { return symbol(COMMA);
+          }
+        case 154: break;
+        case 61: 
+          { return symbol(CHAR,new Character('\f'));
+          }
+        case 155: break;
+        case 111: 
+          { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline);
+          }
+        case 156: break;
+        case 104: 
+          { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION);
+          }
+        case 157: break;
+        case 143: 
+          { return symbol(LOWERCLASS);
+          }
+        case 158: break;
+        case 72: 
+          { string.append('\r');
+          }
+        case 159: break;
+        case 43: 
+          { return symbol(HAT);
+          }
+        case 160: break;
+        case 48: 
+          { yybegin(MACROS); ctorArgs.add(yytext().trim());
+          }
+        case 161: break;
+        case 1: 
+          { return symbol(EOF);
+          }
+        case 162: break;
+        case 59: 
+          { return symbol(CHAR,new Character('\t'));
+          }
+        case 163: break;
+        case 145: 
+          { eofclose = false;
+          }
+        case 164: break;
+        case 103: 
+          { isPublic = true;
+          }
+        case 165: break;
+        case 112: 
+          { actionText.setLength(0); yybegin(JAVA_CODE); 
+                                Symbol s = symbol_countUpdate(EOFRULE, null);
+                                action_line = s.left+1; 
+                                return s;
+          }
+        case 166: break;
+        case 40: 
+          { balance++; return symbol(OPENCLASS);
+          }
+        case 167: break;
+        case 11: 
+          { yybegin(REGEXP);
+          }
+        case 168: break;
+        case 12: 
+          { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null);
+          }
+        case 169: break;
+        case 68: 
+          { string.append( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8));
+          }
+        case 170: break;
+        case 62: 
+          { return symbol(CHAR,new Character('\b'));
+          }
+        case 171: break;
+        case 39: 
+          { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn);
+          }
+        case 172: break;
+        case 5: 
+          { states.insert(yytext(),inclusive_states);
+          }
+        case 173: break;
+        case 70: 
+          { string.append('\n');
+          }
+        case 174: break;
+        case 10: 
+          { yybegin(REGEXP); return symbol(EQUALS);
+          }
+        case 175: break;
+        case 146: 
+          { return symbol(JLETTERDIGITCLASS);
+          }
+        case 176: break;
+        case 19: 
+          { return symbol(STAR);
+          }
+        case 177: break;
+        case 42: 
+          { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT);
+          }
+        case 178: break;
+        case 116: 
+          { isAbstract = true;
+          }
+        case 179: break;
+        case 75: 
+          { yypushback(1); yycolumn--; return symbol(CHAR, new Character(yytext().charAt(0)));
+          }
+        case 180: break;
+        case 114: 
+          { lexThrow = concExc(lexThrow,yytext().substring(8).trim());
+          }
+        case 181: break;
+        case 109: 
+          { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline);
+          }
+        case 182: break;
+        case 93: 
+          { packed = false; useRowMap = true;
+          }
+        case 183: break;
+        case 87: 
+          { cupCompatible = true;  
+                                isImplementing = concExc(isImplementing, "java_cup.runtime.Scanner");
+                                if (functionName == null)
+                                  functionName = "next_token";
+                                if (tokenType == null)
+                                  tokenType = "java_cup.runtime.Symbol";
+                                if (eofVal == null)
+                                  eofVal = "return new java_cup.runtime.Symbol("+cupSymbol+".EOF);";
+                                if (!Options.jlex) eofclose = true;
+          }
+        case 184: break;
+        case 30: 
+          { bolUsed = true; return symbol(HAT);
+          }
+        case 185: break;
+        case 4: 
+          { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn);
+          }
+        case 186: break;
+        case 35: 
+          { yybegin(REGEXP); return symbol(MORETHAN);
+          }
+        case 187: break;
+        case 100: 
+          { packed = false; useRowMap = false;
+          }
+        case 188: break;
+        case 119: 
+          { caseless = true;
+          }
+        case 189: break;
+        case 38: 
+          { yybegin(nextState); return symbol(STRING, string.toString());
+          }
+        case 190: break;
+        case 76: 
+          { return symbol(REPEAT, new Integer(yytext().substring(1).trim()));
+          }
+        case 191: break;
+        case 13: 
+          { return symbol_countUpdate(RBRACE, null);
+          }
+        case 192: break;
+        case 139: 
+          { scanErrorException = yytext().substring(11).trim();
+          }
+        case 193: break;
+        case 141: 
+          { lexThrow = concExc(lexThrow,yytext().substring(12).trim());
+          }
+        case 194: break;
+        case 84: 
+          { return symbol(MACROUSE, yytext().substring(1,yytext().length()-1));
+          }
+        case 195: break;
+        case 2: 
+          { /* ignore */
+          }
+        case 196: break;
+        case 127: 
+          { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline);
+          }
+        case 197: break;
+        case 47: 
+          { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn);
+          }
+        case 198: break;
+        case 108: 
+          { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline);
+          }
+        case 199: break;
+        case 31: 
+          { actionText.append(yytext());
+          }
+        case 200: break;
+        case 83: 
+          { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16));
+          }
+        case 201: break;
+        case 107: 
+          { notUnix = true;
+          }
+        case 202: break;
+        case 89: 
+          { lineCount = true;
+          }
+        case 203: break;
+        case 136: 
+          { initThrow = concExc(initThrow,yytext().substring(11).trim());
+          }
+        case 204: break;
+        case 131: 
+          { standalone = true; isInteger = true;
+          }
+        case 205: break;
+        case 52: 
+          { nextState = MACROS; yybegin(COMMENT);
+          }
+        case 206: break;
+        case 25: 
+          { return symbol(TILDE);
+          }
+        case 207: break;
+        case 37: 
+          { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn);
+          }
+        case 208: break;
+        case 110: 
+          { className = yytext().substring(7).trim();
+          }
+        case 209: break;
+        case 9: 
+          { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn);
+          }
+        case 210: break;
+        case 55: 
+          { nextState = REGEXPSTART; yybegin(COMMENT);
+          }
+        case 211: break;
+        case 16: 
+          { return symbol(POINT);
+          }
+        case 212: break;
+        case 73: 
+          { string.append('\f');
+          }
+        case 213: break;
+        case 65: 
+          { yybegin(REPEATEXP); return symbol(REPEAT, new Integer(yytext().trim().substring(1).trim()));
+          }
+        case 214: break;
+        case 80: 
+          { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)));
+          }
+        case 215: break;
+        case 140: 
+          { initThrow = concExc(initThrow,string);  yybegin(MACROS);
+          }
+        case 216: break;
+        case 135: 
+          { eofThrow = concExc(eofThrow,string); yybegin(MACROS);
+          }
+        case 217: break;
+        case 71: 
+          { string.append('\t');
+          }
+        case 218: break;
+        case 67: 
+          { string.append(yytext().charAt(1));
+          }
+        case 219: break;
+        case 7: 
+          { yybegin(MACROS);
+          }
+        case 220: break;
+        case 98: 
+          { eofCode = conc(eofCode,string); yybegin(MACROS);
+          }
+        case 221: break;
+        case 56: 
+          { return symbol(CHAR, new Character(yytext().charAt(1)));
+          }
+        case 222: break;
+        case 28: 
+          { return symbol(PLUS);
+          }
+        case 223: break;
+        case 101: 
+          { columnCount = true;
+          }
+        case 224: break;
+        case 124: 
+          { isExtending = yytext().substring(9).trim();
+          }
+        case 225: break;
+        case 123: 
+          { eofVal = string.toString(); yybegin(MACROS);
+          }
+        case 226: break;
+        case 36: 
+          { string.append(yytext());
+          }
+        case 227: break;
+        case 97: 
+          { return symbol(UNICODE);
+          }
+        case 228: break;
+        case 74: 
+          { string.append('\b');
+          }
+        case 229: break;
+        case 24: 
+          { return symbol(BANG);
+          }
+        case 230: break;
+        case 132: 
+          { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline);
+          }
+        case 231: break;
+        case 91: 
+          { packed = true; useRowMap = true;
+          }
+        case 232: break;
+        case 26: 
+          { return symbol(OPENBRACKET);
+          }
+        case 233: break;
+        case 60: 
+          { return symbol(CHAR,new Character('\r'));
+          }
+        case 234: break;
+        case 94: 
+          { isFinal = true;
+          }
+        case 235: break;
+        case 27: 
+          { return symbol(CLOSEBRACKET);
+          }
+        case 236: break;
+        case 86: 
+          { isInteger = true;
+          }
+        case 237: break;
+        case 20: 
+          { return symbol(LOOKAHEAD);
+          }
+        case 238: break;
+        case 51: 
+          { commentbalance++;
+          }
+        case 239: break;
+        case 49: 
+          { t.start(); 
+                             yybegin(MACROS); 
+                             macroDefinition = true; 
+                             return symbol(USERCODE,userCode);
+          }
+        case 240: break;
+        case 44: 
+          { return symbol(DASH);
+          }
+        case 241: break;
+        case 138: 
+          { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline);
+          }
+        case 242: break;
+        case 96: 
+          { debugOption = true;
+          }
+        case 243: break;
+        case 64: 
+          { nextState = REGEXP; yybegin(COMMENT);
+          }
+        case 244: break;
+        case 32: 
+          { if (balance > 0) {
+                 balance--;     
+                 actionText.append('}'); 
+               }
+               else {
+                 yybegin(REGEXPSTART); 
+                 Action a = new Action(actionText.toString(), action_line);
+                 actions.addElement(a);
+                 return symbol(ACTION, a);
+               }
+          }
+        case 245: break;
+        case 29: 
+          { return symbol(DOLLAR);
+          }
+        case 246: break;
+        case 17: 
+          { yybegin(CHARCLASS); return symbol(OPENCLASS);
+          }
+        case 247: break;
+        case 105: 
+          { initCode = conc(initCode,string);    yybegin(MACROS);
+          }
+        case 248: break;
+        case 69: 
+          { string.append('\"');
+          }
+        case 249: break;
+        case 137: 
+          { isImplementing = concExc(isImplementing, yytext().substring(12).trim());
+          }
+        case 250: break;
+        case 126: 
+          { return symbol(LETTERCLASS);
+          }
+        case 251: break;
+        case 102: 
+          { isInteger = true;
+                                if (eofVal == null)
+                                  eofVal = "return 0;";
+                                eofclose = true;
+          }
+        case 252: break;
+        case 41: 
+          { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS);
+          }
+        case 253: break;
+        case 77: 
+          { string.setLength(0); yybegin(COPY);
+          }
+        case 254: break;
+        case 8: 
+          { return symbol(IDENT, yytext());
+          }
+        case 255: break;
+        case 121: 
+          { return symbol(DIGITCLASS);
+          }
+        case 256: break;
+        case 144: 
+          { lexThrow = concExc(lexThrow,string); yybegin(MACROS);
+          }
+        case 257: break;
+        case 53: 
+          { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1);
+          }
+        case 258: break;
+        case 23: 
+          { return symbol(BAR);
+          }
+        case 259: break;
+        case 45: 
+          { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn);
+          }
+        case 260: break;
+        case 117: 
+          { cupSymbol = yytext().substring(8).trim(); 
+                                if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline);
+          }
+        case 261: break;
+        case 58: 
+          { return symbol(CHAR,new Character('\n'));
+          }
+        case 262: break;
+        case 95: 
+          { isYYEOF = true;
+          }
+        case 263: break;
+        case 14: 
+          { return symbol(CHAR, new Character(yytext().charAt(0)));
+          }
+        case 264: break;
+        case 99: 
+          { tokenType = yytext().substring(6).trim();
+          }
+        case 265: break;
+        case 33: 
+          { balance++; actionText.append('{');
+          }
+        case 266: break;
+        case 128: 
+          { eofThrow = concExc(eofThrow,yytext().substring(10).trim());
+          }
+        case 267: break;
+        case 63: 
+          { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND);
+          }
+        case 268: break;
+        case 81: 
+          { return symbol_countUpdate(MACROUSE, makeMacroIdent());
+          }
+        case 269: break;
+        case 15: 
+          { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND);
+          }
+        case 270: break;
+        case 125: 
+          { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline);
+          }
+        case 271: break;
+        case 90: 
+          { charCount = true;
+          }
+        case 272: break;
+        case 130: 
+          { visibility = "private"; Skeleton.makePrivate();
+          }
+        case 273: break;
+        case 134: 
+          { return symbol(JLETTERCLASS);
+          }
+        case 274: break;
+        case 22: 
+          { yybegin(REGEXPSTART); return symbol(LBRACE);
+          }
+        case 275: break;
+        case 115: 
+          { eofclose = true;
+          }
+        case 276: break;
+        case 66: 
+          // lookahead expression with fixed lookahead length
+          yypushback(1);
+          { if (macroDefinition) {
+                              yybegin(EATWSPNL);
+                              return symbol(BAR); 
+                            }
+                            else { 
+                              yybegin(REGEXPSTART); 
+                              return symbol(NOACTION); 
+                            }
+          }
+        case 277: break;
+        case 82: 
+          // lookahead expression with fixed lookahead length
+          yypushback(2);
+          { if (macroDefinition) {
+                              yybegin(EATWSPNL);
+                              return symbol(BAR); 
+                            }
+                            else { 
+                              yybegin(REGEXPSTART); 
+                              return symbol(NOACTION); 
+                            }
+          }
+        case 278: break;
+        case 46: 
+          { yybegin(REGEXP); return symbol(RBRACE);
+          }
+        case 279: break;
+        case 78: 
+          { inclusive_states = false; yybegin(STATELIST);
+          }
+        case 280: break;
+        case 120: 
+          { bufferSize = Integer.parseInt(yytext().substring(8).trim());
+          }
+        case 281: break;
+        case 106: 
+          { isIntWrap = true;
+          }
+        case 282: break;
+        case 133: 
+          { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim());
+          }
+        case 283: break;
+        case 3: 
+          { userCode.append(yytext());
+          }
+        case 284: break;
+        case 54: 
+          { macroDefinition = false; yybegin(REGEXPSTART); return symbol(DELIMITER);
+          }
+        case 285: break;
+        case 129: 
+          { functionName = yytext().substring(10).trim();
+          }
+        case 286: break;
+        case 85: 
+          { classCode = conc(classCode,string);  yybegin(MACROS);
+          }
+        case 287: break;
+        case 18: 
+          { return symbol(QUESTION);
+          }
+        case 288: break;
+        case 50: 
+          { if (commentbalance > 0) 
+                commentbalance--; 
+              else
+                yybegin(nextState);
+          }
+        case 289: break;
+        case 79: 
+          { inclusive_states = true; yybegin(STATELIST);
+          }
+        case 290: break;
+        case 57: 
+          { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8)));
+          }
+        case 291: break;
+        case 6: 
+          { 
+          }
+        case 292: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            zzDoEOF();
+            switch (zzLexicalState) {
+            case STRING_CONTENT: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_STRING);
+            }
+            case 827: break;
+            case MACROS: {
+              if ( yymoreStreams() ) {
+                                  file = (File) files.pop();
+                                  yypopStream();
+                                }
+                                else
+                                  throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS);
+            }
+            case 828: break;
+            case STATELIST: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS);
+            }
+            case 829: break;
+            case CHARCLASS: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP);
+            }
+            case 830: break;
+            case JAVA_CODE: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1);
+            }
+            case 831: break;
+            case REPEATEXP: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP);
+            }
+            case 832: break;
+            case COMMENT: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT);
+            }
+            case 833: break;
+            case STATES: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_STATES);
+            }
+            case 834: break;
+            case COPY: {
+              throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS);
+            }
+            case 835: break;
+            default:
+              {
+                if ( yymoreStreams() ) {
+             file = (File) files.pop();
+             yypopStream();
+           }
+           else 
+             return symbol(EOF);
+              }
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+  /**
+   * Converts an int token code into the name of the
+   * token by reflection on the cup symbol class/interface sym
+   *
+   * This code was contributed by Karl Meissner <meissnersd@yahoo.com>
+   */
+  private String getTokenName(int token) {
+    try {
+      java.lang.reflect.Field [] classFields = sym.class.getFields();
+      for (int i = 0; i < classFields.length; i++) {
+        if (classFields[i].getInt(null) == token) {
+          return classFields[i].getName();
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace(System.err);
+    }
+
+    return "UNKNOWN TOKEN";
+  }
+
+  /**
+   * Same as next_token but also prints the token to standard out
+   * for debugging.
+   *
+   * This code was contributed by Karl Meissner <meissnersd@yahoo.com>
+   */
+  public Symbol debug_next_token() throws java.io.IOException {
+    java_cup.runtime.Symbol s = next_token();
+    System.out.println( "line:" + (yyline+1) + " col:" + (yycolumn+1) + " --"+ yytext() + "--" + getTokenName(s.sym) + "--");
+    return s;
+  }
+
+  /**
+   * Runs the scanner on input files.
+   *
+   * This main method is the debugging routine for the scanner.
+   * It prints debugging information about each returned token to
+   * System.out until the end of file is reached, or an error occured.
+   *
+   * @param argv   the command line, contains the filenames to run
+   *               the scanner on.
+   */
+  public static void main(String argv[]) {
+    if (argv.length == 0) {
+      System.out.println("Usage : java LexScan <inputfile>");
+    }
+    else {
+      for (int i = 0; i < argv.length; i++) {
+        LexScan scanner = null;
+        try {
+          scanner = new LexScan( new java.io.FileReader(argv[i]) );
+          while ( !scanner.zzAtEOF ) scanner.debug_next_token();
+        }
+        catch (java.io.FileNotFoundException e) {
+          System.out.println("File not found : \""+argv[i]+"\"");
+        }
+        catch (java.io.IOException e) {
+          System.out.println("IO error scanning file \""+argv[i]+"\"");
+          System.out.println(e);
+        }
+        catch (Exception e) {
+          System.out.println("Unexpected exception:");
+          e.printStackTrace();
+        }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexicalStates.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexicalStates.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/LexicalStates.java	(revision 25584)
@@ -0,0 +1,97 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.util.*;
+
+
+/**
+ * Simple symbol table, mapping lexical state names to integers. 
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class LexicalStates {
+  
+  /** maps state name to state number */
+  Hashtable states; 
+
+  /** codes of inclusive states (subset of states) */
+  Vector inclusive;
+
+  /** number of declared states */
+  int numStates;
+
+
+  /**
+   * constructs a new lexical state symbol table
+   */
+  public LexicalStates() {
+    states = new Hashtable();
+    inclusive = new Vector();
+  }
+
+  
+  /**
+   * insert a new state declaration
+   */
+  public void insert(String name, boolean is_inclusive) {
+    if ( states.containsKey(name) ) return;
+
+    Integer code = new Integer(numStates++);
+    states.put(name, code);
+
+    if (is_inclusive) 
+      inclusive.addElement(code);
+  }
+
+
+  /**
+   * returns the number (code) of a declared state, 
+   * <code>null</code> if no such state has been declared.
+   */
+  public Integer getNumber(String name) {
+    return (Integer) states.get(name);
+  }
+
+  
+  /**
+   * returns the number of declared states
+   */
+  public int number() {
+    return numStates;
+  }
+
+  
+  /**
+   * returns the names of all states
+   */
+  public Enumeration names() {
+    return states.keys();
+  }
+
+  /**
+   * returns the code of all inclusive states
+   */
+  public Enumeration getInclusiveStates() {
+    return inclusive.elements();
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/MacroException.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/MacroException.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/MacroException.java	(revision 25584)
@@ -0,0 +1,49 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * This Exception is used in the macro expander to report cycles or
+ * undefined macro usages.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class MacroException extends RuntimeException {
+
+  /**
+   * Creates a new MacroException without message
+   */
+  public MacroException() {
+  }
+
+
+  /**
+   * Creates a new MacroException with the specified message
+   *
+   * @param message   the error description presented to the user.
+   */
+  public MacroException(String message) {
+    super(message);
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Macros.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Macros.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Macros.java	(revision 25584)
@@ -0,0 +1,217 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.util.*;
+
+
+/**
+ * Symbol table and expander for macros.
+ * 
+ * Maps macros to their (expanded) definitions, detects cycles and 
+ * unused macros.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class Macros {
+
+  /** Maps names of macros to their definition */
+  private Hashtable macros;
+
+  /** Maps names of macros to their "used" flag */
+  private Hashtable used;
+
+
+  /**
+   * Creates a new macro expander.
+   */
+  public Macros() {
+    macros = new Hashtable();
+    used = new Hashtable();
+  }
+
+
+  /**
+   * Stores a new macro and its definition.
+   *
+   * @param name         the name of the new macro
+   * @param definition   the definition of the new macro
+   *
+   * @return <code>true</code>, iff the macro name has not been
+   *         stored before.
+   */
+  public boolean insert(String name, RegExp definition) {
+    
+    if (Options.DEBUG) 
+      Out.debug("inserting macro "+name+" with definition :"+Out.NL+definition); //$NON-NLS-1$ //$NON-NLS-2$
+      
+    used.put(name, Boolean.FALSE);
+    return macros.put(name,definition) == null;    
+  }
+
+
+  /**
+   * Marks a makro as used.
+   *
+   * @return <code>true</code>, iff the macro name has been
+   *         stored before.
+   */
+  public boolean markUsed(String name) {
+    return used.put(name, Boolean.TRUE) != null;
+  }
+
+
+  /**
+   * Tests if a macro has been used.
+   *
+   * @return <code>true</code>, iff the macro has been used in 
+   *         a regular expression.
+   */
+  public boolean isUsed(String name) {
+    return ((Boolean)used.get(name)).booleanValue();
+  }
+
+
+  /**
+   * Returns all unused macros.
+   *
+   * @return the enumeration of macro names that have not been used.
+   */
+  public Enumeration unused() {
+    
+    Vector unUsed = new Vector();
+
+    Enumeration names = used.keys();
+    while ( names.hasMoreElements() ) {
+      String name = (String) names.nextElement();
+      Boolean isUsed = (Boolean) used.get( name );
+      if ( !isUsed.booleanValue() ) unUsed.addElement(name);
+    }
+    
+    return unUsed.elements();
+  }
+
+
+  /**
+   * Fetches the definition of the macro with the specified name,
+   * <p>
+   * The definition will either be the same as stored (expand() not 
+   * called), or an equivalent one, that doesn't contain any macro 
+   * usages (expand() called before).
+   *
+   * @param name   the name of the macro
+   *
+   * @return the definition of the macro, <code>null</code> if 
+   *         no macro with the specified name has been stored.
+   *
+   * @see JFlex.Macros#expand
+   */
+  public RegExp getDefinition(String name) {
+    return (RegExp) macros.get(name);
+  }
+
+
+  /**
+   * Expands all stored macros, so that getDefinition always returns
+   * a defintion that doesn't contain any macro usages.
+   *
+   * @throws MacroException   if there is a cycle in the macro usage graph.
+   */
+   public void expand() throws MacroException {
+    
+    Enumeration names;
+
+    names = macros.keys();
+    
+    while ( names.hasMoreElements() ) {
+      String name = (String) names.nextElement();
+      if ( isUsed(name) )
+        macros.put(name, expandMacro(name, getDefinition(name))); 
+      // this put doesn't get a new key, so only a new value
+      // is set for the key "name" (without changing the enumeration 
+      // "names"!)
+    }
+  }
+
+
+  /**
+   * Expands the specified macro by replacing each macro usage
+   * with the stored definition. 
+   *   
+   * @param name        the name of the macro to expand (for detecting cycles)
+   * @param definition  the definition of the macro to expand
+   *
+   * @return the expanded definition of the macro.
+   * 
+   * @throws MacroException when an error (such as a cyclic definition)
+   *                              occurs during expansion
+   */
+  private RegExp expandMacro(String name, RegExp definition) throws MacroException {
+
+    // Out.print("checking macro "+name);
+    // Out.print("definition is "+definition);
+
+    switch ( definition.type ) {
+    case sym.BAR: 
+    case sym.CONCAT:   
+      RegExp2 binary = (RegExp2) definition;
+      binary.r1 = expandMacro(name, binary.r1);
+      binary.r2 = expandMacro(name, binary.r2);
+      return definition;
+      
+    case sym.STAR:
+    case sym.PLUS:
+    case sym.QUESTION: 
+    case sym.BANG:
+    case sym.TILDE:
+      RegExp1 unary = (RegExp1) definition;
+      unary.content = expandMacro(name, (RegExp) unary.content);
+      return definition;
+      
+    case sym.MACROUSE: 
+      String usename = (String) ((RegExp1) definition).content;
+      
+      if ( name.equals(usename) )
+        throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_CYCLE, name)); 
+          
+      RegExp usedef = getDefinition(usename);
+      
+      if ( usedef == null ) 
+        throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_DEF_MISSING, usename, name));
+      
+      markUsed(usename);
+      
+      return expandMacro(name, usedef);
+
+    case sym.STRING:
+    case sym.STRING_I:
+    case sym.CHAR:
+    case sym.CHAR_I:
+    case sym.CCLASS:
+    case sym.CCLASSNOT:
+      return definition;
+
+    default:
+      throw new MacroException("unknown expression type "+definition.type+" in macro expansion"); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Main.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Main.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Main.java	(revision 25584)
@@ -0,0 +1,332 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+ 
+import java.io.*;
+import java.util.*;
+import JFlex.gui.MainFrame;
+
+
+/**
+ * This is the main class of JFlex controlling the scanner generation process. 
+ * It is responsible for parsing the commandline, getting input files,
+ * starting up the GUI if necessary, etc. 
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class Main {
+  
+  /** JFlex version */
+  final public static String version = "1.4.3"; //$NON-NLS-1$
+
+  /**
+   * Generates a scanner for the specified input file.
+   *
+   * @param inputFile  a file containing a lexical specification
+   *                   to generate a scanner for.
+   */
+  public static void generate(File inputFile) {
+
+    Out.resetCounters();
+
+    Timer totalTime = new Timer();
+    Timer time      = new Timer();
+      
+    LexScan scanner = null;
+    LexParse parser = null;
+    FileReader inputReader = null;
+    
+    totalTime.start();      
+
+    try {  
+      Out.println(ErrorMessages.READING, inputFile.toString());
+      inputReader = new FileReader(inputFile);
+      scanner = new LexScan(inputReader);
+      scanner.setFile(inputFile);
+      parser = new LexParse(scanner);
+    }
+    catch (FileNotFoundException e) {
+      Out.error(ErrorMessages.CANNOT_OPEN, inputFile.toString());
+      throw new GeneratorException();
+    }
+      
+    try {  
+      NFA nfa = (NFA) parser.parse().value;      
+
+      Out.checkErrors();
+
+      if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.NFA_IS)+
+                                 Out.NL+nfa+Out.NL); 
+      
+      if (Options.dot) 
+        nfa.writeDot(Emitter.normalize("nfa.dot", null));       //$NON-NLS-1$
+
+      Out.println(ErrorMessages.NFA_STATES, nfa.numStates);
+      
+      time.start();
+      DFA dfa = nfa.getDFA();
+      time.stop();
+      Out.time(ErrorMessages.DFA_TOOK, time); 
+
+      dfa.checkActions(scanner, parser);
+      
+      nfa = null;
+
+      if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.DFA_IS)+
+                                 Out.NL+dfa+Out.NL);       
+
+      if (Options.dot) 
+        dfa.writeDot(Emitter.normalize("dfa-big.dot", null)); //$NON-NLS-1$
+
+      Out.checkErrors();
+
+      time.start();
+      dfa.minimize();
+      time.stop();
+
+      Out.time(ErrorMessages.MIN_TOOK, time); 
+            
+      if (Options.dump) 
+        Out.dump(ErrorMessages.get(ErrorMessages.MIN_DFA_IS)+
+                                   Out.NL+dfa); 
+
+      if (Options.dot) 
+        dfa.writeDot(Emitter.normalize("dfa-min.dot", null)); //$NON-NLS-1$
+
+      time.start();
+      
+      Emitter e = new Emitter(inputFile, parser, dfa);
+      e.emit();
+
+      time.stop();
+
+      Out.time(ErrorMessages.WRITE_TOOK, time); 
+      
+      totalTime.stop();
+      
+      Out.time(ErrorMessages.TOTAL_TIME, totalTime); 
+    }
+    catch (ScannerException e) {
+      Out.error(e.file, e.message, e.line, e.column);
+      throw new GeneratorException();
+    }
+    catch (MacroException e) {
+      Out.error(e.getMessage());
+      throw new GeneratorException();
+    }
+    catch (IOException e) {
+      Out.error(ErrorMessages.IO_ERROR, e.toString()); 
+      throw new GeneratorException();
+    }
+    catch (OutOfMemoryError e) {
+      Out.error(ErrorMessages.OUT_OF_MEMORY);
+      throw new GeneratorException();
+    }
+    catch (GeneratorException e) {
+      throw new GeneratorException();
+    }
+    catch (Exception e) {
+      e.printStackTrace();
+      throw new GeneratorException();
+    }
+
+  }
+
+  public static Vector parseOptions(String argv[]) throws SilentExit {
+    Vector files = new Vector();
+
+    for (int i = 0; i < argv.length; i++) {
+
+      if ( argv[i].equals("-d") || argv[i].equals("--outdir") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        if ( ++i >= argv.length ) {
+          Out.error(ErrorMessages.NO_DIRECTORY); 
+          throw new GeneratorException();
+        }
+        Options.setDir(argv[i]);
+        continue;
+      }
+
+      if ( argv[i].equals("--skel") || argv[i].equals("-skel") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        if ( ++i >= argv.length ) {
+          Out.error(ErrorMessages.NO_SKEL_FILE);
+          throw new GeneratorException();
+        }
+
+        Options.setSkeleton(new File(argv[i]));
+        continue;
+      }
+
+      if ( argv[i].equals("-jlex") || argv[i].equals("--jlex") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.jlex = true;
+        continue;
+      }
+
+      if ( argv[i].equals("-v") || argv[i].equals("--verbose") || argv[i].equals("-verbose") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        Options.verbose = true;
+        Options.progress = true;
+        continue;
+      }
+
+      if ( argv[i].equals("-q") || argv[i].equals("--quiet") || argv[i].equals("-quiet") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        Options.verbose = false;
+        Options.progress = false;
+        continue;
+      }
+
+      if ( argv[i].equals("--dump") || argv[i].equals("-dump") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.dump = true;
+        continue;
+      }
+
+      if ( argv[i].equals("--time") || argv[i].equals("-time") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.time = true;
+        continue;
+      }
+
+      if ( argv[i].equals("--version") || argv[i].equals("-version") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Out.println(ErrorMessages.THIS_IS_JFLEX, version); 
+        throw new SilentExit();
+      }
+
+      if ( argv[i].equals("--dot") || argv[i].equals("-dot") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.dot = true;
+        continue;
+      }
+
+      if ( argv[i].equals("--help") || argv[i].equals("-h") || argv[i].equals("/h") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        printUsage();
+        throw new SilentExit();
+      }
+
+      if ( argv[i].equals("--info") || argv[i].equals("-info") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Out.printSystemInfo();
+        throw new SilentExit();
+      }
+      
+      if ( argv[i].equals("--nomin") || argv[i].equals("-nomin") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.no_minimize = true;
+        continue;
+      }
+
+      if ( argv[i].equals("--pack") || argv[i].equals("-pack") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.gen_method = Options.PACK;
+        continue;
+      }
+
+      if ( argv[i].equals("--table") || argv[i].equals("-table") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.gen_method = Options.TABLE;
+        continue;
+      }
+
+      if ( argv[i].equals("--switch") || argv[i].equals("-switch") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.gen_method = Options.SWITCH;
+        continue;
+      }
+      
+      if ( argv[i].equals("--nobak") || argv[i].equals("-nobak") ) { //$NON-NLS-1$ //$NON-NLS-2$
+        Options.no_backup = true;
+        continue;
+      }
+      
+      if ( argv[i].startsWith("-") ) { //$NON-NLS-1$
+        Out.error(ErrorMessages.UNKNOWN_COMMANDLINE, argv[i]);
+        printUsage();
+        throw new SilentExit();
+      }
+
+      // if argv[i] is not an option, try to read it as file 
+      File f = new File(argv[i]);
+      if ( f.isFile() && f.canRead() ) 
+        files.addElement(f);      
+      else {
+        Out.error("Sorry, couldn't open \""+f+"\""); //$NON-NLS-2$
+        throw new GeneratorException();
+      }
+    }
+
+    return files;
+  }
+
+
+  public static void printUsage() {
+    Out.println(""); //$NON-NLS-1$
+    Out.println("Usage: jflex <options> <input-files>");
+    Out.println("");
+    Out.println("Where <options> can be one or more of");
+    Out.println("-d <directory>   write generated file to <directory>");
+    Out.println("--skel <file>    use external skeleton <file>");
+    Out.println("--switch");
+    Out.println("--table");
+    Out.println("--pack           set default code generation method");
+    Out.println("--jlex           strict JLex compatibility");
+    Out.println("--nomin          skip minimization step");
+    Out.println("--nobak          don't create backup files");
+    Out.println("--dump           display transition tables"); 
+    Out.println("--dot            write graphviz .dot files for the generated automata (alpha)");
+    Out.println("--verbose");
+    Out.println("-v               display generation progress messages (default)");
+    Out.println("--quiet");
+    Out.println("-q               display errors only");
+    Out.println("--time           display generation time statistics");
+    Out.println("--version        print the version number of this copy of jflex");
+    Out.println("--info           print system + JDK information");
+    Out.println("--help");
+    Out.println("-h               print this message");
+    Out.println("");
+    Out.println(ErrorMessages.THIS_IS_JFLEX, version); 
+    Out.println("Have a nice day!");
+  }
+
+
+  public static void generate(String argv[]) throws SilentExit {
+    Vector files = parseOptions(argv);
+
+    if (files.size() > 0) {
+      for (int i = 0; i < files.size(); i++) 
+        generate((File) files.elementAt(i));          
+    }
+    else {
+      new MainFrame();
+    }    
+  }
+
+
+  /**
+   * Starts the generation process with the files in <code>argv</code> or
+   * pops up a window to choose a file, when <code>argv</code> doesn't have
+   * any file entries.
+   *
+   * @param argv the commandline.
+   */
+  public static void main(String argv[]) {
+    try {
+      generate(argv);
+    }
+    catch (GeneratorException e) {
+      Out.statistics();
+      System.exit(1);
+    }
+    catch (SilentExit e) {
+      System.exit(1);
+    }
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Messages.properties
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Messages.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Messages.properties	(revision 25584)
@@ -0,0 +1,74 @@
+UNTERMINATED_STR = Unterminated string at end of line.
+EOF_WO_ACTION    = <<EOF>> must be followed by an action.
+EOF_SINGLERULE   = <<EOF>> can only be used as a single rule.
+UNKNOWN_OPTION   = Unkown %-option
+UNEXPECTED_CHAR  = Unexpected character 
+UNEXPECTED_NL    = Unexpected character <newline>
+LEXSTATE_UNDECL  = Lexical state has not been declared.
+STATE_IDENT_EXP  = State identifier expected.
+REPEAT_ZERO      = Illegal repeat statement. At least one operand must be > 0
+REPEAT_GREATER   = Illegal repeat statement. First operand must not be greater than second one.
+REGEXP_EXPECTED  = Regular expression expected.
+MACRO_UNDECL     = Macro has not been declared.
+CHARSET_2_SMALL  = Character set is too small for this class.
+CS2SMALL_STRING  = Character set is too small for a charactor of this string.
+CS2SMALL_CHAR    = Character set is too small for this character.
+CHARCLASS_MACRO  = Macros in character classes are not supported.
+UNKNOWN_SYNTAX   = Syntax error.
+SYNTAX_ERROR     = Syntax error.
+NOT_AT_BOL       = %-option is not at the beginning of the line.
+NO_MATCHING_BR   = Didn't find matching bracket
+EOF_IN_ACTION    = Unexpected end of file in action code
+EOF_IN_COMMENT   = Unexpected end of file in comment
+EOF_IN_STRING    = Unexpected end of file in string
+EOF_IN_MACROS    = Unexpected end of file in macros
+EOF_IN_STATES    = Unexpected end of file in state list
+EOF_IN_REGEXP    = Unexpected end of file in regular expression
+UNEXPECTED_EOF   = Unexpected end of file (maybe missing "*/" ")" "]" or "}")
+NO_LEX_SPEC      = This seems not to be a lexical specification (first %% is missing)
+NO_LAST_ACTION   = Last action in the specification must not be "|"
+NO_DIRECTORY     = No directory for -d option
+NO_SKEL_FILE     = No file provided for -skel option
+WRONG_SKELETON   = Incorrect skeleton file (wrong number of sections).
+OUT_OF_MEMORY    = JFlex has run out of memory. Please try increasing the maximum JVM heap size
+QUIL_INITTHROW   = %initthrow needs a list of (qualified) identifiers
+QUIL_EOFTHROW    = %eofthrow needs a list of (qualified) identifiers
+QUIL_YYLEXTHROW  = %yylexthrow needs a list of (qualified) identifiers
+ZERO_STATES      = Your scanner has zero states. Very funny.
+NO_BUFFER_SIZE   = %buffer expects the size of the scanner buffer as decimal number
+NOT_READABLE     = Could not open file.
+FILE_CYCLE       = Cyclic file inclusion.
+FILE_WRITE       = Error writing to file
+QUIL_SCANERROR   = %scannerror needs a (qualified) identifier
+NEVER_MATCH      = Rule can never be matched:
+QUIL_THROW       = %throws needs a list of (qualified) identifiers
+EOL_IN_CHARCLASS = Unexpected newline in character class (closing "]" is missing)
+QUIL_CUPSYM      = %cupsym needs a (qualified) identifier
+CUPSYM_AFTER_CUP = %cupsym should be used before %cup
+ALREADY_RUNNING  = The generator is already running
+CANNOT_READ_SKEL = Cannot read skeleton file "{0}".
+READING_SKEL     = Reading skeleton file "{0}".
+SKEL_IO_ERROR    = IO problem reading skeleton file.
+SKEL_IO_ERROR_DEFAULT = IO problem reading default skeleton file.
+READING=Reading "{0}"
+CANNOT_OPEN=Sorry, couldn''t find the file "{0}".
+NFA_IS=NFA is
+NFA_STATES={0} states in NFA
+DFA_TOOK=DFA construction took {0}
+DFA_IS=DFA is
+MIN_TOOK=Minimization took {0} 
+MIN_DFA_IS=Miniminal DFA is
+WRITE_TOOK=Writing took {0}
+TOTAL_TIME=Overall scanner generation time: {0}
+IO_ERROR=An I/O-Error occured: {0}
+THIS_IS_JFLEX=This is JFlex {0}
+UNKNOWN_COMMANDLINE=Error: unknown option "{0}".
+MACRO_CYCLE=Macro {0} contains a cycle.
+MACRO_DEF_MISSING=Found no definition for macro "{0}" while expanding "{1}"
+PARSING_TOOK=Parsing took {0}
+NFA_TOOK=NFA construction took {0}
+LOOKAHEAD_NEEDS_ACTION="|" action cannot be used with lookahead expressions
+EMPTY_MATCH = Lookahead expression must have match with at least length 1.
+CTOR_ARG = Expected an identifier for constructor argument name.
+CTOR_DEBUG = Emitting default constructor without parameters and init code for debug/standalone.
+INT_AND_TYPE = Scanner can't have int and reference return type at the same time.
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/NFA.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/NFA.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/NFA.java	(revision 25584)
@@ -0,0 +1,1052 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex;
+
+import java.util.*;
+import java.io.*;
+
+
+/**
+ * NFA representation in JFlex.
+ *
+ * Contains algorithms RegExp -> NFA and NFA -> DFA.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class NFA {
+
+  /** table[current_state][next_char] is the set of states that can be reached
+  /* from current_state with an input next_char */
+  StateSet [][] table;
+
+  /** epsilon[current_state] is the set of states that can be reached
+  /* from current_state via epsilon edges */
+  StateSet [] epsilon;
+
+  /** isFinal[state] == true <=> state is a final state of the NFA */
+  boolean [] isFinal;
+
+  /** action[current_state]: the action associated with the state 
+  /* current_state (null, if there is no action for the state) */
+  Action [] action;
+
+  /** the number of states in this NFA */
+  int numStates;
+
+  /** the current maximum number of input characters */
+  int numInput;
+
+  /** the number of lexical States. Lexical states have the indices
+  /* 0..numLexStates-1 in the transition table */
+  int numLexStates;
+
+  /** estimated size of the NFA (before actual construction) */
+  int estSize = 256;
+  
+  Macros macros;
+  CharClasses classes;
+
+  LexScan scanner;
+  RegExps regExps;
+
+  // will be reused by several methods (avoids excessive object creation)
+  private static StateSetEnumerator states = new StateSetEnumerator();
+  private static StateSet     tempStateSet = new StateSet();
+  
+  public NFA(int numInput, int estSize) {
+    this.numInput = numInput;
+    this.estSize = estSize;
+    numStates = 0;
+    epsilon = new StateSet [estSize];
+    action = new Action [estSize];
+    isFinal = new boolean [estSize];
+    table = new StateSet [estSize][numInput];
+  }
+
+  /** 
+   * Construct new NFA.
+   * 
+   * Assumes that lookahead cases and numbers are already resolved in RegExps.
+   * @see RegExps#checkLookAheads()
+   */ 
+  public NFA(int numInput, LexScan scanner, RegExps regExps, 
+             Macros macros, CharClasses classes) {
+    this(numInput, regExps.NFASize(macros)+2*scanner.states.number());
+
+    this.scanner = scanner;
+    this.regExps = regExps;
+    this.macros  = macros;
+    this.classes = classes;
+    
+    numLexStates = scanner.states.number();
+
+    // ensureCapacity assumes correctly set up numStates. 
+    int new_num = numEntryStates();
+    ensureCapacity(new_num);
+    numStates = new_num;
+  }
+    
+  public int numEntryStates() {
+    return 2*(numLexStates+regExps.gen_look_count);
+  }
+  
+  /**
+   * Add a standalone rule that has minimum priority, fires a transition
+   * on all single input characters and has a "print yytext" action.
+   */
+  public void addStandaloneRule() {
+    int start = numStates;
+    int end   = numStates+1;
+
+    for (int c = 0; c < classes.getNumClasses(); c++) 
+      addTransition(start, c, end);
+   
+    for (int i = 0; i < numLexStates*2; i++) 
+      addEpsilonTransition(i, start);
+
+    action[end]  = new Action("System.out.print(yytext());", Integer.MAX_VALUE);
+    isFinal[end] = true;    
+  }
+
+  /**
+   * Add a regexp to this NFA. 
+   * 
+   * @param regExpNum   the number of the regexp to add.
+   */
+  public void addRegExp(int regExpNum) {
+
+    if (Options.DEBUG)
+      Out.debug("Adding nfa for regexp "+regExpNum+" :"+Out.NL+regExps.getRegExp(regExpNum));
+    
+    IntPair nfa = insertNFA( regExps.getRegExp(regExpNum) );
+    
+    Enumeration lexStates = regExps.getStates(regExpNum).elements();
+    
+    if ( !lexStates.hasMoreElements() )
+      lexStates = scanner.states.getInclusiveStates();
+
+    while ( lexStates.hasMoreElements() ) {
+      int stateNum = ((Integer)lexStates.nextElement()).intValue();
+        
+      if ( !regExps.isBOL(regExpNum) )
+        addEpsilonTransition(2*stateNum, nfa.start);
+      
+      addEpsilonTransition(2*stateNum+1, nfa.start);        
+    }
+        
+        
+    if ( regExps.getLookAhead(regExpNum) != null ) {
+      Action a = regExps.getAction(regExpNum);
+
+      if (a.lookAhead() == Action.FINITE_CHOICE) {
+        insertLookAheadChoices(nfa.end, a, regExps.getLookAhead(regExpNum));
+        // remove the original action from the collection: it will never
+        // be matched directly, only its copies will.
+        scanner.actions.remove(a);
+      }
+      else {
+        RegExp r1 = regExps.getRegExp(regExpNum);
+        RegExp r2 = regExps.getLookAhead(regExpNum);
+  
+        IntPair look = insertNFA(r2);
+        
+        addEpsilonTransition(nfa.end, look.start);
+  
+        action[look.end]  = a;
+        isFinal[look.end] = true;
+  
+        if (a.lookAhead() == Action.GENERAL_LOOK) {
+          // base forward pass
+          IntPair forward = insertNFA(r1);
+          // lookahead backward pass
+          IntPair backward = insertNFA(r2.rev(macros));
+          
+          isFinal[forward.end] = true;
+          action[forward.end] = new Action(Action.FORWARD_ACTION);
+          
+          isFinal[backward.end] = true;
+          action[backward.end] = new Action(Action.BACKWARD_ACTION);
+          
+          int entry = 2*(regExps.getLookEntry(regExpNum) + numLexStates);
+          addEpsilonTransition(entry, forward.start);
+          addEpsilonTransition(entry+1, backward.start);
+          
+          a.setEntryState(entry);
+        }
+      }
+    }
+    else {
+      action[nfa.end] = regExps.getAction(regExpNum);
+      isFinal[nfa.end] = true;
+    }
+  }
+
+  /**
+   * Insert NFAs for the (finitely many) fixed length lookahead choices.
+   * 
+   * @param lookAhead   a lookahead of which isFiniteChoice is true
+   * @param baseEnd     the end state of the base expression NFA
+   * @param a           the action of the expression
+   *  
+   * @see SemCheck#isFiniteChoice(RegExp) 
+   */
+  private void insertLookAheadChoices(int baseEnd, Action a, RegExp lookAhead) {
+    if (lookAhead.type == sym.BAR) {
+      RegExp2 r = (RegExp2) lookAhead;
+      insertLookAheadChoices(baseEnd, a, r.r1);
+      insertLookAheadChoices(baseEnd, a, r.r2);
+    }
+    else if (lookAhead.type == sym.MACROUSE) {
+      RegExp1 r = (RegExp1) lookAhead;
+      insertLookAheadChoices(baseEnd, a, macros.getDefinition((String) r.content));
+    }
+    else {
+      int len = SemCheck.length(lookAhead);
+      
+      if (len >= 0) {
+        // termination case
+        IntPair look = insertNFA(lookAhead);
+        
+        addEpsilonTransition(baseEnd, look.start);
+  
+        Action x = a.copyChoice(len);
+        action[look.end]  = x;
+        isFinal[look.end] = true;
+        
+        // add new copy to the collection of known actions such that
+        // it can be checked for the NEVER_MATCH warning.
+        scanner.actions.add(x);
+      }
+      else {
+        // should never happen
+        throw new Error("When inserting lookahead expression: unkown expression type "+lookAhead.type+" in "+lookAhead); //$NON-NLS-1$ //$NON-NLS-2$
+      }
+    }
+  }
+
+  /**
+   * Make sure the NFA can contain at least newNumStates states. 
+   * 
+   * @param newNumStates  the minimu number of states. 
+   */
+  private void ensureCapacity(int newNumStates) {
+    int oldLength = epsilon.length;
+    
+    if ( newNumStates < oldLength ) return;
+      
+    int newStatesLength = Math.max(oldLength*2, newNumStates);
+
+    boolean [] newFinal   = new boolean [newStatesLength];
+    boolean [] newIsPush  = new boolean [newStatesLength];
+    Action  [] newAction  = new Action  [newStatesLength];
+    StateSet [] [] newTable = new StateSet [newStatesLength] [numInput];
+    StateSet [] newEpsilon  = new StateSet [newStatesLength];
+
+    System.arraycopy(isFinal,0,newFinal,0,numStates);
+    System.arraycopy(action,0,newAction,0,numStates);
+    System.arraycopy(epsilon,0,newEpsilon,0,numStates);
+    System.arraycopy(table,0,newTable,0,numStates);
+
+    isFinal     = newFinal;
+    action      = newAction;
+    epsilon     = newEpsilon;
+    table       = newTable;
+  }
+  
+  public void addTransition(int start, int input, int dest) {
+    Out.debug("Adding transition ("+start+", "+input+", "+dest+")");
+    
+    int maxS = Math.max(start,dest)+1;
+ 
+    ensureCapacity( maxS );
+
+    if (maxS > numStates) numStates = maxS;
+
+    if ( table[start][input] != null ) 
+      table[start][input].addState(dest); 
+    else 
+      table[start][input] = new StateSet(estSize,dest);
+  }
+
+  public void addEpsilonTransition(int start, int dest) {
+    int max = Math.max(start,dest)+1;
+    ensureCapacity( max );
+    if (max > numStates) numStates = max;
+
+    if (epsilon[start] != null)
+      epsilon[start].addState(dest); 
+    else
+      epsilon[start] = new StateSet(estSize,dest);
+  }
+
+
+  /**
+   * Returns <code>true</code>, iff the specified set of states
+   * contains a final state.
+   *
+   * @param set   the set of states that is tested for final states.
+   */
+  private boolean containsFinal(StateSet set) {
+    states.reset(set);
+
+    while ( states.hasMoreElements() ) 
+      if ( isFinal[states.nextElement()] ) return true;
+
+    return false;
+  }
+
+
+  /**
+   * Returns <code>true</code>, iff the specified set of states
+   * contains a pushback-state.
+   *
+   * @param set   the set of states that is tested for pushback-states.
+  private boolean containsPushback(StateSet set) {
+    states.reset(set);
+
+    while ( states.hasMoreElements() ) 
+      if ( isPushback[states.nextElement()] ) return true;
+
+    return false;
+  }
+  */
+
+  /**
+   * Returns the action with highest priority in the specified 
+   * set of states.
+   *
+   * @param set  the set of states for which to determine the action
+   */
+  private Action getAction(StateSet set) {
+
+    states.reset(set);
+    
+    Action maxAction = null;
+
+    Out.debug("Determining action of : "+set);
+
+    while ( states.hasMoreElements() ) {
+
+      Action currentAction = action[ states.nextElement() ];
+      
+      if ( currentAction != null ) {
+	      if (maxAction == null) 
+	        maxAction = currentAction;
+	      else
+	        maxAction = maxAction.getHigherPriority(currentAction);
+      }
+
+    }
+
+    return maxAction;
+  }
+
+
+  /**
+   * Calculates the epsilon closure for a specified set of states.
+   *
+   * The epsilon closure for set a is the set of states that can be reached 
+   * by epsilon edges from a.
+   *
+   * @param set the set of states to calculate the epsilon closure for
+   *
+   * @return the epsilon closure of the specified set of states 
+   *         in this NFA
+   */
+  private StateSet closure(int startState) {
+
+    // Out.debug("Calculating closure of "+set);
+
+    StateSet notvisited = tempStateSet;
+    StateSet closure = new StateSet(numStates,startState);
+
+    notvisited.clear();
+    notvisited.addState(startState);
+
+    while ( notvisited.containsElements() ) {
+      // Out.debug("closure is now "+closure);
+      // Out.debug("notvisited is "+notvisited);
+      int state = notvisited.getAndRemoveElement();
+      // Out.debug("removed element "+state+" of "+notvisited);
+      // Out.debug("epsilon[states] = "+epsilon[state]);
+      notvisited.add(closure.complement(epsilon[state]));
+      closure.add(epsilon[state]);
+    }
+
+    // Out.debug("Closure is : "+closure);
+
+    return closure;
+  }
+
+  /**
+   * Returns the epsilon closure of a set of states
+   */
+  private StateSet closure(StateSet startStates) {
+    StateSet result = new StateSet(numStates);
+
+    if (startStates != null) {      
+      states.reset(startStates);
+      while (states.hasMoreElements()) 
+        result.add( closure(states.nextElement()) );
+    }
+      
+    return result;
+  }
+  
+
+  private void epsilonFill() {
+    for (int i = 0; i < numStates; i++) {
+      epsilon[i] = closure(i);
+    }
+  }
+
+  /**
+   * Calculates the set of states that can be reached from another
+   * set of states <code>start</code> with an specified input 
+   * character <code>input</code>
+   *
+   * @param start the set of states to start from
+   * @param input the input character for which to search the next states
+   *
+   * @return the set of states that are reached from <code>start</code> 
+   *         via <code>input</code>
+   */
+  private StateSet DFAEdge(StateSet start, char input) {    
+    // Out.debug("Calculating DFAEdge for state set "+start+" and input '"+input+"'");
+
+    tempStateSet.clear();
+
+    states.reset(start);
+    while ( states.hasMoreElements() ) 
+      tempStateSet.add( table[states.nextElement()][input] );
+
+    StateSet result = new StateSet(tempStateSet);
+    
+    states.reset(tempStateSet);
+    while ( states.hasMoreElements() ) 
+      result.add( epsilon[states.nextElement()] );
+    
+    // Out.debug("DFAEdge is : "+result);
+
+    return result;
+  }
+
+  
+  /**
+   * Returns an DFA that accepts the same language as this NFA.
+   * This DFA is usually not minimal.
+   */
+  public DFA getDFA() {
+
+    Hashtable dfaStates = new Hashtable(numStates);
+    Vector dfaVector    = new Vector(numStates);
+
+    DFA dfa = new DFA(numEntryStates(), numInput, numLexStates);
+
+    int numDFAStates = 0;
+    int currentDFAState = 0;
+
+    Out.println("Converting NFA to DFA : ");
+
+    epsilonFill();
+
+    StateSet currentState, newState;
+    
+    // create the initial states of the DFA
+    for ( int i = 0;  i < numEntryStates();  i++ ) {
+      newState = epsilon[i];
+  
+      dfaStates.put(newState, new Integer(numDFAStates));
+      dfaVector.addElement(newState);
+  
+      dfa.setEntryState( i, numDFAStates );
+        
+      dfa.setFinal( numDFAStates, containsFinal(newState) );
+      dfa.setAction( numDFAStates, getAction(newState) );
+
+      numDFAStates++;
+    }
+     
+    numDFAStates--;
+
+    if (Options.DEBUG)
+      Out.debug("DFA start states are :"+Out.NL+dfaStates+Out.NL+Out.NL+"ordered :"+Out.NL+dfaVector);
+     
+    currentDFAState = 0;
+      
+    StateSet tempStateSet = NFA.tempStateSet;    
+    StateSetEnumerator states = NFA.states;
+
+    // will be reused
+    newState = new StateSet(numStates);
+
+    while ( currentDFAState <= numDFAStates ) {
+
+      currentState = (StateSet) dfaVector.elementAt(currentDFAState);
+
+      for (char input = 0; input < numInput; input++) {
+
+	      // newState = DFAEdge(currentState, input);
+
+        // inlining DFAEdge for performance:
+
+        // Out.debug("Calculating DFAEdge for state set "+currentState+" and input '"+input+"'");
+
+        tempStateSet.clear();        
+        states.reset(currentState);
+        while ( states.hasMoreElements() ) 
+          tempStateSet.add( table[states.nextElement()][input] );
+        
+        newState.copy(tempStateSet);
+        
+        states.reset(tempStateSet);
+        while ( states.hasMoreElements() ) 
+          newState.add( epsilon[states.nextElement()] );
+    
+        // Out.debug("DFAEdge is : "+newState);
+
+
+	      if ( newState.containsElements() ) {
+
+          // Out.debug("DFAEdge for input "+(int)input+" and state set "+currentState+" is "+newState);
+       
+	        // Out.debug("Looking for state set "+newState);
+	        Integer nextDFAState = (Integer) dfaStates.get(newState);
+
+	        if ( nextDFAState != null ) {
+	          // Out.debug("FOUND!");
+	          dfa.addTransition(currentDFAState, input, nextDFAState.intValue());
+	        }
+	        else {
+            if (Options.progress) Out.print(".");
+	          // Out.debug("NOT FOUND!");
+	          // Out.debug("Table was "+dfaStates);
+            numDFAStates++;
+
+            // make a new copy of newState to store in dfaStates
+            StateSet storeState = new StateSet(newState);
+
+	          dfaStates.put(storeState, new Integer(numDFAStates));
+	          dfaVector.addElement(storeState);
+	    
+	          dfa.addTransition(currentDFAState, input, numDFAStates);
+	          dfa.setFinal( numDFAStates, containsFinal(storeState) );
+	          dfa.setAction( numDFAStates, getAction(storeState) );
+	        }
+	      }
+      }
+      
+      currentDFAState++;     
+    }
+    
+    if (Options.verbose) Out.println("");
+
+    return dfa;
+  }
+
+
+  public void dumpTable() {
+    Out.dump(toString());
+  }
+
+  public String toString() {
+    StringBuffer result = new StringBuffer();
+
+    for (int i=0; i < numStates; i++) {
+      result.append("State");
+      if ( isFinal[i] ) {
+        result.append("[FINAL");
+        String l = action[i].lookString();
+        if (!l.equals("")) {
+          result.append(", ");
+          result.append(l);        
+        }
+        result.append("]");
+      }
+      result.append(" "+i+Out.NL);
+      
+      for (char input = 0; input < numInput; input++) {
+	      if ( table[i][input] != null && table[i][input].containsElements() ) 
+	        result.append("  with "+((int) input)+" in "+table[i][input]+Out.NL);	
+        }
+
+      if ( epsilon[i] != null && epsilon[i].containsElements() ) 
+	      result.append("  with epsilon in "+epsilon[i]+Out.NL);
+    }    
+    
+    return result.toString();
+  }
+
+  public void writeDot(File file) {
+    try {
+      PrintWriter writer = new PrintWriter(new FileWriter(file));
+      writer.println(dotFormat());
+      writer.close();
+    }
+    catch (IOException e) {
+      Out.error(ErrorMessages.FILE_WRITE, file);
+      throw new GeneratorException();
+    }
+  }
+
+  public String dotFormat() {
+    StringBuffer result = new StringBuffer();
+
+    result.append("digraph NFA {"+Out.NL);
+    result.append("rankdir = LR"+Out.NL);
+
+    for (int i=0; i < numStates; i++) {
+      if ( isFinal[i] ) {
+          result.append(i);
+          result.append(" [shape = doublecircle]");
+          result.append(Out.NL);
+      }      
+    }
+
+    for (int i=0; i < numStates; i++) {
+      for (int input = 0; input < numInput; input++) {
+	      if ( table[i][input] != null ) {
+          StateSetEnumerator states = table[i][input].states();
+        
+          while (states.hasMoreElements()) {
+            int s = states.nextElement();
+            result.append(i+" -> "+s);
+            result.append(" [label=\""+classes.toString(input)+"\"]"+Out.NL);
+          }
+        }
+      }
+      if ( epsilon[i] != null ) {
+        StateSetEnumerator states = epsilon[i].states();
+        while (states.hasMoreElements()) {
+          int s = states.nextElement();
+          result.append(i+" -> "+s+" [style=dotted]"+Out.NL);
+        }
+      }
+    }
+
+    result.append("}"+Out.NL);
+
+    return result.toString();
+  }
+
+
+  //-----------------------------------------------------------------------
+  // Functions for constructing NFAs out of regular expressions.
+
+  private void insertLetterNFA(boolean caseless, char letter, int start, int end) {
+    if (caseless) {
+      int lower = classes.getClassCode(Character.toLowerCase(letter));
+      int upper = classes.getClassCode(Character.toUpperCase(letter));
+      addTransition(start, lower, end);
+      if (upper != lower) addTransition(start, upper, end);
+    }
+    else {
+      addTransition(start, classes.getClassCode(letter), end);
+    }
+  }
+  
+  private IntPair insertStringNFA(boolean caseless, String letters) {
+    int start = numStates;
+    int i;
+
+    for (i = 0; i < letters.length(); i++) {
+      if (caseless) {
+        char c = letters.charAt(i);
+        int lower = classes.getClassCode(Character.toLowerCase(c));
+        int upper = classes.getClassCode(Character.toUpperCase(c));
+        addTransition(i+start, lower, i+start+1);
+        if (upper != lower) addTransition(i+start, upper, i+start+1);
+      }
+      else {
+        addTransition(i+start, classes.getClassCode(letters.charAt(i)), i+start+1);
+      }
+    }
+
+    return new IntPair(start, i+start);
+  }
+  
+
+  private void insertClassNFA(Vector intervalls, int start, int end) {
+    // empty char class is ok:
+    if (intervalls == null) return;
+
+    int [] cl = classes.getClassCodes(intervalls);    
+    for (int i = 0; i < cl.length; i++) 
+      addTransition(start, cl[i], end);
+  }
+
+  private void insertNotClassNFA(Vector intervalls, int start, int end) {
+    int [] cl = classes.getNotClassCodes(intervalls);
+
+    for (int i = 0; i < cl.length; i++) 
+      addTransition(start, cl[i], end);
+  }
+  
+
+  /**
+   * Constructs an NFA accepting the complement of the language
+   * of a given NFA.
+   *
+   * Converts the NFA into a DFA, then negates that DFA.
+   * Exponential state blowup possible and common.
+   *
+   * @param the NFA to construct the complement for.
+   *
+   * @return a pair of integers denoting the index of start
+   *         and end state of the complement NFA.
+   */
+  private IntPair complement(IntPair nfa) {
+
+    if (Options.DEBUG) {
+      Out.debug("complement for "+nfa);
+      Out.debug("NFA is :"+Out.NL+this);
+    }
+
+    int dfaStart = nfa.end+1; 
+    
+    // FIXME: only need epsilon closure of states reachable from nfa.start
+    epsilonFill();
+    
+    Hashtable dfaStates = new Hashtable(numStates);
+    Vector dfaVector    = new Vector(numStates);
+
+    int numDFAStates = 0;
+    int currentDFAState = 0;
+
+    StateSet currentState, newState;
+    
+    newState = epsilon[nfa.start];
+    dfaStates.put(newState, new Integer(numDFAStates));
+    dfaVector.addElement(newState);
+
+    if (Options.DEBUG)
+      Out.debug("pos DFA start state is :"+Out.NL+dfaStates+Out.NL+Out.NL+"ordered :"+Out.NL+dfaVector);
+     
+    currentDFAState = 0;
+      
+    while ( currentDFAState <= numDFAStates ) {
+
+      currentState = (StateSet) dfaVector.elementAt(currentDFAState);
+
+      for (char input = 0; input < numInput; input++) {
+	      newState = DFAEdge(currentState, input);
+
+	      if ( newState.containsElements() ) {
+
+          // Out.debug("DFAEdge for input "+(int)input+" and state set "+currentState+" is "+newState);
+       
+	        // Out.debug("Looking for state set "+newState);
+	        Integer nextDFAState = (Integer) dfaStates.get(newState);
+
+	        if ( nextDFAState != null ) {
+	          // Out.debug("FOUND!");
+            addTransition(dfaStart+currentDFAState, input, dfaStart+nextDFAState.intValue());
+	        }
+	        else {
+            if (Options.dump) Out.print("+");
+	          // Out.debug("NOT FOUND!");
+	          // Out.debug("Table was "+dfaStates);
+            numDFAStates++;
+
+	          dfaStates.put(newState, new Integer(numDFAStates));
+	          dfaVector.addElement(newState);
+
+            addTransition(dfaStart+currentDFAState, input, dfaStart+numDFAStates);
+	        }
+	      }
+      }
+      
+      currentDFAState++;     
+    }   
+    
+    // We have a dfa accepting the positive regexp. 
+
+    // Now the complement:    
+    if (Options.DEBUG) 
+      Out.debug("dfa finished, nfa is now :"+Out.NL+this);
+
+    int start = dfaStart+numDFAStates+1;
+    int error = dfaStart+numDFAStates+2;
+    int end   = dfaStart+numDFAStates+3; 
+
+    addEpsilonTransition(start, dfaStart);
+
+    for (int i = 0; i < numInput; i++)
+      addTransition(error, i, error);
+
+    addEpsilonTransition(error, end);
+
+    for (int s = 0; s <= numDFAStates; s++) {
+      currentState = (StateSet) dfaVector.elementAt(s);
+      
+      currentDFAState = dfaStart+s;
+
+      // if it was not a final state, it is now in the complement
+      if (!currentState.isElement(nfa.end)) 
+        addEpsilonTransition(currentDFAState, end);
+
+      // all inputs not present (formerly leading to an implicit error)
+      // now lead to an explicit (final) state accepting everything.
+      for (int i = 0; i < numInput; i++)
+        if (table[currentDFAState][i] == null)
+          addTransition(currentDFAState, i, error);
+    }
+
+    // eliminate transitions leading to dead states
+    if (live == null || live.length < numStates) {
+      live    = new boolean [2*numStates];
+      visited = new boolean [2*numStates];
+    }
+
+    removeDead(dfaStart, end);
+
+    if (Options.DEBUG)
+      Out.debug("complement finished, nfa ("+start+","+end+") is now :"+this);
+
+    return new IntPair(start, end);
+  }
+
+  // "global" data for use in method removeDead only:
+  // live[s] == false <=> no final state can be reached from s
+  private boolean [] live;    // = new boolean [estSize];
+  private boolean [] visited; // = new boolean [estSize];
+
+  private void removeDead(int start, int end) {
+    // Out.debug("removeDead ("+start+")");
+
+    if ( visited[start] || live[start] ) return;
+    visited[start] = true;
+
+    // Out.debug("not yet visited");
+
+    if (closure(start).isElement(end))
+      live[start] = true;
+
+    // Out.debug("is final :"+live[start]);
+
+    for (int i = 0; i < numInput; i++) {
+      StateSet nextState = closure(table[start][i]);
+      StateSetEnumerator states = nextState.states();
+      while (states.hasMoreElements()) {
+        int next = states.nextElement();
+        
+        if (next != start) {
+          removeDead(next,end);
+          
+          if (live[next]) 
+            live[start] = true;
+          else
+            table[start][i] = null;        
+        }
+      }
+    }
+
+    StateSet nextState = closure(epsilon[start]);
+    StateSetEnumerator states = nextState.states();
+    while (states.hasMoreElements()) {
+      int next = states.nextElement();
+      
+      if (next != start) {
+        removeDead(next,end);
+        
+        if (live[next]) 
+          live[start] = true;
+      }
+    }
+    
+    // Out.debug("state "+start+" is live :"+live[start]);
+  }
+
+
+  /**
+   * Constructs a two state NFA for char class regexps, 
+   * such that the NFA has
+   *
+   *   exactly one start state,
+   *   exactly one end state,
+   *   no transitions leading out of the end state
+   *   no transitions leading into the start state
+   *
+   * Assumes that regExp.isCharClass(macros) == true
+   *   
+   * @param regExp the regular expression to construct the 
+   *        NFA for 
+   * 
+   * @return a pair of integers denoting the index of start
+   *         and end state of the NFA.
+   */
+  private void insertCCLNFA(RegExp regExp, int start, int end) {    
+    switch (regExp.type) {
+      
+    case sym.BAR:
+      RegExp2 r = (RegExp2) regExp;      
+      insertCCLNFA(r.r1, start, end);
+      insertCCLNFA(r.r2, start, end);
+      return;
+            
+    case sym.CCLASS:
+      insertClassNFA( (Vector) ((RegExp1) regExp).content, start, end);
+      return;
+      
+    case sym.CCLASSNOT:
+      insertNotClassNFA( (Vector) ((RegExp1) regExp).content, start, end);
+      return;
+      
+    case sym.CHAR:
+      insertLetterNFA(
+        false, ((Character) ((RegExp1) regExp).content).charValue(),
+        start, end);
+      return;
+      
+    case sym.CHAR_I:
+      insertLetterNFA(
+       true, ((Character) ((RegExp1) regExp).content).charValue(),
+       start, end);
+      return;
+      
+    case sym.MACROUSE:
+      insertCCLNFA(macros.getDefinition((String) ((RegExp1) regExp).content), 
+                start, end);
+      return;
+    }
+    
+    throw new Error("Unknown expression type "+regExp.type+" in NFA construction");
+  }
+
+
+  /**
+   * Constructs an NFA for regExp such that the NFA has
+   *
+   *   exactly one start state,
+   *   exactly one end state,
+   *   no transitions leading out of the end state
+   *   no transitions leading into the start state
+   *  
+   * @param regExp the regular expression to construct the 
+   *        NFA for 
+   * 
+   * @return a pair of integers denoting the index of start
+   *         and end state of the NFA.
+   */
+  public IntPair insertNFA(RegExp regExp) {
+    
+    IntPair nfa1, nfa2;
+    int start, end;
+    RegExp2 r;
+    
+    if (Options.DEBUG)
+      Out.debug("Inserting RegExp : "+regExp);
+    
+    if (regExp.isCharClass(macros)) {
+      start = numStates;
+      end   = numStates+1;
+
+      ensureCapacity(end+1);
+      if (end+1 > numStates) numStates = end+1;
+      
+      insertCCLNFA(regExp, start, end);
+
+      return new IntPair(start, end);
+    }
+    
+    switch (regExp.type) {
+      
+    case sym.BAR:
+      
+      r = (RegExp2) regExp;
+      
+      nfa1 = insertNFA(r.r1);
+      nfa2 = insertNFA(r.r2);
+      
+      start = nfa2.end+1;
+      end   = nfa2.end+2;
+      
+      addEpsilonTransition(start, nfa1.start);
+      addEpsilonTransition(start, nfa2.start);
+      addEpsilonTransition(nfa1.end, end);
+      addEpsilonTransition(nfa2.end, end);
+      
+      return new IntPair(start, end);
+      
+    case sym.CONCAT:
+        
+      r = (RegExp2) regExp;
+        
+      nfa1 = insertNFA(r.r1);
+      nfa2 = insertNFA(r.r2);
+      
+      addEpsilonTransition(nfa1.end, nfa2.start);
+      
+      return new IntPair(nfa1.start, nfa2.end);
+      
+    case sym.STAR:
+      nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content );
+      
+      start = nfa1.end+1;
+      end   = nfa1.end+2;               
+      
+      addEpsilonTransition(nfa1.end, end);     
+      addEpsilonTransition(start, nfa1.start);
+      
+      addEpsilonTransition(start, end);
+      addEpsilonTransition(nfa1.end, nfa1.start);
+      
+      return new IntPair(start, end);
+      
+    case sym.PLUS:
+      nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content );
+      
+      start = nfa1.end+1;
+      end   = nfa1.end+2;               
+      
+      addEpsilonTransition(nfa1.end, end);     
+      addEpsilonTransition(start, nfa1.start);
+      
+      addEpsilonTransition(nfa1.end, nfa1.start);
+      
+      return new IntPair(start, end);
+      
+    case sym.QUESTION:
+      nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content );
+      
+      addEpsilonTransition(nfa1.start, nfa1.end);
+      
+      return new IntPair(nfa1.start, nfa1.end);
+      
+    case sym.BANG:
+      return complement(insertNFA((RegExp) ((RegExp1) regExp).content));
+
+    case sym.TILDE:
+      return insertNFA(regExp.resolveTilde(macros));
+      
+    case sym.STRING:
+      return insertStringNFA(false, (String) ((RegExp1) regExp).content );
+
+    case sym.STRING_I:
+      return insertStringNFA(true, (String) ((RegExp1) regExp).content );
+      
+    case sym.MACROUSE:
+      return insertNFA(macros.getDefinition((String) ((RegExp1) regExp).content));
+    }
+    
+    throw new Error("Unknown expression type "+regExp.type+" in NFA construction");
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Options.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Options.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Options.java	(revision 25584)
@@ -0,0 +1,126 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.io.File;
+
+/**
+ * Collects all global JFlex options. Can be set from command line parser,
+ * ant taks, gui, etc.
+ * 
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class Options {
+
+  /** If true, additional verbose debug information is produced
+   *  This is a compile time option */
+  public final static boolean DEBUG = false;
+
+	/** code generation method: maximum packing */
+	final public static int PACK   = 0;
+	/** code generation method: traditional */
+	final public static int TABLE  = 1;
+	/** code generation method: switch statement */
+	final public static int SWITCH = 2;
+
+
+	/** output directory */
+	private static File directory;
+  /** strict JLex compatibility */
+  public static boolean jlex;
+  /** don't run minimization algorithm if this is true */
+  public static boolean no_minimize; 
+  /** don't write backup files if this is true */
+  public static boolean no_backup; 
+  /** default code generation method */
+  public static int gen_method;
+  /** If false, only error/warning output will be generated */
+  public static boolean verbose;
+  /** If true, progress dots will be printed */
+  public static boolean progress;
+  /** If true, jflex will print time statistics about the generation process */
+  public static boolean time;
+  /** If true, jflex will write graphviz .dot files for generated automata */
+  public static boolean dot;
+  /** If true, you will be flooded with information (e.g. dfa tables).  */
+  public static boolean dump;
+
+	static { setDefaults();	}
+
+
+  /**
+   * @return the output directory
+   */
+  public static File getDir() {    
+    return directory;
+  }
+
+  /**
+   * Set output directory
+   * 
+   * @param dirName the name of the directory to write output files to
+   */
+  public static void setDir(String dirName) {
+  	setDir(new File(dirName)); 
+  }
+  
+
+	/**
+	 * Set output directory
+	 * 
+	 * @param d  the directory to write output files to
+	 */
+  public static void setDir(File d) {
+    if ( d.isFile() ) {
+      Out.error("Error: \""+d+"\" is not a directory.");
+      throw new GeneratorException();
+    }
+    
+    if ( !d.isDirectory() && !d.mkdirs() ) {
+      Out.error("Error: couldn't create directory \""+d+"\"");
+      throw new GeneratorException();
+    }
+  
+    directory = d;
+  }
+
+  /**
+   * Sets all options back to default values. 
+   */
+  public static void setDefaults() {
+  	directory = null;
+    jlex = false;
+		no_minimize = false;
+		no_backup = false;
+		gen_method = Options.PACK;    
+    verbose = true;
+    progress = true;
+    time = false;
+    dot = false;
+    dump = false;
+    Skeleton.readDefault();
+  }
+
+  public static void setSkeleton(File skel) {
+    Skeleton.readSkelFile(skel);
+  }   
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Out.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Out.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Out.java	(revision 25584)
@@ -0,0 +1,461 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+import java.io.*;
+import java.awt.TextArea;
+
+
+/**
+ * In this class all output to the java console is filtered.
+ *
+ * Use the switches verbose, time and DUMP at compile time to determine
+ * the verbosity of JFlex output. There is no switch for
+ * suppressing error messages. verbose and time can be overridden 
+ * by command line paramters.
+ *
+ * Redirects output to a TextArea in GUI mode.
+ *
+ * Counts error and warning messages.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public final class Out {
+
+  /** platform dependent newline sequence */
+  public static final String NL = System.getProperty("line.separator");
+  
+  /** count total warnings */
+  private static int warnings;
+
+  /** count total errors */
+  private static int errors;
+
+  /** output device */
+  private static StdOutWriter out = new StdOutWriter();
+
+
+  /**
+   * Switches to GUI mode if <code>text</code> is not <code>null</code>
+   *
+   * @param text  the message TextArea of the JFlex GUI
+   */
+  public static void setGUIMode(TextArea text) {
+    out.setGUIMode(text);
+  }
+  
+  /**
+   * Sets a new output stream and switches to non-gui mode.
+   * 
+   * @param stream  the new output stream
+   */
+  public static void setOutputStream(OutputStream stream) {
+    out = new StdOutWriter(stream);
+    out.setGUIMode(null);
+  }
+
+  /**
+   * Report time statistic data.
+   *
+   * @param message  the message to be printed
+   * @param time     elapsed time
+   */
+  public static void time(ErrorMessages message, Timer time) {
+    if (Options.time) {
+      String msg = ErrorMessages.get(message, time.toString());
+      out.println(msg);
+    } 
+  }
+  
+  /**
+   * Report time statistic data.
+   *
+   * @param message  the message to be printed
+   */
+  public static void time(String message) {
+    if (Options.time) {
+      out.println(message);
+    } 
+  }
+
+  /**
+   * Report generation progress.
+   *
+   * @param message  the message to be printed
+   */
+  public static void println(String message) {
+    if (Options.verbose) 
+      out.println(message);
+  }
+
+  /**
+   * Report generation progress.
+   *
+   * @param message  the message to be printed
+   * @param data     data to be inserted into the message
+   */
+  public static void println(ErrorMessages message, String data) {
+    if (Options.verbose) {      
+      out.println(ErrorMessages.get(message,data));
+    }
+  }
+
+  /**
+   * Report generation progress.
+   *
+   * @param message  the message to be printed
+   * @param data     data to be inserted into the message
+   */
+  public static void println(ErrorMessages message, int data) {
+    if (Options.verbose) {      
+      out.println(ErrorMessages.get(message,data));
+    }
+  }
+
+  /**
+   * Report generation progress.
+   *
+   * @param message  the message to be printed
+   */
+  public static void print(String message) {
+    if (Options.verbose) out.print(message);
+  }
+
+  /**
+   * Dump debug information to System.out
+   *
+   * Use like this 
+   *
+   * <code>if (Out.DEBUG) Out.debug(message)</code>
+   *
+   * to save performance during normal operation (when DEBUG
+   * is turned off).
+   */
+  public static void debug(String message) {
+    if (Options.DEBUG) System.out.println(message); 
+  }
+
+
+  /**
+   * All parts of JFlex, that want to provide dump information
+   * should use this method for their output.
+   *
+   * @message the message to be printed 
+   */
+  public static void dump(String message) {
+    if (Options.dump) out.println(message);
+  }
+
+  
+  /**
+   * All parts of JFlex, that want to report error messages
+   * should use this method for their output.
+   *
+   * @message  the message to be printed
+   */
+  private static void err(String message) {
+    out.println(message);
+  }
+  
+  
+  /**
+   * throws a GeneratorException if there are any errors recorded
+   */
+  public static void checkErrors() {
+    if (errors > 0) throw new GeneratorException();
+  }
+  
+
+  /**
+   * print error and warning statistics
+   */
+  public static void statistics() {    
+    StringBuffer line = new StringBuffer(errors+" error");
+    if (errors != 1) line.append("s");
+
+    line.append(", "+warnings+" warning");
+    if (warnings != 1) line.append("s");
+
+    line.append(".");
+    err(line.toString());
+  }
+
+
+  /**
+   * reset error and warning counters
+   */
+  public static void resetCounters() {
+    errors = 0;
+    warnings = 0;
+  }
+
+  
+  /**
+   * print a warning without position information
+   *
+   * @param message   the warning message
+   */  
+  public static void warning(String message) {
+    warnings++;
+
+    err(NL+"Warning : "+message);
+  }
+
+
+  /**
+   * print a warning with line information
+   *
+   * @param message  code of the warning message
+   * @param line     the line information
+   *
+   * @see ErrorMessages
+   */
+  public static void warning(ErrorMessages message, int line) {
+    warnings++;
+
+    String msg = NL+"Warning";
+    if (line > 0) msg = msg+" in line "+(line+1);
+
+    err(msg+": "+ErrorMessages.get(message));
+  }
+
+
+  /**
+   * print warning message with location information
+   *
+   * @param file     the file the warning is issued for
+   * @param message  the code of the message to print
+   * @param line     the line number of the position
+   * @param column   the column of the position
+   */
+  public static void warning(File file, ErrorMessages message, int line, int column) {
+
+    String msg = NL+"Warning";
+    if (file != null) msg += " in file \""+file+"\"";
+    if (line >= 0) msg = msg+" (line "+(line+1)+")";
+
+    try {
+      err(msg+": "+NL+ErrorMessages.get(message));
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      err(msg);
+    }
+
+    warnings++;
+
+    if (line >= 0) {
+      if (column >= 0)
+        showPosition(file, line, column);
+      else 
+        showPosition(file, line);
+    }
+  }
+
+  
+  /**
+   * print error message (string)
+   *
+   * @param message  the message to print
+   */
+  public static void error(String message) {
+    errors++;
+    err(NL+message);
+  }
+
+
+  /**
+   * print error message (code)
+   *  
+   * @param message  the code of the error message
+   *
+   * @see ErrorMessages   
+   */ 
+  public static void error(ErrorMessages message) {
+    errors++;
+    err(NL+"Error: "+ErrorMessages.get(message) );
+  }
+
+
+  /**
+   * print error message with data 
+   *  
+   * @param data     data to insert into the message
+   * @param message  the code of the error message
+   *
+   * @see ErrorMessages   
+   */ 
+  public static void error(ErrorMessages message, String data) {
+    errors++;    
+    err(NL+"Error: "+ ErrorMessages.get(message,data));
+  }
+
+
+  /**
+   * IO error message for a file (displays file 
+   * name in parentheses).
+   *
+   * @param message  the code of the error message
+   * @param file     the file it occurred for
+   */
+  public static void error(ErrorMessages message, File file) {
+    errors++;
+    err(NL+"Error: "+ErrorMessages.get(message)+" ("+file+")");
+  }
+
+
+  /**
+   * print error message with location information
+   *
+   * @param file     the file the error occurred for
+   * @param message  the code of the error message to print
+   * @param line     the line number of error position
+   * @param column   the column of error position
+   */
+  public static void error(File file, ErrorMessages message, int line, int column) {
+
+    String msg = NL+"Error";
+    if (file != null) msg += " in file \""+file+"\"";
+    if (line >= 0) msg = msg+" (line "+(line+1)+")";
+
+    try {
+      err(msg+": "+NL+ErrorMessages.get(message));
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      err(msg);
+    }
+
+    errors++;
+
+    if (line >= 0) {
+      if (column >= 0)
+        showPosition(file, line, column);
+      else 
+        showPosition(file, line);
+    }
+  }
+
+
+  /**
+   * prints a line of a file with marked position.
+   *
+   * @param file    the file of which to show the line
+   * @param line    the line to show
+   * @param column  the column in which to show the marker
+   */
+  public static void showPosition(File file, int line, int column) {
+    try {
+      String ln = getLine(file, line);
+      if (ln != null) {
+        err( ln );
+
+        if (column < 0) return;
+        
+        String t = "^";  
+        for (int i = 0; i < column; i++) t = " "+t;  
+        
+        err(t);
+      }
+    }
+    catch (IOException e) {
+      /* silently ignore IO errors, don't show anything */
+    }
+  }
+
+
+  /**
+   * print a line of a file
+   *
+   * @param file  the file to show
+   * @param line  the line number 
+   */
+  public static void showPosition(File file, int line) {
+    try {
+      String ln = getLine(file, line);
+      if (ln != null) err(ln);
+    }
+    catch (IOException e) {
+      /* silently ignore IO errors, don't show anything */
+    }
+  }
+
+
+  /**
+   * get one line from a file 
+   *
+   * @param file   the file to read
+   * @param line   the line number to get
+   *
+   * @throw IOException  if any error occurs
+   */
+  private static String getLine(File file, int line) throws IOException {
+    BufferedReader reader = new BufferedReader(new FileReader(file));
+
+    String msg = "";
+
+    for (int i = 0; i <= line; i++)
+      msg = reader.readLine();
+
+    reader.close();
+    
+    return msg;
+  }
+
+
+  /**
+   * Print system information (e.g. in case of unexpected exceptions)
+   */
+  public static void printSystemInfo() {
+    err("Java version:  "+System.getProperty("java.version"));
+    err("Runtime name:  "+System.getProperty("java.runtime.name"));
+    err("Vendor:        "+System.getProperty("java.vendor")); 
+    err("VM version:    "+System.getProperty("java.vm.version")); 
+    err("VM vendor:     "+System.getProperty("java.vm.vendor"));
+    err("VM name:       "+System.getProperty("java.vm.name"));
+    err("VM info:       "+System.getProperty("java.vm.info"));
+    err("OS name:       "+System.getProperty("os.name"));
+    err("OS arch:       "+System.getProperty("os.arch"));
+    err("OS version:    "+System.getProperty("os.version"));
+    err("Encoding:      "+System.getProperty("file.encoding"));
+    err("JFlex version: "+Main.version);
+  }
+
+
+  /**
+   * Request a bug report for an unexpected Exception/Error.
+   */
+  public static void requestBugReport(Error e) {
+    err("An unexpected error occurred. Please send a report of this to");
+    err("<bugs@jflex.de> and include the following information:");
+    err("");
+    printSystemInfo();
+    err("Exception:");
+    e.printStackTrace(out);
+    err("");
+    err("Please also include a specification (as small as possible)");
+    err("that triggers this error. You may also want to check at");
+    err("http://www.jflex.de if there is a newer version available");
+    err("that doesn't have this problem");
+    err("");
+    err("Thanks for your support.");
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/PackEmitter.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/PackEmitter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/PackEmitter.java	(revision 25584)
@@ -0,0 +1,230 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * jflex 1.4                                                               *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * Encodes <code>int</code> arrays as strings.
+ * 
+ * Also splits up strings when longer than 64K in UTF8 encoding.
+ * Subclasses emit unpacking code.
+ * 
+ * Usage protocol:
+ * <code>p.emitInit();</code><br>
+ * <code>for each data: p.emitData(data);</code><br>
+ * <code>p.emitUnpack();</code> 
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public abstract class PackEmitter {
+
+  /** name of the generated array (mixed case, no yy prefix) */
+  protected String name;
+    
+  /** current UTF8 length of generated string in current chunk */
+  private int UTF8Length;
+
+  /** position in the current line */
+  private int linepos;
+  
+  /** max number of entries per line */
+  private static final int maxEntries = 16;
+  
+  /** output buffer */
+  protected StringBuffer out = new StringBuffer();
+
+  /** number of existing string chunks */ 
+  protected int chunks;
+    
+  /** maximum size of chunks */
+  // String constants are stored as UTF8 with 2 bytes length
+  // field in class files. One Unicode char can be up to 3 
+  // UTF8 bytes. 64K max and two chars safety. 
+  private static final int maxSize = 0xFFFF-6;
+  
+  /** indent for string lines */
+  private static final String indent = "    ";
+  
+  /**
+   * Create new emitter for an array.
+   * 
+   * @param name  the name of the generated array
+   */
+  public PackEmitter(String name) {
+    this.name = name;
+  }
+  
+  /**
+   * Convert array name into all uppercase internal scanner 
+   * constant name.
+   * 
+   * @return <code>name</code> as a internal constant name.
+   * @see PackEmitter#name
+   */
+  protected String constName() {
+    return "ZZ_" + name.toUpperCase();
+  }
+  
+  /**
+   * Return current output buffer.
+   */
+  public String toString() {
+    return out.toString();
+  }
+
+  /**
+   * Emit declaration of decoded member and open first chunk.
+   */  
+  public void emitInit() {
+    out.append("  private static final int [] ");
+    out.append(constName());
+    out.append(" = zzUnpack");
+    out.append(name);
+    out.append("();");
+    nl();
+    nextChunk();
+  }
+
+  /**
+   * Emit single unicode character. 
+   * 
+   * Updates length, position, etc.
+   *
+   * @param i  the character to emit.
+   * @prec  0 <= i <= 0xFFFF 
+   */   
+  public void emitUC(int i) {     
+    if (i < 0 || i > 0xFFFF) 
+      throw new IllegalArgumentException("character value expected");
+  
+    // cast ok because of prec  
+    char c = (char) i;    
+     
+    printUC(c);
+    UTF8Length += UTF8Length(c);
+    linepos++;   
+  }
+
+  /**
+   * Execute line/chunk break if necessary. 
+   * Leave space for at least two chars.
+   */  
+  public void breaks() {
+    if (UTF8Length >= maxSize) {
+      // close current chunk
+      out.append("\";");
+      nl();
+      
+      nextChunk();
+    }
+    else {
+      if (linepos >= maxEntries) {
+        // line break
+        out.append("\"+");
+        nl();
+        out.append(indent);
+        out.append("\"");
+        linepos = 0;      
+      }
+    }
+  }
+  
+  /**
+   * Emit the unpacking code. 
+   */
+  public abstract void emitUnpack();
+
+  /**
+   *  emit next chunk 
+   */
+  private void nextChunk() {
+    nl();
+    out.append("  private static final String ");
+    out.append(constName());
+    out.append("_PACKED_");
+    out.append(chunks);
+    out.append(" =");
+    nl();
+    out.append(indent);
+    out.append("\"");
+
+    UTF8Length = 0;
+    linepos = 0;
+    chunks++;
+  }
+  
+  /**
+   *  emit newline 
+   */
+  protected void nl() {
+    out.append(Out.NL);
+  }
+  
+  /**
+   * Append a unicode/octal escaped character 
+   * to <code>out</code> buffer.
+   * 
+   * @param c the character to append
+   */
+  private void printUC(char c) {
+    if (c > 255) {
+      out.append("\\u");
+      if (c < 0x1000) out.append("0");
+      out.append(Integer.toHexString(c));
+    }
+    else {
+      out.append("\\");
+      out.append(Integer.toOctalString(c));
+    }
+  } 
+
+  /**
+   * Calculates the number of bytes a Unicode character
+   * would have in UTF8 representation in a class file.
+   *
+   * @param value  the char code of the Unicode character
+   * @prec  0 <= value <= 0xFFFF
+   *
+   * @return length of UTF8 representation.
+   */
+  private int UTF8Length(char value) {
+    // if (value < 0 || value > 0xFFFF) throw new Error("not a char value ("+value+")");
+
+    // see JVM spec section 4.4.7, p 111
+    if (value == 0) return 2;
+    if (value <= 0x7F) return 1;
+
+    // workaround for javac bug (up to jdk 1.3):
+    if (value <  0x0400) return 2;
+    if (value <= 0x07FF) return 3;
+
+    // correct would be:
+    // if (value <= 0x7FF) return 2;
+    return 3;
+  }
+
+  // convenience
+  protected void println(String s) {
+    out.append(s);
+    nl();
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp.java	(revision 25584)
@@ -0,0 +1,332 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.util.Vector;
+
+/**
+ * Stores a regular expression of rules section in a JFlex-specification.
+ *
+ * This base class has no content other than its type. 
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class RegExp {
+  
+  /**
+   * The type of the regular expression. This field will be
+   * filled with values from class sym.java (generated by cup)
+   */
+  int type;
+  
+
+  /**
+   * Create a new regular expression of the specified type.
+   *
+   * @param type   a value from the cup generated class sym.
+   *
+   * @see JFlex.sym
+   */
+  public RegExp(int type) {
+    this.type = type;    
+  }
+
+  
+
+  /**
+   * Returns a String-representation of this regular expression
+   * with the specified indentation.
+   *
+   * @param tab   a String that should contain only space characters and
+   *              that is inserted in front of standard String-representation
+   *              pf this object.
+   */
+  public String print(String tab) {
+    return tab+toString();
+  }
+
+
+  /**
+   * Returns a String-representation of this regular expression
+   */
+  public String toString() {
+    return "type = "+type;
+  }
+
+
+  /**
+   * Find out if this regexp is a char class or equivalent to one.
+   * 
+   * @param  macros  for macro expansion
+   * @return true if the regexp is equivalent to a char class.
+   */
+  public boolean isCharClass(Macros macros) {
+    RegExp1 unary;
+    RegExp2 binary;
+
+    switch (type) {
+    case sym.CHAR:
+    case sym.CHAR_I:
+    case sym.CCLASS:
+    case sym.CCLASSNOT:
+      return true;
+      
+    case sym.BAR: 
+      binary = (RegExp2) this;
+      return binary.r1.isCharClass(macros) && binary.r2.isCharClass(macros);
+ 
+    case sym.MACROUSE:
+      unary = (RegExp1) this;
+      return macros.getDefinition((String) unary.content).isCharClass(macros);
+     
+    default: return false; 
+    }     
+  }
+  
+  /**
+   * The approximate number of NFA states this expression will need (only 
+   * works correctly after macro expansion and without negation)
+   * 
+   * @param macros  macro table for expansion   
+   */
+  public int size(Macros macros) {
+    RegExp1 unary;
+    RegExp2 binary;
+    RegExp content;
+
+    switch ( type ) {
+    case sym.BAR: 
+      binary = (RegExp2) this;
+      return binary.r1.size(macros) + binary.r2.size(macros) + 2;
+
+    case sym.CONCAT:   
+      binary = (RegExp2) this;
+      return binary.r1.size(macros) + binary.r2.size(macros);
+      
+    case sym.STAR:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return content.size(macros) + 2;
+
+    case sym.PLUS:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return content.size(macros) + 2;
+      
+    case sym.QUESTION: 
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return content.size(macros);
+
+    case sym.BANG:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return content.size(macros) * content.size(macros);
+      // this is only a very rough estimate (worst case 2^n)
+      // exact size too complicated (propably requires construction)
+      
+    case sym.TILDE:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return content.size(macros) * content.size(macros) * 3;
+      // see sym.BANG
+      
+    case sym.STRING:
+    case sym.STRING_I:
+      unary = (RegExp1) this;
+      return ((String) unary.content).length()+1;
+
+    case sym.CHAR:
+    case sym.CHAR_I:
+      return 2;
+
+    case sym.CCLASS:
+    case sym.CCLASSNOT:
+      return 2;
+
+    case sym.MACROUSE:
+      unary = (RegExp1) this;
+      return macros.getDefinition((String) unary.content).size(macros);
+    }
+
+    throw new Error("unknown regexp type "+type);
+  }
+  
+  /**
+   * @return the reverse of the specified string.
+   */
+  public final static String revString(String s) {
+    StringBuffer b = new StringBuffer(s.length());
+    for (int i=s.length()-1; i >= 0; i--) {
+      b.append(s.charAt(i));
+    }
+    return b.toString();
+  }
+  
+  /**
+   * Recursively convert tilde (upto) expressions into negation and star. 
+   * 
+   * @param macros  the macro table for expansion. 
+   * @return new RegExp equivalent to the current one, but without upto expressions.
+   */
+  public final RegExp resolveTilde(Macros macros) {
+    RegExp1 unary;
+    RegExp2 binary;
+    RegExp content;
+
+    switch ( type ) {
+    case sym.BAR: 
+      binary = (RegExp2) this;
+      return new RegExp2(sym.BAR, binary.r1.resolveTilde(macros), 
+                                  binary.r2.resolveTilde(macros));
+
+    case sym.CONCAT:   
+      binary = (RegExp2) this;
+      return new RegExp2(sym.CONCAT, binary.r1.resolveTilde(macros), 
+                                     binary.r2.resolveTilde(macros));
+      
+    case sym.STAR:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.STAR, content.resolveTilde(macros));
+
+    case sym.PLUS:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.PLUS, content.resolveTilde(macros));
+      
+    case sym.QUESTION: 
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.QUESTION, content.resolveTilde(macros));
+
+    case sym.BANG:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.BANG, content.resolveTilde(macros));
+      
+    case sym.TILDE:
+      // ~a = !([^]* a [^]*) a
+      // uses subexpression sharing
+      unary = (RegExp1) this;
+      content = ((RegExp) unary.content).resolveTilde(macros);
+      
+      RegExp any_star = new RegExp1(sym.STAR, anyChar());
+      RegExp neg = new RegExp1(sym.BANG, 
+                       new RegExp2(sym.CONCAT, any_star, 
+                           new RegExp2(sym.CONCAT, content, any_star)));
+      
+      return new RegExp2(sym.CONCAT, neg, content);
+      
+    case sym.STRING:
+    case sym.STRING_I:    
+    case sym.CHAR:
+    case sym.CHAR_I:
+    case sym.CCLASS:
+    case sym.CCLASSNOT: 
+      unary = (RegExp1) this;
+      return new RegExp1(unary.type, unary.content);
+
+    case sym.MACROUSE:
+      unary = (RegExp1) this;      
+      return macros.getDefinition((String) unary.content).resolveTilde(macros);
+    }
+
+    throw new Error("unknown regexp type "+type);
+  }
+  
+  
+  /**
+   * Returns a regexp that matches any character: <code>[^]</code>
+   * @return the regexp for <code>[^]</code>
+   */
+  public RegExp anyChar() {
+    // FIXME: there is some code duplication here with the parser
+    Vector list = new Vector();
+    list.addElement(new Interval((char)0,CharClasses.maxChar));    
+    return new RegExp1(sym.CCLASS,list);
+  }
+
+
+  /**
+   * Create a new regexp that matches the reverse text of this one.
+   * 
+   * @return the reverse regexp
+   */
+  public final RegExp rev(Macros macros) {
+    RegExp1 unary;
+    RegExp2 binary;
+    RegExp content;
+
+    switch ( type ) {
+    case sym.BAR: 
+      binary = (RegExp2) this;
+      return new RegExp2(sym.BAR, binary.r1.rev(macros), binary.r2.rev(macros));
+
+    case sym.CONCAT:   
+      binary = (RegExp2) this;
+      return new RegExp2(sym.CONCAT, binary.r2.rev(macros), binary.r1.rev(macros));
+      
+    case sym.STAR:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.STAR, content.rev(macros));
+
+    case sym.PLUS:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.PLUS, content.rev(macros));
+      
+    case sym.QUESTION: 
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.QUESTION, content.rev(macros));
+
+    case sym.BANG:
+      unary = (RegExp1) this;
+      content = (RegExp) unary.content;      
+      return new RegExp1(sym.BANG, content.rev(macros));
+      
+    case sym.TILDE:
+      content = resolveTilde(macros);
+      return content.rev(macros);
+      
+    case sym.STRING:
+    case sym.STRING_I:    
+      unary = (RegExp1) this;
+      return new RegExp1(unary.type, revString((String) unary.content));
+      
+    case sym.CHAR:
+    case sym.CHAR_I:
+    case sym.CCLASS:
+    case sym.CCLASSNOT: 
+      unary = (RegExp1) this;
+      return new RegExp1(unary.type, unary.content);
+
+    case sym.MACROUSE:
+      unary = (RegExp1) this;      
+      return macros.getDefinition((String) unary.content).rev(macros);
+    }
+
+    throw new Error("unknown regexp type "+type);
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp1.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp1.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp1.java	(revision 25584)
@@ -0,0 +1,80 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * Stores a regular expression from the rules section of a JFlex specification.
+ *
+ * This class provides storage for one Object of content.
+ * It is used for all regular expressions that are constructed from one object.
+ * 
+ * For instance:  a*  is new RegExp1(sym.STAR, new Character ('a'));
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class RegExp1 extends RegExp {
+
+  /**
+   * The child of this expression node in the syntax tree of a regular expression.
+   */
+  Object content;
+
+  
+  /**
+   * Constructs a new regular expression with one child object.
+   *
+   * @param type   a value from the cup generated class sym, defining the 
+   *               kind of this regular expression
+   *
+   * @param content  the child of this expression
+   */
+  public RegExp1(int type, Object content) {
+    super(type);
+    this.content = content;
+  }
+  
+
+  /**
+   * Returns a String-representation of this regular expression
+   * with the specified indentation.
+   *
+   * @param tab   a String that should contain only space characters and
+   *              that is inserted in front of standard String-representation
+   *              pf this object.
+   */
+  public String print(String tab) {
+    if (content instanceof RegExp) {
+      return tab+"type = "+type+Out.NL+tab+"content :"+Out.NL+((RegExp)content).print(tab+"  ");
+    }
+    else
+      return tab+"type = "+type+Out.NL+tab+"content :"+Out.NL+tab+"  "+content;
+  }
+
+  
+  /**
+   * Returns a String-representation of this regular expression
+   */
+  public String toString() {
+    return print("");
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp2.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp2.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExp2.java	(revision 25584)
@@ -0,0 +1,50 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+/**
+ * Regular expression with two children (e.g. a | b)
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class RegExp2 extends RegExp {
+
+  RegExp r1, r2;
+
+  public RegExp2(int type, RegExp r1, RegExp r2) {
+    super(type);
+    this.r1 = r1;
+    this.r2 = r2;
+  }
+  
+  public String print(String tab) {
+    return tab+"type = "+type+Out.NL+tab+"child 1 :"+Out.NL+ //$NON-NLS-1$ //$NON-NLS-2$
+           r1.print(tab+"  ")+Out.NL+tab+"child 2 :"+Out.NL+ //$NON-NLS-1$ //$NON-NLS-2$
+           r2.print(tab+"  "); //$NON-NLS-1$
+  }
+  
+  public String toString() {
+    return print(""); //$NON-NLS-1$
+  }
+}
+  
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExps.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExps.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/RegExps.java	(revision 25584)
@@ -0,0 +1,217 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex;
+
+import java.util.*;
+
+
+/**
+ * Stores all rules of the specification for later access in RegExp -> NFA
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class RegExps {
+  
+  /** the spec line in which a regexp is used */
+  Vector /* of Integer */ lines;
+
+  /** the lexical states in wich the regexp is used */
+  Vector /* of Vector of Integer */ states;
+
+  /** the regexp */
+  Vector /* of RegExp */ regExps;
+
+  /** the action of a regexp */
+  Vector /* of Action */ actions;
+  
+  /** flag if it is a BOL regexp */
+  Vector /* of Boolean */ BOL;
+
+  /** the lookahead expression */
+  Vector /* of RegExp */ look;
+
+  /** the forward DFA entry point of the lookahead expression */
+  Vector /* of Integer */ look_entry;
+
+  /** Count of many general lookahead expressions there are. 
+   *  Need 2*gen_look_count additional DFA entry points. */
+  int gen_look_count;
+
+  public RegExps() {
+    states = new Vector();
+    regExps = new Vector();
+    actions = new Vector();
+    BOL = new Vector();
+    look = new Vector();
+    lines = new Vector();
+    look_entry = new Vector();
+  }
+
+  public int insert(int line, Vector stateList, RegExp regExp, Action action, 
+                     Boolean isBOL, RegExp lookAhead) {      
+    if (Options.DEBUG) {
+      Out.debug("Inserting regular expression with statelist :"+Out.NL+stateList);  //$NON-NLS-1$
+      Out.debug("and action code :"+Out.NL+action.content+Out.NL);     //$NON-NLS-1$
+      Out.debug("expression :"+Out.NL+regExp);  //$NON-NLS-1$
+    }
+
+    states.addElement(stateList);
+    regExps.addElement(regExp);
+    actions.addElement(action);
+    BOL.addElement(isBOL);
+    look.addElement(lookAhead);
+    lines.addElement(new Integer(line));
+    look_entry.addElement(null);
+    
+    return states.size()-1;
+  }
+
+  public int insert(Vector stateList, Action action) {
+
+    if (Options.DEBUG) {
+      Out.debug("Inserting eofrule with statelist :"+Out.NL+stateList);   //$NON-NLS-1$
+      Out.debug("and action code :"+Out.NL+action.content+Out.NL);      //$NON-NLS-1$
+    }
+
+    states.addElement(stateList);
+    regExps.addElement(null);
+    actions.addElement(action);
+    BOL.addElement(null);
+    look.addElement(null);
+    lines.addElement(null);
+    look_entry.addElement(null);
+    
+    return states.size()-1;
+  }
+
+  public void addStates(int regNum, Vector newStates) {
+    Enumeration s = newStates.elements();
+    
+    while (s.hasMoreElements()) 
+      ((Vector)states.elementAt(regNum)).addElement(s.nextElement());      
+  }
+
+  public int getNum() {
+    return states.size();
+  }
+
+  public boolean isBOL(int num) {
+    return ((Boolean) BOL.elementAt(num)).booleanValue();
+  }
+  
+  public RegExp getLookAhead(int num) {
+    return (RegExp) look.elementAt(num);
+  }
+
+  public boolean isEOF(int num) {
+    return BOL.elementAt(num) == null;
+  }
+
+  public Vector getStates(int num) {
+    return (Vector) states.elementAt(num);
+  }
+
+  public RegExp getRegExp(int num) {
+    return (RegExp) regExps.elementAt(num);
+  }
+
+  public int getLine(int num) {
+    return ((Integer) lines.elementAt(num)).intValue();
+  }
+  
+  public int getLookEntry(int num) {
+    return ((Integer) look_entry.elementAt(num)).intValue();
+  }
+
+  public void checkActions() {
+    if ( actions.elementAt(actions.size()-1) == null ) {
+      Out.error(ErrorMessages.NO_LAST_ACTION);
+      throw new GeneratorException();
+    }
+  }
+
+  public Action getAction(int num) {
+    while ( num < actions.size() && actions.elementAt(num) == null )
+      num++;
+
+    return (Action) actions.elementAt(num);
+  }
+
+  public int NFASize(Macros macros) {
+    int size = 0;
+    Enumeration e = regExps.elements();
+    while (e.hasMoreElements()) {
+      RegExp r = (RegExp) e.nextElement();
+      if (r != null) size += r.size(macros);
+    }
+    e = look.elements();
+    while (e.hasMoreElements()) {
+      RegExp r = (RegExp) e.nextElement();
+      if (r != null) size += r.size(macros);
+    }
+    return size;
+  }
+
+  public void checkLookAheads() {
+    for (int i=0; i < regExps.size(); i++) 
+      lookAheadCase(i);
+  }
+  
+  /**
+   * Determine which case of lookahead expression regExpNum points to (if any).
+   * Set case data in corresponding action.
+   * Increment count of general lookahead expressions for entry points
+   * of the two additional DFAs.
+   * Register DFA entry point in RegExps
+   *
+   * Needs to be run before adding any regexps/rules to be able to reserve
+   * the correct amount of space of lookahead DFA entry points.
+   * 
+   * @param regExpNum   the number of the regexp in RegExps. 
+   */
+  private void lookAheadCase(int regExpNum) {
+    if ( getLookAhead(regExpNum) != null ) {
+      RegExp r1 = getRegExp(regExpNum);
+      RegExp r2 = getLookAhead(regExpNum);
+
+      Action a = getAction(regExpNum);
+            
+      int len1 = SemCheck.length(r1);
+      int len2 = SemCheck.length(r2);
+      
+      if (len1 >= 0) {
+        a.setLookAction(Action.FIXED_BASE,len1);
+      }
+      else if (len2 >= 0) {
+        a.setLookAction(Action.FIXED_LOOK,len2);
+      }
+      else if (SemCheck.isFiniteChoice(r2)) {
+        a.setLookAction(Action.FINITE_CHOICE,0);
+      }
+      else {
+        a.setLookAction(Action.GENERAL_LOOK,0);
+        look_entry.setElementAt(new Integer(gen_look_count), regExpNum);
+        gen_look_count++;
+      }
+    }
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/ScannerException.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/ScannerException.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/ScannerException.java	(revision 25584)
@@ -0,0 +1,104 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+import java.io.File;
+
+/**
+ * This Exception could be thrown while scanning the specification 
+ * (e.g. unmatched input)
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class ScannerException extends RuntimeException {
+  
+  public int line;
+  public int column;
+  public ErrorMessages message;
+  public File file;
+
+  private ScannerException(File file, String text, ErrorMessages message, int line, int column) {
+    super(text);
+    this.file    = file;
+    this.message = message;
+    this.line    = line;
+    this.column  = column;
+  }
+
+
+  /**
+   * Creates a new ScannerException with a message only.
+   *
+   * @param message   the code for the error description presented to the user.
+   */
+  public ScannerException(ErrorMessages message) {
+    this( null, ErrorMessages.get(message), message, -1, -1 );
+  }
+
+  /**
+   * Creates a new ScannerException for a file with a message only.
+   *
+   * @param file      the file in which the error occured
+   * @param message   the code for the error description presented to the user.
+   */
+  public ScannerException(File file, ErrorMessages message) {
+    this( file, ErrorMessages.get(message), message, -1, -1 );
+  }
+
+
+  /**
+   * Creates a new ScannerException with a message and line number.
+   *
+   * @param message   the code for the error description presented to the user.
+   * @param line      the number of the line in the specification that 
+   *                  contains the error
+   */
+  public ScannerException(ErrorMessages message, int line) {
+    this( null, ErrorMessages.get(message), message, line, -1 );
+  }
+
+
+  /**
+   * Creates a new ScannerException for a file with a message and line number.
+   *
+   * @param message   the code for the error description presented to the user.
+   * @param line      the number of the line in the specification that 
+   *                  contains the error
+   */
+  public ScannerException(File file, ErrorMessages message, int line) {
+    this( file, ErrorMessages.get(message), message, line, -1 );
+  }
+
+
+  /**
+   * Creates a new ScannerException with a message, line number and column.
+   *
+   * @param message   the code for the error description presented to the user.
+   * @param line      the number of the line in the specification that 
+   *                  contains the error
+   * @param column    the column where the error starts
+   */
+  public ScannerException(File file, ErrorMessages message, int line, int column) {
+    this( file, ErrorMessages.get(message), message, line, column );
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/SemCheck.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/SemCheck.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/SemCheck.java	(revision 25584)
@@ -0,0 +1,227 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex;
+
+import java.io.File;
+
+/**
+ * Performs simple semantic analysis on regular expressions.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public final class SemCheck {
+
+  // stored globally since they are used as constants in all checks
+  private static Macros macros;
+  
+  /**
+   * Performs semantic analysis for all expressions.
+   *
+   * Currently checks for empty expressions only.
+   *
+   * @param rs   the reg exps to be checked
+   * @param m    the macro table (in expanded form)
+   * @param f    the spec file containing the rules 
+   */
+  public static void check(RegExps rs, Macros m, File f) {
+    macros = m;
+    int num = rs.getNum();
+    for (int i = 0; i < num; i++) {
+      RegExp r = rs.getRegExp(i);
+      RegExp l = rs.getLookAhead(i);
+      Action a = rs.getAction(i);
+      
+      if (r != null && l != null && maybeEmtpy(r)) {
+        if (a == null) 
+          Out.error(ErrorMessages.EMPTY_MATCH, "");
+        else 
+          Out.error(f, ErrorMessages.EMPTY_MATCH, a.priority-1, -1);
+      }
+    }
+  }
+
+
+  /**
+   * Checks if the expression potentially matches the empty string.
+   *    
+   */
+  public static boolean maybeEmtpy(RegExp re) {
+    RegExp2 r; 
+
+    switch (re.type) {      
+
+    case sym.BAR: {
+      r = (RegExp2) re;
+      return maybeEmtpy(r.r1) || maybeEmtpy(r.r2);
+    }
+
+    case sym.CONCAT: {
+      r = (RegExp2) re;
+      return maybeEmtpy(r.r1) && maybeEmtpy(r.r2);
+    }
+
+    case sym.STAR:
+    case sym.QUESTION:
+      return true;
+      
+    case sym.PLUS: {
+      RegExp1 r1 = (RegExp1) re;
+      return maybeEmtpy((RegExp) r1.content);
+    }
+
+    case sym.CCLASS:
+    case sym.CCLASSNOT:
+    case sym.CHAR:
+    case sym.CHAR_I:
+      return false;
+
+    case sym.STRING: 
+    case sym.STRING_I: {
+      String content = (String) ((RegExp1) re).content;
+      return content.length() == 0;
+    }
+
+    case sym.TILDE:
+      return false;
+
+    case sym.BANG: {
+      RegExp1 r1 = (RegExp1) re;
+      return !maybeEmtpy((RegExp) r1.content);
+    }
+
+    case sym.MACROUSE:      
+      return maybeEmtpy(macros.getDefinition((String) ((RegExp1) re).content));
+    }
+
+    throw new Error("Unkown expression type "+re.type+" in "+re);   //$NON-NLS-1$ //$NON-NLS-2$
+  }
+
+  /**
+   * Returns length if expression has fixed length, -1 otherwise.
+   * 
+   * Negation operators are treated as always variable length.   
+   */
+  public static int length(RegExp re) {
+    RegExp2 r;
+
+    switch (re.type) {      
+
+    case sym.BAR: {
+      r = (RegExp2) re;
+      int l1 = length(r.r1);
+      if (l1 < 0) return -1;
+      int l2 = length(r.r2);
+
+      if (l1 == l2) 
+        return l1;
+      else
+        return -1;
+    }
+
+    case sym.CONCAT: {
+      r = (RegExp2) re;
+      int l1 = length(r.r1);
+      if (l1 < 0) return -1;
+      int l2 = length(r.r2);
+      if (l2 < 0) return -1;
+      return l1+l2;
+    }
+
+    case sym.STAR:
+    case sym.PLUS:
+    case sym.QUESTION:
+      return -1;
+
+    case sym.CCLASS:
+    case sym.CCLASSNOT:
+    case sym.CHAR:
+    case sym.CHAR_I:
+      return 1;
+
+    case sym.STRING: 
+    case sym.STRING_I: {
+      String content = (String) ((RegExp1) re).content;
+      return content.length();
+    }
+
+    case sym.TILDE:
+    case sym.BANG: 
+       // too hard to calculate at this level, use safe approx       
+      return -1;
+
+    case sym.MACROUSE:      
+      return length(macros.getDefinition((String) ((RegExp1) re).content));
+    }
+
+    throw new Error("Unkown expression type "+re.type+" in "+re);   //$NON-NLS-1$ //$NON-NLS-2$
+  }
+
+  /**
+   * Returns true iff the expression is a finite choice of fixed length
+   * expressions. 
+   * 
+   * Negation operators are treated as always variable length.   
+   */
+  public static boolean isFiniteChoice(RegExp re) {
+    RegExp2 r;
+
+    switch (re.type) {      
+
+    case sym.BAR: {
+      r = (RegExp2) re;
+      return isFiniteChoice(r.r1) && isFiniteChoice(r.r2);
+    }
+
+    case sym.CONCAT: {
+      r = (RegExp2) re;
+      int l1 = length(r.r1);
+      if (l1 < 0) return false;
+      int l2 = length(r.r2);
+      return l2 >= 0;
+    }
+
+    case sym.STAR:
+    case sym.PLUS:
+    case sym.QUESTION:
+      return false;
+
+    case sym.CCLASS:
+    case sym.CCLASSNOT:
+    case sym.CHAR:
+    case sym.CHAR_I:
+      return true;
+
+    case sym.STRING: 
+    case sym.STRING_I: {
+      return true;
+    }
+
+    case sym.TILDE:
+    case sym.BANG: 
+      return false;
+
+    case sym.MACROUSE:      
+      return isFiniteChoice(macros.getDefinition((String) ((RegExp1) re).content));
+    }
+
+    throw new Error("Unkown expression type "+re.type+" in "+re);   //$NON-NLS-1$ //$NON-NLS-2$
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/SilentExit.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/SilentExit.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/SilentExit.java	(revision 25584)
@@ -0,0 +1,31 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+/**
+ * Signals a silent exit (no statistics printout).
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class SilentExit extends Exception {
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Skeleton.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Skeleton.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Skeleton.java	(revision 25584)
@@ -0,0 +1,222 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex;
+
+import java.io.*;
+import java.net.URL;
+import java.util.Vector;
+
+
+/**
+ * This class stores the skeleton of generated scanners.
+ *
+ * The skeleton consists of several parts that can be emitted to
+ * a file. Usually there is a portion of generated code
+ * (produced in class Emitter) between every two parts of skeleton code.
+ *
+ * There is a static part (the skeleton code) and state based iterator
+ * part to this class. The iterator part is used to emit consecutive skeleton
+ * sections to some <code>PrintWriter</code>. 
+ *
+ * @see JFlex.Emitter
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class Skeleton {
+  
+  /** location of default skeleton */
+  static final private String DEFAULT_LOC = "JFlex/skeleton.default"; //$NON-NLS-1$
+  
+  /** expected number of sections in the skeleton file */
+  static final private int size = 21;
+
+  /** platform specific newline */
+  static final private String NL = System.getProperty("line.separator");  //$NON-NLS-1$
+
+  /** The skeleton */  
+  public static String line[];
+  
+  /** initialization */   
+  static { readDefault(); }  
+  
+  // the state based, iterator part of Skeleton:
+
+  /**
+   * The current part of the skeleton (an index of nextStop[])
+   */
+  private int pos;  
+  
+  /**
+   * The writer to write the skeleton-parts to
+   */
+  private PrintWriter out;
+
+
+  /**
+   * Creates a new skeleton (iterator) instance. 
+   *
+   * @param   out  the writer to write the skeleton-parts to
+   */
+  public Skeleton(PrintWriter out) {
+    this.out = out;
+  }
+
+
+  /**
+   * Emits the next part of the skeleton
+   */
+  public void emitNext() {
+    out.print( line[pos++] );
+  }
+
+
+  /**
+   * Make the skeleton private.
+   *
+   * Replaces all occurences of " public " in the skeleton with " private ". 
+   */
+  public static void makePrivate() {
+    for (int i=0; i < line.length; i++) {
+      line[i] = replace(" public ", " private ", line[i]);   //$NON-NLS-1$ //$NON-NLS-2$
+    }
+  } 
+
+
+  /**
+   * Reads an external skeleton file for later use with this class.
+   * 
+   * @param skeletonFile  the file to read (must be != null and readable)
+   */
+  public static void readSkelFile(File skeletonFile) {
+    if (skeletonFile == null)
+      throw new IllegalArgumentException("Skeleton file must not be null"); //$NON-NLS-1$
+
+    if (!skeletonFile.isFile() || !skeletonFile.canRead()) {
+      Out.error(ErrorMessages.CANNOT_READ_SKEL, skeletonFile.toString()); 
+      throw new GeneratorException();
+    }
+
+    Out.println(ErrorMessages.READING_SKEL, skeletonFile.toString());
+
+    try {
+      BufferedReader reader = new BufferedReader(new FileReader(skeletonFile));
+      readSkel(reader);
+    }
+    catch (IOException e) {
+      Out.error(ErrorMessages.SKEL_IO_ERROR); 
+      throw new GeneratorException();
+    }
+  }
+
+
+  /**
+   * Reads an external skeleton file from a BufferedReader.
+   * 
+   * @param  reader             the reader to read from (must be != null)
+   * @throws IOException        if an IO error occurs
+   * @throws GeneratorException if the number of skeleton sections does not match 
+   */
+  public static void readSkel(BufferedReader reader) throws IOException {
+    Vector lines = new Vector();
+    StringBuffer section = new StringBuffer();
+
+    String ln;
+    while ((ln = reader.readLine()) != null) {
+      if (ln.startsWith("---")) { //$NON-NLS-1$
+        lines.addElement(section.toString());
+        section.setLength(0);
+      } else {
+        section.append(ln);
+        section.append(NL);
+      }
+    }
+
+    if (section.length() > 0)
+      lines.addElement(section.toString());
+
+    if (lines.size() != size) {
+      Out.error(ErrorMessages.WRONG_SKELETON);
+      throw new GeneratorException();
+    }
+
+    line = new String[size];
+    for (int i = 0; i < size; i++)
+      line[i] = (String) lines.elementAt(i);
+  }
+  
+  /**
+   * Replaces a with b in c.
+   * 
+   * @param a  the String to be replaced
+   * @param b  the replacement
+   * @param c  the String in which to replace a by b
+   * @return a String object with a replaced by b in c 
+   */
+  public static String replace(String a, String b, String c) {
+    StringBuffer result = new StringBuffer(c.length());
+    int i = 0;
+    int j = c.indexOf(a);
+    
+    while (j >= i) {
+      result.append(c.substring(i,j));
+      result.append(b);
+      i = j+a.length();
+      j = c.indexOf(a,i);
+    }
+
+    result.append(c.substring(i,c.length()));
+    
+    return result.toString();
+  }
+
+  
+  /**
+   * (Re)load the default skeleton. Looks in the current system class path.   
+   */
+  public static void readDefault() {
+    ClassLoader l = Skeleton.class.getClassLoader();
+    URL url;
+    
+    /* Try to load from same class loader as this class.
+     * Should work, but does not on OS/2 JDK 1.1.8 (see bug 1065521).
+     * Use system class loader in this case.
+     */
+    if (l != null) {
+      url = l.getResource(DEFAULT_LOC); 
+    }
+    else {
+      url = ClassLoader.getSystemResource(DEFAULT_LOC); 
+    }
+
+    if (url == null) {
+      Out.error(ErrorMessages.SKEL_IO_ERROR_DEFAULT);
+      throw new GeneratorException();    
+    }
+    
+    try {
+      InputStreamReader reader = new InputStreamReader(url.openStream());
+      readSkel(new BufferedReader(reader)); 
+    } catch (IOException e) {
+      Out.error(ErrorMessages.SKEL_IO_ERROR_DEFAULT); 
+      throw new GeneratorException();
+    }
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StatePairList.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StatePairList.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StatePairList.java	(revision 25584)
@@ -0,0 +1,83 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+/**
+ * A list of pairs of states. Used in DFA minimization.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class StatePairList {
+
+  // implemented as two arrays of integers.
+  // java.util classes proved too inefficient.
+
+  int p [];
+  int q [];
+  
+  int num;
+
+  public StatePairList() {
+    p = new int [8];
+    q = new int [8];
+    num = 0;
+  }
+
+  public void addPair(int i, int j) {
+    for (int x = 0; x < num; x++)
+      if (p[x] == i && q[x] == j) return;
+
+    if (num >= p.length) increaseSize(num);
+
+    p[num] = i;
+    q[num] = j;
+    
+    num++;
+  }
+
+  public void markAll(StatePairList [] [] list, boolean [] [] equiv) {
+    for (int x = 0; x < num; x++) {
+      int i = p[x];
+      int j = q[x];
+      
+      if (equiv[i][j]) {
+        equiv[i][j] = false;
+        if (list[i][j] != null) 
+          list[i][j].markAll(list, equiv);
+      }
+    }
+  }
+
+  private void increaseSize(int length) {
+    length = Math.max(length+1, 4*p.length);
+    Out.debug("increasing length to "+length); //$NON-NLS-1$
+                               
+    int pn [] = new int[length];
+    int qn [] = new int[length];
+
+    System.arraycopy(p, 0, pn, 0, p.length);
+    System.arraycopy(q, 0, qn, 0, q.length);
+
+    p = pn; 
+    q = qn;
+  } 
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StateSet.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StateSet.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StateSet.java	(revision 25584)
@@ -0,0 +1,334 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex;
+
+/**
+ * A set of NFA states (= integers). 
+ *
+ * Very similar to java.util.BitSet, but is faster and doesn't crash
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class StateSet {
+
+  private final boolean DEBUG = false;
+
+  public final static StateSet EMPTY = new StateSet();
+
+
+  final static int BITS = 6;
+  final static int MASK = (1<<BITS)-1;
+  
+  long bits[];
+  
+  
+  public StateSet() {
+    this(256);
+  }  
+
+  public StateSet(int size) {    
+    bits = new long[size2nbits(size)];
+  }
+
+  public StateSet(int size, int state) {
+    this(size);
+    addState(state);
+  }
+
+  public StateSet(StateSet set) {
+    bits = new long[set.bits.length];
+    System.arraycopy(set.bits, 0, bits, 0, set.bits.length);
+  }
+
+
+  public void addState(int state) {
+    if (DEBUG) {
+      Out.dump("StateSet.addState("+state+") start"); //$NON-NLS-1$ //$NON-NLS-2$
+      Out.dump("Set is : "+this); //$NON-NLS-1$
+    }
+   
+    int index = state >> BITS;
+    if (index >= bits.length) resize(state);
+    bits[index] |= (1L << (state & MASK));
+    
+    if (DEBUG) {
+      Out.dump("StateSet.addState("+state+") end"); //$NON-NLS-1$ //$NON-NLS-2$
+      Out.dump("Set is : "+this); //$NON-NLS-1$
+    }
+  }
+
+
+  private int size2nbits (int size) {
+    return ((size >> BITS) + 1);
+  }
+
+
+  private void resize(int size) {
+    int needed = size2nbits(size);
+
+    // if (needed < bits.length) return;
+         
+    long newbits[] = new long[Math.max(bits.length*4,needed)];
+    System.arraycopy(bits, 0, newbits, 0, bits.length);
+    
+    bits = newbits;
+  }
+
+
+  public void clear() {    
+    int l = bits.length;
+    for (int i = 0; i < l; i++) bits[i] = 0;
+  }
+
+  public boolean isElement(int state) {
+    int index = state >> BITS;
+    if (index >= bits.length)  return false;
+    return (bits[index] & (1L << (state & MASK))) != 0;
+  }
+
+  /**
+   * Returns one element of the set and removes it. 
+   *
+   * Precondition: the set is not empty.
+   */
+  public int getAndRemoveElement() {
+    int i = 0;
+    int o = 0;
+    long m = 1;
+    
+    while (bits[i] == 0) i++;
+    
+    while ( (bits[i] & m) == 0 ) {
+      m<<= 1;
+      o++;
+    }
+    
+    bits[i]&= ~m;
+    
+    return (i << BITS) + o;
+  }
+
+  public void remove(int state) {
+    int index = state >> BITS;
+    if (index >= bits.length) return;
+    bits[index] &= ~(1L << (state & MASK));
+  }
+
+  /**
+   * Returns the set of elements that contained are in the specified set
+   * but are not contained in this set.
+   */
+  public StateSet complement(StateSet set) {
+    
+    if (set == null) return null;
+    
+    StateSet result = new StateSet();
+    
+    result.bits = new long[set.bits.length];
+    
+    int i;
+    int m = Math.min(bits.length, set.bits.length);
+    
+    for (i = 0; i < m; i++) {
+      result.bits[i] = ~bits[i] & set.bits[i];
+    }
+    
+    if (bits.length < set.bits.length) 
+      System.arraycopy(set.bits, m, result.bits, m, result.bits.length-m);
+    
+    if (DEBUG) 
+      Out.dump("Complement of "+this+Out.NL+"and "+set+Out.NL+" is :"+result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    
+    return result;
+  }
+
+  public void add(StateSet set) {
+    
+    if (DEBUG) Out.dump("StateSet.add("+set+") start"); //$NON-NLS-1$ //$NON-NLS-2$
+
+    if (set == null) return;
+
+    long tbits[];
+    long sbits[] = set.bits;
+    int sbitsl = sbits.length;
+
+    if (bits.length < sbitsl) {
+      tbits = new long[sbitsl];
+      System.arraycopy(bits, 0, tbits, 0, bits.length);
+    }
+    else {
+      tbits = this.bits;
+    }
+    
+    for (int i = 0; i < sbitsl; i++) {
+      tbits[i] |= sbits[i];      
+    }
+
+    this.bits = tbits;
+    
+    if (DEBUG) {
+      Out.dump("StateSet.add("+set+") end"); //$NON-NLS-1$ //$NON-NLS-2$
+      Out.dump("Set is : "+this); //$NON-NLS-1$
+    }
+  }
+  
+
+
+  public boolean containsSet(StateSet set) {
+
+    if (DEBUG)
+      Out.dump("StateSet.containsSet("+set+"), this="+this); //$NON-NLS-1$ //$NON-NLS-2$
+
+    int i;
+    int min = Math.min(bits.length, set.bits.length);
+    
+    for (i = 0; i < min; i++) 
+      if ( (bits[i] & set.bits[i]) != set.bits[i] ) return false;
+    
+    for (i = min; i < set.bits.length; i++)
+      if ( set.bits[i] != 0 ) return false;
+    
+    return true;
+  }
+
+
+
+  /**
+   * @throws ClassCastException if b is not a StateSet
+   * @throws NullPointerException if b is null
+   */
+  public boolean equals(Object b) {
+
+    int i = 0;
+    int l1,l2;
+    StateSet set = (StateSet) b;
+
+    if (DEBUG) Out.dump("StateSet.equals("+set+"), this="+this); //$NON-NLS-1$ //$NON-NLS-2$
+
+    l1 = bits.length;
+    l2 = set.bits.length;
+
+    if (l1 <= l2) {      
+      while (i < l1) {
+        if (bits[i] != set.bits[i]) return false;
+        i++;
+      }
+      
+      while (i < l2) 
+        if (set.bits[i++] != 0) return false;
+    }
+    else {
+      while (i < l2) {
+        if (bits[i] != set.bits[i]) return false;
+        i++;
+      }
+      
+      while (i < l1) 
+        if (bits[i++] != 0) return false;
+    }
+
+    return true;
+  }
+
+  public int hashCode() {
+    long h = 1234;
+    long [] _bits = bits;
+    int  i = bits.length-1;
+
+    // ignore zero high bits
+    while (i >= 0 && _bits[i] == 0) i--;
+
+    while (i >= 0)
+      h ^= _bits[i--] * i;
+
+    return (int)((h >> 32) ^ h);
+  } 
+
+
+  public StateSetEnumerator states() {
+    return new StateSetEnumerator(this);
+  }
+
+
+  public boolean containsElements() {
+    for (int i = 0; i < bits.length; i++)
+      if (bits[i] != 0) return true;
+      
+    return false;
+  }
+
+  
+  public StateSet copy() {
+    StateSet set = new StateSet();
+    set.bits = new long[bits.length];
+    System.arraycopy(bits, 0, set.bits, 0, bits.length);
+    return set;
+  }
+
+
+  /**
+   * Copy specified StateSet into this.
+   * 
+   * @param set  the state set to copy.
+   */ 
+  public void copy(StateSet set) {
+    
+    if (DEBUG) 
+      Out.dump("StateSet.copy("+set+") start"); //$NON-NLS-1$ //$NON-NLS-2$
+
+    if (set == null) {
+      for (int i = 0; i < bits.length; i++) bits[i] = 0;
+      return;
+    }
+
+    if (bits.length < set.bits.length) {
+      bits = new long[set.bits.length];
+    }
+    else {
+      for (int i = set.bits.length; i < bits.length; i++) bits[i] = 0;
+    }
+
+    System.arraycopy(set.bits, 0, bits, 0, bits.length);        
+
+    if (DEBUG) {
+      Out.dump("StateSet.copy("+set+") end"); //$NON-NLS-1$ //$NON-NLS-2$
+      Out.dump("Set is : "+this); //$NON-NLS-1$
+    }
+  }
+
+  
+  public String toString() {
+    StateSetEnumerator set = states();
+
+    StringBuffer result = new StringBuffer("{"); //$NON-NLS-1$
+
+    if ( set.hasMoreElements() ) result.append(""+set.nextElement()); //$NON-NLS-1$
+
+    while ( set.hasMoreElements() ) {
+      int i = set.nextElement();
+      result.append( ", "+i); //$NON-NLS-1$
+    }
+
+    result.append("}"); //$NON-NLS-1$
+
+    return result.toString();
+  }  
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StateSetEnumerator.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StateSetEnumerator.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StateSetEnumerator.java	(revision 25584)
@@ -0,0 +1,124 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex;
+
+/**
+ * Enumerates the states of a StateSet.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class StateSetEnumerator {
+
+  private final static boolean DEBUG = false;
+
+  private int index;
+  private int offset;
+  private long mask;
+
+  private long [] bits;
+  
+  /**
+   * creates a new StateSetEnumerator that is not yet associated
+   * with a StateSet. hasMoreElements() and nextElement() will 
+   * throw NullPointerException when used before reset()
+   */  
+  public StateSetEnumerator() {
+  }
+
+  public StateSetEnumerator(StateSet states) {
+    reset(states);
+  }
+
+  public void reset(StateSet states) {
+    bits    = states.bits;
+    index   = 0;
+    offset  = 0;
+    mask    = 1;
+    while (index < bits.length && bits[index] == 0) 
+      index++;
+
+    if (index >= bits.length) return;
+        
+    while (offset <= StateSet.MASK && ((bits[index] & mask) == 0)) {
+      mask<<= 1;
+      offset++;
+    }    
+  }
+
+  private void advance() {
+    
+    if (DEBUG) Out.dump("Advancing, at start, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$
+
+    // cache fields in local variable for faster access
+    int  _index   = this.index;
+    int  _offset  = this.offset;
+    long _mask    = this.mask;
+    long [] _bits = this.bits;
+
+    long bi = _bits[_index];
+
+    do {
+      _offset++;
+      _mask<<= 1;
+    } while (_offset <= StateSet.MASK && ((bi & _mask) == 0));
+
+    if (_offset > StateSet.MASK) {
+      int length = _bits.length;
+
+      do 
+        _index++;
+      while (_index < length && _bits[_index] == 0);
+        
+      if (_index >= length) {
+        this.index = length; // indicates "no more elements"
+        return;
+      }        
+
+      _offset = 0;
+      _mask = 1;
+      bi = _bits[_index];
+
+      // terminates, because bi != 0
+      while ((bi & _mask) == 0) {
+        _mask<<= 1;
+        _offset++;
+      }
+    }
+
+    // write back cached values
+    this.index  = _index;
+    this.mask   = _mask;
+    this.offset = _offset;
+  }
+
+  public boolean hasMoreElements() {
+    if (DEBUG) Out.dump("hasMoreElements, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$
+    return index < bits.length;
+  }
+
+  public int nextElement() {
+    if (DEBUG) Out.dump("nextElement, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$
+    int x = (index << StateSet.BITS) + offset;
+    advance();
+    return x;
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StdOutWriter.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StdOutWriter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/StdOutWriter.java	(revision 25584)
@@ -0,0 +1,113 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex;
+
+
+import java.io.*;
+import java.awt.TextArea;
+
+
+/**
+ * Convenience class for JFlex stdout, redirects output to a TextArea
+ * if in GUI mode.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public final class StdOutWriter extends PrintWriter {
+  
+  /** text area to write to if in gui mode, gui mode = (text != null) */
+  private TextArea text;
+
+  /** 
+   * approximation of the current column in the text area
+   * for auto wrapping at <code>wrap</code> characters
+   **/
+  private int col;
+ 
+  /** auto wrap lines in gui mode at this value */
+  private final static int wrap = 78;
+
+  /** A StdOutWriter, attached to System.out, no gui mode */
+  public StdOutWriter() {
+    super(System.out,true);
+  }
+  
+  /** A StdOutWrite, attached to the specified output stream, no gui mode */
+  public StdOutWriter(OutputStream out) {
+    super(out,true);    
+  }
+
+  /**
+   * Set the TextArea to write text to. Will continue
+   * to write to System.out if text is <code>null</code>.
+   *
+   * @param text  the TextArea to write to
+   */
+  public void setGUIMode(TextArea text) {
+    this.text = text;
+  }
+
+  /** Write a single character. */
+  public void write(int c) {
+    if (text != null) {
+      text.append(String.valueOf((char) c));
+      if (++col > wrap) println();
+    }
+    else
+      super.write(c);
+  }
+
+  /** Write a portion of an array of characters. */
+  public void write(char buf[], int off, int len) {
+    if (text != null) {
+      text.append(new String(buf,off,len));
+      if ((col+=len) > wrap) println();
+    }
+    else
+      super.write(buf, off, len);
+  }
+  
+  /** Write a portion of a string. */
+  public void write(String s, int off, int len) {
+    if (text != null) {
+      text.append(s.substring(off,off+len));
+      if ((col+=len) > wrap) println();
+    }
+    else {
+      super.write(s,off,len); 
+      flush();
+    }
+  }
+
+  /**
+   * Begin a new line. Which actual character/s is/are written 
+   * depends on the runtime platform.
+   */
+  public void println() {
+    if (text != null) {
+      text.append(Out.NL);
+      col = 0;
+    }
+    else
+      super.println();
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Timer.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Timer.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/Timer.java	(revision 25584)
@@ -0,0 +1,110 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex;
+
+/**
+ * Very simple timer for code generation time statistics.
+ *
+ * Not very exact, measures user time, not processor time.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class Timer {
+
+  /* the timer stores start and stop time from currentTimeMillis() */
+  private long startTime, stopTime; 
+
+  /* flag if the timer is running (if stop time is valid) */
+  private boolean running; 
+
+
+  /**
+   * Construct a new timer that starts immediatly.
+   */
+  public Timer() {
+    startTime = System.currentTimeMillis();
+    running = true;
+  }
+
+  
+  /**
+   * Start the timer. If it is already running, the old start
+   * time is lost.
+   */
+  public void start() {
+    startTime = System.currentTimeMillis();
+    running = true;
+  }
+
+
+  /**
+   * Stop the timer.
+   */
+  public void stop() {
+    stopTime = System.currentTimeMillis();
+    running = false;
+  }
+
+  
+  /**
+   * Return the number of milliseconds the timer has been running.
+   *
+   * (up till now, if it still runs, up to the stop time if it has been stopped)
+   */
+  public long diff() {
+    if (running) 
+      return System.currentTimeMillis()-startTime;
+    else 
+      return stopTime-startTime;    
+  }
+
+  
+  /**
+   * Return a string representation of the timer.
+   *
+   * @return a string displaying the diff-time in readable format (h m s ms)
+   *
+   * @see Timer#diff
+   */
+  public String toString() {
+    long diff = diff();
+    
+    long millis = diff%1000;
+    long secs = (diff/1000)%60;
+    long mins = (diff/(1000*60))%60;
+    long hs = (diff/(1000*3600))%24;
+    long days = diff/(1000*3600*24);
+
+    if (days > 0) 
+      return days+"d "+hs+"h "+mins+"m "+secs+"s "+millis+"ms";
+
+    if (hs > 0)
+      return hs+"h "+mins+"m "+secs+"s "+millis+"ms";
+
+    if (mins > 0)
+      return mins+"m "+secs+"s "+millis+"ms";
+
+    if (secs > 0)
+      return secs+"s "+millis+"ms";
+
+    return millis+"ms";
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/anttask/JFlexTask.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/anttask/JFlexTask.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/anttask/JFlexTask.java	(revision 25584)
@@ -0,0 +1,262 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex Anttask                                                           *
+ * Copyright (C) 2001       Rafal Mantiuk <Rafal.Mantiuk@bellstream.pl>    *
+ * Copyright (C) 2003       changes by Gerwin Klein <lsf@jflex.de>         *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.anttask;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+
+import JFlex.Main;
+import JFlex.Options;
+
+import java.io.*;
+
+/**
+ * JFlex task class
+ *
+ * @author Rafal Mantiuk
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class JFlexTask extends Task {
+  private File inputFile;
+
+	// found out by looking into .flex file 
+	private String className = null;
+	private String packageName = null;
+
+  /** for javac-like dest dir behaviour */
+  private File destinationDir;
+	
+	/** the actual output directory (outputDir = destinationDir + package)) */
+	private File outputDir = null;
+
+  public JFlexTask() {
+    // ant default is different from the rest of JFlex
+    setVerbose(false);
+    Options.progress = false;
+  }
+
+  public void execute() throws BuildException {
+   	try {
+      if (inputFile == null) 
+        throw new BuildException("Input file needed. Use <jflex file=\"your_scanner.flex\"/>");
+
+			if (!inputFile.canRead()) 
+				throw new BuildException("Cannot read input file "+inputFile);
+
+			try {
+      	findPackageAndClass();        
+        normalizeOutdir();
+        File destFile = new File(outputDir, className + ".java");
+        
+        if (inputFile.lastModified() > destFile.lastModified()) {      
+          Main.generate(inputFile);      
+          if (!Options.verbose)
+            System.out.println("Generated: " + destFile.getName());
+        }
+      } catch (IOException e1) {
+        throw new BuildException("IOException: " + e1.toString());
+      }
+    } catch (JFlex.GeneratorException e) {
+      throw new BuildException("JFlex: generation failed!");
+    }
+  }
+
+	/**
+	 * Peek into .flex file to get package and class name
+	 * 
+	 * @throws IOException  if there is a problem reading the .flex file 
+	 */
+	public void findPackageAndClass() throws IOException {
+		// find name of the package and class in jflex source file
+		packageName = null;
+		className = null;
+
+		LineNumberReader reader = new LineNumberReader(new FileReader(inputFile));
+
+		while (className == null || packageName == null) {
+			String line = reader.readLine();
+			if (line == null)	break;
+
+			if (packageName == null) {
+				int index = line.indexOf("package");
+				if (index >= 0) {
+					index += 7;
+
+					int end = line.indexOf(';', index);
+					if (end >= index) {
+						packageName = line.substring(index, end);
+						packageName = packageName.trim();
+					}
+				}
+			}
+
+			if (className == null) {
+				int index = line.indexOf("%class");
+				if (index >= 0) {
+					index += 6;
+
+					className = line.substring(index);
+					className = className.trim();
+				}
+			}
+		}
+
+		// package name may be null, but class name not
+		if (className == null) className = "Yylex";
+	}
+
+	/**
+	 * Sets the actual output directory if not already set. 	
+	 *
+	 * Uses javac logic to determine output dir = dest dir + package name
+	 * If not destdir has been set, output dir = parent of input file
+	 * 
+	 * Assumes that package name is already set. 
+	 */
+  public void normalizeOutdir() {
+  	if (outputDir != null) return;
+  	
+    // find out what the destination directory is. Append packageName to dest dir.      
+    File destDir;
+    
+    // this is not the default the jflex logic, but javac-like 
+    if (destinationDir != null) {
+      if (packageName == null) {
+    		destDir = destinationDir;
+      }
+      else {
+        String path = packageName.replace('.', File.separatorChar);
+        destDir = new File(destinationDir,path);
+      }
+    } else { //save parser to the same dir as .flex
+      destDir = new File(inputFile.getParent());
+    }
+    
+    setOutdir(destDir);
+  }
+
+	/**
+	 * @return package name of input file
+	 * 
+	 * @see JFlexTask.findPackageAndClass
+	 */
+	public String getPackage() {
+		return packageName;
+	}
+
+	/**
+	 * @return class name of input file
+	 * 
+	 * @see JFlexTask.findPackageAndClass
+	 */
+	public String getClassName() {
+		return className;
+	}
+
+  public void setDestdir(File destinationDir) {
+    this.destinationDir = destinationDir;
+  }
+
+	public void setOutdir(File outDir) {
+		this.outputDir = outDir;
+    Options.setDir(outputDir);
+	}
+
+  public void setFile(File file) {
+    this.inputFile = file;
+  }
+
+  public void setGenerateDot(boolean genDot) {
+    setDot(genDot);
+  }
+
+  public void setTimeStatistics(boolean displayTime) {
+    Options.time = displayTime;
+  }
+  
+  public void setTime(boolean displayTime) {
+    setTimeStatistics(displayTime);
+  }
+
+  public void setVerbose(boolean verbose) {
+    Options.verbose = verbose;
+  }
+
+  public void setSkeleton(File skeleton) {
+    Options.setSkeleton(skeleton);
+  }
+ 
+  public void setSkel(File skeleton) {
+    setSkeleton(skeleton);
+  }
+
+  public void setSkipMinimization(boolean skipMin) {
+    setNomin(skipMin);
+  }
+  
+  public void setNomin(boolean b) {
+  	Options.no_minimize = b;
+  }
+
+  public void setNobak(boolean b) {
+    Options.no_backup = b;
+  }
+
+  public void setSwitch(boolean b) {
+    if (b) {
+      Options.gen_method = Options.SWITCH;
+    }
+    else {
+      Options.gen_method = Options.PACK;
+    }
+  }
+
+  public void setTable(boolean b) {
+    if (b) {
+      Options.gen_method = Options.TABLE;
+    }
+    else {
+      Options.gen_method = Options.PACK;
+    }
+  }
+
+  public void setPack(boolean b) {
+    if (b) {
+      Options.gen_method = Options.PACK;
+    }
+    else {
+      Options.gen_method = Options.SWITCH;
+    }    
+  }
+
+  public void setDot(boolean b) {
+    Options.dot = b;
+  }
+
+  public void setDump(boolean b) {
+    Options.dump = b;
+  }
+  
+  public void setJLex(boolean b) {    
+    Options.jlex = b;
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GeneratorThread.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GeneratorThread.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GeneratorThread.java	(revision 25584)
@@ -0,0 +1,93 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.gui;
+
+import JFlex.*;
+
+import java.io.File;
+
+
+/**
+ * Low priority thread for code generation (low priority 
+ * that gui has time for screen updates)
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class GeneratorThread extends Thread {
+
+  /** there must be at most one instance of this Thread running */
+	private static volatile boolean running = false;
+
+	/** input file setting from GUI */
+	String  inputFile;
+
+  /** output directory */
+  String outputDir;
+  
+  /** main UI component, likes to be notified when generator finishes */
+  MainFrame parent;
+
+	/**
+	 * Create a new GeneratorThread, but do not run it yet.
+	 * 
+	 * @param parent      the frame, main UI component
+	 * @param inputFile   input file from UI settings
+	 * @param messages    where generator messages should appear
+	 * @param outputDir   output directory from UI settings
+	 */
+  public GeneratorThread(MainFrame parent, String inputFile, 
+                         String outputDir) {
+    this.parent    = parent;
+    this.inputFile = inputFile;
+    this.outputDir = outputDir;
+  }
+
+
+	/**
+	 * Run the generator thread. Only one instance of it can run at any time.
+	 */
+  public void run() {
+  	if (running) {
+  		Out.error(ErrorMessages.ALREADY_RUNNING);
+			parent.generationFinished(false);
+  	}
+  	else {
+  		running = true;
+			setPriority(MIN_PRIORITY);    
+			try {
+        if (!outputDir.equals("")) {
+          Options.setDir(outputDir);
+        }
+				Main.generate(new File(inputFile));
+				Out.statistics();
+				parent.generationFinished(true);
+			}
+			catch (GeneratorException e) {
+				Out.statistics();
+				parent.generationFinished(false);
+			}
+      finally {
+        running = false;
+      }
+  	}
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GridPanel.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GridPanel.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GridPanel.java	(revision 25584)
@@ -0,0 +1,161 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.gui;
+
+import java.awt.*;
+import java.util.*;
+
+/**
+ * Grid layout manager like GridLayout but with predefinable
+ * grid size.
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class GridPanel extends Panel implements Handles {
+
+  private int cols;
+  private int rows;
+
+  private int hgap;
+  private int vgap;
+ 
+  private Vector constraints = new Vector();
+  private Insets insets = new Insets(0,0,0,0);
+
+  public GridPanel(int cols, int rows) {
+    this(cols, rows, 0, 0);
+  }
+
+  public GridPanel(int cols, int rows, int hgap, int vgap) {
+    this.cols = cols;
+    this.rows = rows;
+    this.hgap = hgap;
+    this.vgap = vgap;
+  }
+
+  public void doLayout() {
+    Dimension size = getSize();
+    size.height -= insets.top+insets.bottom;
+    size.width  -= insets.left+insets.right;
+
+    float cellWidth  = size.width/cols;
+    float cellHeight = size.height/rows;
+
+    for (int i = 0; i < constraints.size(); i++) {
+      GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i);
+
+      float x = cellWidth * c.x + insets.left + hgap/2;
+      float y = cellHeight * c.y + insets.right + vgap/2;
+
+      float width, height;
+
+      if (c.handle == FILL) {
+        width  = (cellWidth-hgap) * c.width;
+        height = (cellHeight-vgap) * c.height;
+      }
+      else {
+        Dimension d = c.component.getPreferredSize();
+        width  = d.width;
+        height = d.height;
+      }
+
+      switch (c.handle) {
+      case TOP_CENTER: 
+        x+= (cellWidth+width)/2; 
+        break;
+      case TOP_RIGHT:
+        x+= cellWidth-width;
+        break;
+      case CENTER_LEFT:
+        y+= (cellHeight+height)/2;
+        break;
+      case CENTER:
+        x+= (cellWidth+width)/2; 
+        y+= (cellHeight+height)/2;
+        break;
+      case CENTER_RIGHT:
+        y+= (cellHeight+height)/2;
+        x+= cellWidth-width;
+        break;
+      case BOTTOM:
+        y+= cellHeight-height;
+        break;
+      case BOTTOM_CENTER:
+        x+= (cellWidth+width)/2; 
+        y+= cellHeight-height;
+        break;
+      case BOTTOM_RIGHT:        
+        y+= cellHeight-height;
+        x+= cellWidth-width;
+        break;
+      }
+
+      c.component.setBounds(new Rectangle((int)x, (int)y, (int)width, (int)height));
+    }
+  }
+
+  public Dimension getPreferredSize() {
+    float dy = 0;
+    float dx = 0;
+   
+    for (int i = 0; i < constraints.size(); i++) {
+      GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i);
+
+      Dimension d = c.component.getPreferredSize();
+
+      dx = Math.max(dx, d.width/c.width);
+      dy = Math.max(dy, d.height/c.height);
+    }
+
+    dx+= hgap;
+    dy+= vgap;
+
+    dx*= cols;
+    dy*= rows;
+
+    dx+= insets.left+insets.right;
+    dy+= insets.top+insets.bottom;
+
+    return new Dimension((int)dx,(int)dy);
+  }
+
+  public void setInsets(Insets insets) {
+    this.insets = insets;
+  }
+
+  public void add(int x, int y, Component c) {
+    add(x,y,1,1,FILL,c);
+  }
+
+  public void add(int x, int y, int handle, Component c) {
+    add(x,y,1,1,handle,c);
+  }
+
+  public void add(int x, int y, int dx, int dy, Component c) {
+    add(x,y,dx,dy,FILL,c);
+  }
+
+  public void add(int x, int y, int dx, int dy, int handle, Component c) {
+    super.add(c);
+    constraints.addElement(new GridPanelConstraint(x,y,dx,dy,handle,c));
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GridPanelConstraint.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GridPanelConstraint.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/GridPanelConstraint.java	(revision 25584)
@@ -0,0 +1,44 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex.gui;
+
+import java.awt.Component;
+
+/**
+ * Constraints for layout elements of GridLayout
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class GridPanelConstraint {
+
+  int x, y, width, height, handle;
+  Component component;
+
+  public GridPanelConstraint(int x, int y, int width, int height, 
+                             int handle, Component component) {
+    this.x         = x;
+    this.y         = y;
+    this.width     = width;
+    this.height    = height;
+    this.handle    = handle;
+    this.component = component;
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/Handles.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/Handles.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/Handles.java	(revision 25584)
@@ -0,0 +1,49 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.gui;
+
+/**
+ * Constants used for GridLayout
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public interface Handles {
+
+  int FILL = 0;
+
+  int TOP  = 1;
+  int TOP_LEFT = TOP;
+  int TOP_CENTER = 2; 
+  int TOP_RIGHT = 3;
+
+  int CENTER_LEFT = 4;
+  int CENTER = 5;
+  int CENTER_CENTER = CENTER;
+  int CENTER_RIGHT = 6;
+
+  int BOTTOM = 7;
+  int BOTTOM_LEFT = BOTTOM;
+  int BOTTOM_CENTER = 8;
+  int BOTTOM_RIGHT = 9;       
+
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/MainFrame.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/MainFrame.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/MainFrame.java	(revision 25584)
@@ -0,0 +1,275 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.gui;
+
+import JFlex.Main;
+import JFlex.Out;
+
+import java.io.File;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * JFlex main application frame (GUI mode only)
+ *
+ * @author Gerwin Klein
+ * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+final public class MainFrame extends Frame implements Handles {
+
+  private volatile boolean choosing;
+
+  private String fileName = "";
+  private String dirName = "";
+  
+  private Button quit; 
+  private Button options;
+  private Button generate;
+  private Button stop;
+  private Button specChoose; 
+  private Button dirChoose;
+
+  private TextField spec;
+  private TextField dir;
+
+  private TextArea messages;
+
+  private GeneratorThread thread;
+
+  private OptionsDialog dialog;
+
+  
+  public MainFrame() {
+    super("JFlex "+Main.version);
+    buildContent();
+    
+    addWindowListener( new WindowAdapter() {
+      public void windowClosing(WindowEvent e) {
+        quit();
+      }
+    });
+    
+    pack();
+    show();
+  }
+
+
+  private void buildContent() {
+    setBackground(SystemColor.control);
+
+    generate   = new Button("Generate");
+    quit       = new Button("Quit");
+    options    = new Button("Options");
+    stop       = new Button("Stop");
+    dirChoose  = new Button("Browse");
+    dir        = new TextField(10);
+    specChoose = new Button("Browse");
+    spec       = new TextField(10);            
+    messages   = new TextArea(10,80);
+
+    messages.setEditable(false);
+    Font font = messages.getFont();
+    if (font != null)
+      messages.setFont(new Font("Monospaced", font.getStyle(), font.getSize()));
+    else
+      messages.setFont(new Font("Monospaced", Font.PLAIN, 12));
+
+    Out.setGUIMode(messages);
+
+    generate.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        generate();
+      }
+    } );
+
+    options.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        showOptions();
+      }
+    } );
+
+    quit.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        quit();
+      }
+    } );
+    
+    stop.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        stop();
+      }
+    } );        
+
+    specChoose.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        specChoose();
+      }
+    } );
+
+    dirChoose.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        dirChoose();
+      }
+    } );
+
+    spec.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        fileName = spec.getText();
+        generate();
+      }
+    } );
+    
+    spec.addTextListener( new TextListener() {
+      public void textValueChanged(TextEvent e) {
+        fileName = spec.getText();
+      }
+    } );
+    
+    dir.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        dirName = dir.getText();
+        generate();
+      }
+    } );
+    
+    dir.addTextListener( new TextListener() {
+      public void textValueChanged(TextEvent e) {
+        dirName = dir.getText();
+      }
+    } );
+
+    GridPanel north = new GridPanel(5,4,10,10);
+    north.setInsets( new Insets(10,5,5,10) );
+
+    north.add( 4,0, quit);
+    north.add( 4,1, generate);
+    north.add( 4,2, options);
+    north.add( 4,3, stop);
+
+    north.add( 0,0, BOTTOM, new Label("Lexical specification:"));
+    north.add( 0,1, 2,1, spec);
+    north.add( 2,1, specChoose);
+
+    north.add( 0,2, BOTTOM, new Label("Output directory:"));
+    north.add( 0,3, 2,1, dir);
+    north.add( 2,3, dirChoose);
+
+    Panel center = new Panel(new BorderLayout());   
+    center.add("North", new Label("Messages:"));
+    center.add("Center", messages);
+
+    add("North", north);
+    add("Center", center);
+
+    setEnabledAll(false);
+  }
+
+  protected void showOptions() {
+    if (dialog == null) {
+      dialog = new OptionsDialog(this);
+    }
+    dialog.show();
+  }
+
+
+  public Dimension getPreferredSize() {
+    Dimension d = super.getPreferredSize();
+    d.width = messages.getPreferredSize().width;
+    return d;
+  }
+  
+  private void setEnabledAll(boolean generating) {
+    stop.setEnabled( generating );
+    quit.setEnabled( !generating );
+    generate.setEnabled( !generating );
+    dirChoose.setEnabled( !generating );
+    dir.setEnabled( !generating );
+    specChoose.setEnabled( !generating );
+    spec.setEnabled( !generating );
+  }
+
+  private void generate() {
+    // workaround for a weird AWT bug
+    if (choosing) return;
+   
+    setEnabledAll(true);
+
+    thread = new GeneratorThread(this, fileName, dirName);
+    thread.start();
+  } 
+
+  public void generationFinished(boolean success) {
+    setEnabledAll(false);
+    
+    if (success) 
+      messages.append(Out.NL+"Generation finished successfully."+Out.NL);
+    else
+      messages.append(Out.NL+"Generation aborted."+Out.NL);
+  }
+
+  private void stop() {
+    if (thread != null) {
+    	/* stop ok here despite deprecation (?)
+    	   I don't know any good way to abort generation without changing the
+     		 generator code */ 
+      thread.stop();
+      thread = null;
+    }
+    generationFinished(false);
+  }
+ 
+  private void quit() {
+    setVisible(false);
+    System.exit(0);
+  }
+  
+  private void dirChoose() {
+    choosing = true;
+    
+    FileDialog d = new FileDialog(this, "Choose directory", FileDialog.LOAD);
+    
+    d.show();
+    
+    if (d.getDirectory() != null) {
+      dir.setText( (new File(d.getDirectory())).getAbsolutePath() );
+    }
+    
+    choosing = false;    
+  }
+
+  private void specChoose() {
+    choosing = true;
+    
+    FileDialog d = new FileDialog(this, "Choose file", FileDialog.LOAD);
+    
+    d.setFile("*.flex");
+    d.show();
+    
+    if (d.getFile() != null) {
+      fileName = d.getDirectory()+d.getFile();
+      dir.setText(d.getDirectory());
+      spec.setText(fileName);
+    }
+    
+    choosing = false;    
+  }
+    
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/OptionsDialog.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/OptionsDialog.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/gui/OptionsDialog.java	(revision 25584)
@@ -0,0 +1,259 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.gui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import java.io.File;
+
+import JFlex.GeneratorException;
+import JFlex.Options;
+import JFlex.Skeleton;
+
+/**
+ * A dialog for setting JFlex options
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class OptionsDialog extends Dialog {
+
+  private Frame owner;
+
+  private Button skelBrowse;
+  private TextField skelFile;
+
+  private Button ok;
+  private Button defaults;
+
+  private Checkbox dump;
+  private Checkbox verbose;
+  private Checkbox jlex;
+  private Checkbox no_minimize; 
+  private Checkbox no_backup; 
+  private Checkbox time;
+  private Checkbox dot;
+
+  private Checkbox tableG;
+  private Checkbox switchG;
+  private Checkbox packG; 
+  
+
+  /**
+   * Create a new options dialog
+   * 
+   * @param owner
+   */
+  public OptionsDialog(Frame owner) {
+    super(owner, "Options");
+
+    this.owner = owner;
+    
+    setup();
+    pack();
+    
+    addWindowListener( new WindowAdapter() {
+      public void windowClosing(WindowEvent e) {
+        close();
+      }
+    });
+  }
+
+  public void setup() {
+    // create components
+    ok = new Button("Ok");
+    defaults = new Button("Defaults");    
+    skelBrowse = new Button(" Browse");
+    skelFile = new TextField();
+    skelFile.setEditable(false);
+    dump = new Checkbox(" dump");
+    verbose = new Checkbox(" verbose");
+
+    jlex = new Checkbox(" JLex compatibility");
+    no_minimize = new Checkbox(" skip minimization");
+    no_backup = new Checkbox(" no backup file");
+    time = new Checkbox(" time statistics");
+    dot = new Checkbox(" dot graph files");
+
+    CheckboxGroup codeG = new CheckboxGroup();
+    tableG = new Checkbox(" table",Options.gen_method == Options.TABLE, codeG);
+    switchG = new Checkbox(" switch",Options.gen_method == Options.SWITCH, codeG);
+    packG = new Checkbox(" pack",Options.gen_method == Options.PACK, codeG);
+    
+    // setup interaction
+    ok.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        close();
+      }
+    } );
+
+    defaults.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        setDefaults();
+      }
+    } );
+
+    skelBrowse.addActionListener( new ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        skelBrowse();
+      }
+    } );
+
+    tableG.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        setGenMethod();
+      }
+    } );
+
+    verbose.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        Options.verbose = verbose.getState();                    
+      }
+    } );
+
+    dump.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        Options.dump = dump.getState();                    
+      }
+    } );
+
+    jlex.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        Options.jlex = jlex.getState();                    
+      }
+    } );
+
+    no_minimize.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        Options.no_minimize = no_minimize.getState();                    
+      }
+    } );
+    
+    no_backup.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        Options.no_backup = no_backup.getState();                    
+      }
+    } );
+
+    dot.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        Options.dot = dot.getState();                    
+      }
+    } );
+
+    time.addItemListener( new ItemListener() {
+      public void itemStateChanged(ItemEvent e) {
+        Options.time = time.getState();                    
+      }
+    } );
+
+    // setup layout
+    GridPanel panel = new GridPanel(4,7,10,10);
+    panel.setInsets( new Insets(10,5,5,10) );
+    
+    panel.add(3,0,ok);
+    panel.add(3,1,defaults);
+     
+    panel.add(0,0,2,1,Handles.BOTTOM,new Label("skeleton file:"));
+    panel.add(0,1,2,1,skelFile);
+    panel.add(2,1,1,1,Handles.TOP, skelBrowse);
+     
+    panel.add(0,2,1,1,Handles.BOTTOM,new Label("code:"));
+    panel.add(0,3,1,1,tableG);
+    panel.add(0,4,1,1,switchG);
+    panel.add(0,5,1,1,packG);
+
+    panel.add(1,3,1,1,dump);
+    panel.add(1,4,1,1,verbose);
+    panel.add(1,5,1,1,time);
+    
+
+    panel.add(2,3,1,1,no_minimize);
+    panel.add(2,4,1,1,no_backup);
+
+    panel.add(3,3,1,1,jlex);
+    panel.add(3,4,1,1,dot);
+         
+    add("Center",panel);
+    
+    updateState();
+  }
+  
+  private void skelBrowse() {
+    FileDialog d = new FileDialog(owner , "Choose file", FileDialog.LOAD);
+    d.show();
+    
+    if (d.getFile() != null) {
+      File skel = new File(d.getDirectory()+d.getFile());
+      try {
+        Skeleton.readSkelFile(skel);
+        skelFile.setText(skel.toString());
+      }
+      catch (GeneratorException e) {
+        // do nothing
+      }
+    }
+  }
+
+  private void setGenMethod() {
+    if ( tableG.getState() ) {
+      Options.gen_method = Options.TABLE;
+      return;
+    }
+    
+    if ( switchG.getState() ) {
+      Options.gen_method = Options.SWITCH;
+      return;
+    }
+    
+    if ( packG.getState() ) {
+      Options.gen_method = Options.PACK;
+      return;
+    }
+  }
+
+  private void updateState() {
+    dump.setState(Options.dump);
+    verbose.setState(Options.verbose);
+    jlex.setState(Options.jlex);
+    no_minimize.setState(Options.no_minimize); 
+    no_backup.setState(Options.no_backup);
+    time.setState(Options.time);
+    dot.setState(Options.dot);
+
+    tableG.setState(Options.gen_method == Options.TABLE);
+    switchG.setState(Options.gen_method == Options.SWITCH);
+    packG.setState(Options.gen_method == Options.PACK);     
+  }
+
+  private void setDefaults() {
+    Options.setDefaults();
+    Skeleton.readDefault();
+    skelFile.setText("");
+    updateState();
+  }
+
+  public void close() {
+    hide();
+  }
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/sym.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/sym.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/sym.java	(revision 25584)
@@ -0,0 +1,61 @@
+
+//----------------------------------------------------
+// The following code was generated by CUP v0.11a beta 20060608
+// Sat Jan 31 23:52:43 EST 2009
+//----------------------------------------------------
+
+package JFlex;
+
+/** CUP generated interface containing symbol constants. */
+public interface sym {
+  /* terminals */
+  public static final int DELIMITER = 9;
+  public static final int EOFRULE = 26;
+  public static final int STRING_I = 46;
+  public static final int CHAR = 40;
+  public static final int CONCAT = 45;
+  public static final int MACROUSE = 42;
+  public static final int LOWERCLASS = 25;
+  public static final int EQUALS = 10;
+  public static final int CCLASSNOT = 44;
+  public static final int REPEAT = 32;
+  public static final int TILDE = 39;
+  public static final int CHAR_I = 47;
+  public static final int STAR = 33;
+  public static final int BAR = 35;
+  public static final int FULL = 17;
+  public static final int LOOKAHEAD = 28;
+  public static final int LESSTHAN = 12;
+  public static final int BANG = 38;
+  public static final int COMMA = 11;
+  public static final int JLETTERDIGITCLASS = 21;
+  public static final int PLUS = 34;
+  public static final int USERCODE = 31;
+  public static final int EOF = 0;
+  public static final int error = 1;
+  public static final int DASH = 8;
+  public static final int CLOSEBRACKET = 3;
+  public static final int HAT = 4;
+  public static final int JLETTERCLASS = 20;
+  public static final int IDENT = 30;
+  public static final int ACTION = 29;
+  public static final int CLOSECLASS = 7;
+  public static final int DIGITCLASS = 23;
+  public static final int LBRACE = 14;
+  public static final int REGEXPEND = 19;
+  public static final int OPENCLASS = 6;
+  public static final int OPENBRACKET = 2;
+  public static final int POINT = 37;
+  public static final int LETTERCLASS = 22;
+  public static final int MORETHAN = 13;
+  public static final int DOLLAR = 5;
+  public static final int RBRACE = 15;
+  public static final int STRING = 41;
+  public static final int QUESTION = 36;
+  public static final int UPPERCLASS = 24;
+  public static final int NOACTION = 27;
+  public static final int CCLASS = 43;
+  public static final int ASCII = 16;
+  public static final int UNICODE = 18;
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/AllTests.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/AllTests.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/AllTests.java	(revision 25584)
@@ -0,0 +1,50 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * jflex                                                         *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * AllTests
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class AllTests {
+
+  public static void main(String[] args) {
+    junit.textui.TestRunner.run(AllTests.class);
+  }
+
+  public static Test suite() {
+    TestSuite suite = new TestSuite("JFlex tests");
+    //$JUnit-BEGIN$
+    suite.addTest(new TestSuite(AntTaskTests.class));
+    suite.addTest(new TestSuite(CharClassesTest.class));
+    suite.addTest(new TestSuite(EmitterTest.class));
+    suite.addTest(new TestSuite(RegExpTests.class));
+    suite.addTest(new TestSuite(SkeletonTest.class));
+    suite.addTest(new TestSuite(PackEmitterTest.class));
+    //$JUnit-END$
+    return suite;
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/AntTaskTests.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/AntTaskTests.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/AntTaskTests.java	(revision 25584)
@@ -0,0 +1,167 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+package JFlex.tests;
+
+import java.io.File;
+import java.io.IOException;
+
+import JFlex.Options;
+import JFlex.anttask.JFlexTask;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for the jflex ant task.
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class AntTaskTests extends TestCase {
+
+  private JFlexTask task;
+
+  /**
+   * Constructor for AntTaskTests.
+   * 
+   * @param name  test case name
+   */
+  public AntTaskTests(String name) {
+    super(name);
+  }
+
+  /*
+   * @see TestCase#setUp()
+   */
+  protected void setUp() throws Exception {
+    super.setUp();
+    Options.setDefaults();
+    task = new JFlexTask();
+  }
+
+  public void testPackageAndClass() throws IOException {
+    task.setFile(new File("src/JFlex/LexScan.flex"));
+    task.findPackageAndClass();
+    assertEquals(task.getPackage(), "JFlex");
+    assertEquals(task.getClassName(), "LexScan");
+  }
+
+  public void testPackageAndClassDefaults() throws IOException {
+    task.setFile(new File("examples/simple/simple.flex"));
+    task.findPackageAndClass();
+    assertEquals(task.getPackage(), null);
+    assertEquals(task.getClassName(), "Yylex");
+  }
+
+  public void testDestdir() throws IOException {
+    task.setFile(new File("src/JFlex/LexScan.flex"));
+    File dir = new File("src");
+    task.setDestdir(dir);
+    task.findPackageAndClass();
+    task.normalizeOutdir();
+    // not default jflex logic, but javac (uses package name) 
+    assertEquals(Options.getDir(), new File(dir, "JFlex"));
+  }
+
+  public void testOutdir() throws IOException {
+    task.setFile(new File("src/JFlex/LexScan.flex"));
+    File dir = new File("src");
+    task.setOutdir(dir);
+    task.findPackageAndClass();
+    task.normalizeOutdir();
+    // this should be default jflex logic 
+    assertEquals(Options.getDir(), dir);
+  }
+
+  public void testDefaultDir() throws IOException {
+    task.setFile(new File("src/JFlex/LexScan.flex"));
+    task.findPackageAndClass();
+    task.normalizeOutdir();
+    // this should be default jflex logic 
+    assertEquals(Options.getDir(), new File("src/JFlex"));
+  }
+
+  public void testNomin() {
+    assertTrue(!Options.no_minimize);
+    task.setNomin(true);
+    assertTrue(Options.no_minimize);
+  }
+
+  public void testSkipMinimization() {
+    assertTrue(!Options.no_minimize);
+    task.setSkipMinimization(true);
+    assertTrue(Options.no_minimize);
+  }
+
+  public void testNobak() {
+    assertTrue(!Options.no_backup);
+    task.setNobak(true);
+    assertTrue(Options.no_backup);
+  }
+
+  public void testCodeGen() {
+    task.setSwitch(true);
+    assertEquals(Options.gen_method, Options.SWITCH);
+    task.setTable(true);
+    assertEquals(Options.gen_method, Options.TABLE);
+    task.setPack(true);
+    assertEquals(Options.gen_method, Options.PACK);
+  }
+
+  public void testSkel() {
+    task.setVerbose(false); // avoid to java console pop up
+    task.setSkeleton(new File("src/skeleton.nested"));
+    assertTrue(JFlex.Skeleton.line[3].indexOf("java.util.Stack") > 0);
+  }
+  
+  public void testVerbose() {
+    task.setVerbose(false);
+    assertTrue(!Options.verbose);
+    task.setVerbose(true);
+    assertTrue(Options.verbose);
+  }
+
+  public void testTime() {
+    assertTrue(!Options.time);
+    task.setTimeStatistics(true);
+    assertTrue(Options.time);   
+    task.setTime(false);
+    assertTrue(!Options.time);    
+  }
+  
+  public void testDot() {
+    assertTrue(!Options.dot);
+    task.setDot(true);
+    assertTrue(Options.dot);
+    task.setGenerateDot(false);
+    assertTrue(!Options.dot);
+  }
+  
+  public void testDump() {
+    assertTrue(!Options.dump);
+    task.setDump(true);
+    assertTrue(Options.dump);
+  }
+  
+  public void testJlex() {
+    assertTrue(!Options.jlex);
+    task.setJLex(true);
+    assertTrue(Options.jlex);
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/CharClassesTest.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/CharClassesTest.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/CharClassesTest.java	(revision 25584)
@@ -0,0 +1,103 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.tests;
+
+import JFlex.IntCharSet;
+import JFlex.Interval;
+import junit.framework.TestCase;
+
+/**
+ * CharClassesTest
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class CharClassesTest extends TestCase {
+
+  /**
+   * Constructor for CharClassesTest.
+   * @param arg0
+   */
+  public CharClassesTest(String arg0) {
+    super(arg0);
+  }
+
+  public void testAdd1() {
+    IntCharSet set = new IntCharSet(new Interval('a','h'));
+    set.add(new Interval('o','z'));
+    set.add(new Interval('A','Z'));
+    set.add(new Interval('h','o'));
+    assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString());
+  }
+
+  public void testAdd2() {
+    IntCharSet set = new IntCharSet(new Interval('a','h'));
+    set.add(new Interval('o','z'));
+    set.add(new Interval('A','Z'));
+    set.add(new Interval('i','n'));
+    assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString());
+  }
+
+  public void testAdd3() {
+    IntCharSet set = new IntCharSet(new Interval('a','h'));
+    set.add(new Interval('o','z'));
+    set.add(new Interval('A','Z'));
+    set.add(new Interval('a','n'));
+    assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString());
+  }
+  
+  public void testMergeLast() {
+    IntCharSet set = new IntCharSet(new Interval('a','k'));
+    assertEquals("{ ['a'-'k'] }", set.toString());
+    set.add('l');
+    assertEquals("{ ['a'-'l'] }", set.toString());
+  }
+
+  public void testAddChar() {
+    IntCharSet set = new IntCharSet(new Interval('a','h'));
+    set.add(new Interval('o','z'));
+    set.add('n');
+    set.add('k');
+    assertEquals("{ ['a'-'h']['k']['n'-'z'] }", set.toString());
+    set.add('i');
+    assertEquals("{ ['a'-'i']['k']['n'-'z'] }", set.toString());    
+    set.add('j');
+    assertEquals("{ ['a'-'k']['n'-'z'] }", set.toString());    
+    set.add(new Interval('l','m'));
+    assertEquals("{ ['a'-'z'] }", set.toString());    
+  }
+
+  public void testCopy() {
+    IntCharSet set = new IntCharSet(new Interval('a','z'));
+    IntCharSet copy = set.copy();
+    Interval i = set.getNext();
+    i.end = 'h';
+    assertEquals("{ ['a'-'h'] }", set.toString());
+    assertEquals("{ ['a'-'z'] }", copy.toString());
+  }
+
+  public void testCaseless() {
+    IntCharSet set = new IntCharSet(new Interval('a','c'));
+    set.add(new Interval('h','o'));
+    assertEquals("{ ['A'-'C']['H'-'O']['a'-'c']['h'-'o'] }", 
+                 set.getCaseless().toString());
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/EmitterTest.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/EmitterTest.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/EmitterTest.java	(revision 25584)
@@ -0,0 +1,50 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.tests;
+
+import JFlex.Emitter;
+import junit.framework.TestCase;
+
+/**
+ * Some unit tests for the jflex Emitter class
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class EmitterTest extends TestCase {
+
+  /**
+   * Constructor for EmitterTest.
+   * @param name  the test name
+   */
+  public EmitterTest(String name) {
+    super(name);
+  }
+
+  public void testJavadoc() {
+    StringBuffer usercode = new StringBuffer("/* some *** comment */");
+    assertTrue(!Emitter.endsWithJavadoc(usercode));
+    usercode.append("import bla;  /** javadoc /* */  ");
+    assertTrue(Emitter.endsWithJavadoc(usercode));
+    usercode.append("bla");
+    assertTrue(!Emitter.endsWithJavadoc(usercode));
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/PackEmitterTest.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/PackEmitterTest.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/PackEmitterTest.java	(revision 25584)
@@ -0,0 +1,80 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * jflex                                                         *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.tests;
+
+import junit.framework.TestCase;
+import JFlex.Out;
+import JFlex.PackEmitter;
+
+/**
+ * PackEmitterTest
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class PackEmitterTest extends TestCase {
+
+  private PackEmitter p;
+
+
+  /**
+   * Constructor for PackEmitterTest.
+   */
+  public PackEmitterTest() {
+    super("PackEmitter test");
+  }
+
+  public void setUp() {
+    p = new PackEmitter("Bla") {
+          public void emitUnpack() { }
+    };
+  }
+
+  public void testInit() {
+    p.emitInit();
+    assertEquals(
+      "  private static final int [] ZZ_BLA = zzUnpackBla();" + Out.NL +
+      Out.NL +
+      "  private static final String ZZ_BLA_PACKED_0 =" + Out.NL +
+      "    \"", 
+      p.toString());
+  }
+
+  public void testEmitUCplain() {    
+    p.emitUC(8);
+    p.emitUC(0xFF00);
+    
+    assertEquals("\\10\\uff00", p.toString());
+  }
+  
+  public void testLineBreak() {
+    for (int i = 0; i < 36; i++) {
+      p.breaks();
+      p.emitUC(i);
+    }
+    System.out.println(p);
+    assertEquals(
+            "\\0\\1\\2\\3\\4\\5\\6\\7\\10\\11\\12\\13\\14\\15\\16\\17\"+"+Out.NL+
+      "    \"\\20\\21\\22\\23\\24\\25\\26\\27\\30\\31\\32\\33\\34\\35\\36\\37\"+"+Out.NL+
+      "    \"\\40\\41\\42\\43",
+      p.toString());
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/RegExpTests.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/RegExpTests.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/RegExpTests.java	(revision 25584)
@@ -0,0 +1,62 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.tests;
+
+import JFlex.*;
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for JFlex.RegExp 
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class RegExpTests extends TestCase implements sym {
+  
+  /**
+   * Constructor for RegExpTests.
+   * 
+   * @param name the test name
+   */
+  public RegExpTests(String name) {
+    super(name);
+  }
+
+  public void testrevString() {
+    assertTrue(RegExp.revString("blah").equals("halb"));
+  }
+
+  public void testCharClass() {
+    Macros m = new Macros();    
+    RegExp e1 = new RegExp1(CCLASS, new Interval('a','z'));
+    RegExp e2 = new RegExp1(CHAR, new Character('Z'));
+    RegExp e3 = new RegExp1(CCLASS, new Interval('0','9'));
+    m.insert("macro", e3);
+    RegExp s = new RegExp1(STAR, e1);
+    RegExp u = new RegExp1(MACROUSE, "macro");    
+    RegExp b = new RegExp2(BAR, e2, u);
+    assertTrue(e1.isCharClass(m));
+    assertTrue(e2.isCharClass(m));
+    assertTrue(b.isCharClass(m));
+    assertTrue(!s.isCharClass(m));
+    assertTrue(u.isCharClass(m));
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/SkeletonTest.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/SkeletonTest.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/JFlex/tests/SkeletonTest.java	(revision 25584)
@@ -0,0 +1,63 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * JFlex 1.4.3                                                             *
+ * Copyright (C) 1998-2009  Gerwin Klein <lsf@jflex.de>                    *
+ * All rights reserved.                                                    *
+ *                                                                         *
+ * This program is free software; you can redistribute it and/or modify    *
+ * it under the terms of the GNU General Public License. See the file      *
+ * COPYRIGHT for more information.                                         *
+ *                                                                         *
+ * This program is distributed in the hope that it will be useful,         *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
+ * GNU General Public License for more details.                            *
+ *                                                                         *
+ * You should have received a copy of the GNU General Public License along *
+ * with this program; if not, write to the Free Software Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                 *
+ *                                                                         *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+package JFlex.tests;
+
+
+import java.io.File;
+
+import JFlex.Skeleton;
+import junit.framework.TestCase;
+
+/**
+ * SkeletonTest
+ * 
+ * @author Gerwin Klein
+ * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $
+ */
+public class SkeletonTest extends TestCase {
+
+  /**
+   * Constructor for SkeletonTest.
+   * @param arg0 test name
+   */
+  public SkeletonTest(String arg0) {
+    super(arg0);
+  }
+
+  public void testReplace() {
+    assertEquals(Skeleton.replace("bla ", "blub", "bla blub bla "), 
+                 "blubblub blub");
+  }
+
+  public void testMakePrivate() {
+    Skeleton.makePrivate(); 
+    for (int i=0; i < Skeleton.line.length; i++) {
+      assertEquals(Skeleton.line[i].indexOf("public"), -1);
+    }
+  }
+
+  public void testDefault() {
+    Skeleton.readSkelFile(new File("src/skeleton.nested"));
+    assertTrue(JFlex.Skeleton.line[3].indexOf("java.util.Stack") > 0);
+    Skeleton.readDefault();
+    assertEquals(JFlex.Skeleton.line[3].indexOf("java.util.Stack"), -1);
+  }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/README
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/README	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/README	(revision 25584)
@@ -0,0 +1,46 @@
+This directory contains the source code for JFlex.
+
+Dependencies
+
+You need the following tools in your class path:
+
+ant.jar      >= 1.4       
+
+To compile, run first
+
+ant gettoolds
+(this will download JFlex, java_cup, and junit jars for bootstrapping)
+
+then, run
+ant jar
+
+
+The command "ant help" should give you other useful targets.
+
+
+Directory contents:
+manifest:
+  jar manifest file for JFlex.jar
+
+skeleton:
+  a skeleton file matching exactly the precompiled scanner skeleton.
+  Can be used together with the --skel option 
+
+skeleton.nested:
+  a skeleton file that supports nested input streams (see the manual 
+  for the API). Can be used together with the --skel option
+
+JFlex:
+  source files of package JFlex
+
+JFlex/gui:
+  source files of package JFlex.gui
+
+JFlex/anttask
+  source files of the JFlex Ant task (contributed by Rafal Mantiuk)
+  
+JFlex/test
+  unit tests for JFlex
+
+java_cup/runtime:
+  CUP 11a beta 20060608 runtime classes, used by JFlex   
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/build.xml
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/build.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/build.xml	(revision 25584)
@@ -0,0 +1,114 @@
+<project name="JFlex" default="help">
+
+  <!-- ==================== properties ============================== -->
+
+  <!-- use any of these files to override properties -->
+  <property file="build.properties" />
+  <property file="${user.home}/.jflex.properties" />
+  
+  <!-- location of development tools necessary for the build -->
+  <property name="tools.dir" value="../tools"/>
+  
+  <!-- override these if you want to use your own versions -->
+  <property name="jflex.jar" value="${tools.dir}/JFlex.jar" />
+  <property name="cup.jar" value="${tools.dir}/java_cup.jar" />
+  <property name="junit.jar" value="${tools.dir}/junit.jar" />
+
+  <!-- where to get tool jars from -->
+  <property name="jflex.jar.url" 
+  	        value="http://jflex.sourceforge.net/jar/stable/JFlex.jar" />
+  <property name="cup.jar.url" 
+  	        value="http://jflex.sourceforge.net/jar/stable/java_cup.jar" />
+  <property name="junit.jar.url"
+                value="http://jflex.sourceforge.net/jar/stable/junit.jar" />
+
+  	        
+  <!-- ==================== targets ================================= -->
+
+  <target name="help" description="show help message">
+  	<echo message="Ant build file for JFlex. Useful targets:"/> 
+  	<echo message=""/> 
+  	<echo message="gettools:   download development tools for the build"/> 
+  	<echo message="realclean:  remove all compiled and generated files"/>
+  	<echo message="jar:        make JFlex.jar"/> 
+  	<echo message=""/> 
+  	<echo message="Use the gettool target or override the *.jar properties"/>
+  	<echo message="before you do the first build."/> 
+  </target> 
+
+  <target name="declare" description="define tasks for jflex and cup">
+    <taskdef classname="JFlex.anttask.JFlexTask" name="jflex" classpath="${jflex.jar}"/>
+    <taskdef classname="java_cup.anttask.CUPTask" name="cup" classpath="${cup.jar}"/>
+  </target>
+
+  <target name="gettools" description="download development tools">
+    <mkdir dir="${tools.dir}"/>
+    <get src="${jflex.jar.url}" dest="${jflex.jar}"/>
+    <get src="${cup.jar.url}" dest="${cup.jar}"/>
+    <get src="${junit.jar.url}" dest="${junit.jar}"/>
+  </target>
+
+  <target name="dist" description="build distribution">
+    <antcall target="gettools" />
+    <antcall target="build" />
+    <antcall target="libclean" />
+  </target>
+
+  <target name="build" depends="realclean,jar" 
+          description="complete build from scratch"/>
+
+  <target name="cbuild" depends="libclean,compile,jar" 
+          description="recompile and pack all classes"/> 
+
+  <target name="compile" depends="jflex,cup"
+          description="compile all classes">
+    <javac srcdir="." 
+           destdir="../lib" 
+           target="1.1"
+    	     source="1.2"
+           classpath=".:${junit.jar}"
+           debug="on" />
+  </target>
+
+  <target name="jflex" depends="declare" description="generate scanner">
+    <jflex file="JFlex/LexScan.flex" skeleton="skeleton.nested"/>
+  </target>
+
+  <target name="cup" depends="declare" description="generate parser">
+    <cup srcfile="JFlex/LexParse.cup" interface="true" parser="LexParse" />
+  </target>
+
+  <target name="copy" description="copy resources to build dir">
+    <copy file="skeleton.default" todir="../lib/JFlex" />
+    <copy file="JFlex/Messages.properties" todir="../lib/JFlex/" />
+  </target>
+
+  <target name="jar" depends="compile,copy" description="make JFlex.jar">
+    <jar basedir="../lib" 
+    	 includes="JFlex/**,java_cup/**,skeleton" 
+    	 jarfile="../lib/JFlex.jar" 
+    	 manifest="manifest"/>
+  </target>
+
+  <target name="libclean" description="remove compiled classes">
+    <delete dir="../lib/JFlex" />
+    <delete dir="../lib/java_cup" />
+  </target>
+
+  <target name="jarclean" description="remove JFlex.jar">
+    <delete file="../lib/JFlex.jar" />
+  </target>
+
+  <target name="genclean" description="remove genrated classes">
+    <delete file="JFlex/LexScan.java" />
+    <delete file="JFlex/LexParse.java" />
+    <delete file="JFlex/sym.java" />
+  </target>
+
+  <target name="clean" description="remove backup files">
+    <delete> <fileset dir="." includes="**/*~"/> </delete>
+  </target>
+
+  <target name="realclean" depends="clean,genclean,libclean,jarclean" 
+          description="clean up extra tidily"/>
+</project>
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/changelog
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/changelog	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/changelog	(revision 25584)
@@ -0,0 +1,277 @@
+* JFlex 1.4.3 (Jan 31, 2009)
+- fixed bug #2018299 (lookahead syntax error)
+- fixed bug #2010261 (min_int in Java example scanner)
+- fixed bug #2007221 (zzEOFDone not reset in yyreset(Reader))
+- fixed bug #1999301 (%type and %int at the same time should produce error msg)
+
+* JFlex 1.4.2 (May 27, 2008)
+- implemented feature request #1212181:
+  Now supports generics syntax for %type, %extends, etc
+- implemented feature request #1762500:
+  Provided %ctorarg option to add arguments to constructor
+- fixed bug #1464525 (Reader.read might return 0)
+- fixed bug #1968897 (Ambiguous error message in macro expansion)
+- fixed bug #1832973 (Syntax error in input may cause NullPointerException)
+- fixed bug #1629920 (Need to defend against path blanks in jflex bash script)
+- fixed bug #1540228 (EOF actions may be ignored for same lex state)
+- fixed bug #1498726 (syntax error in generated ZZ_CMAP)
+- fixed bug #1282840 (lookahead and "|" actions)
+- fixed bug #1164852 (yytext() longer than expected with lookahead)
+- fixed bug #1065521 (OS/2 Java 1.1.8 Issues)
+- fixed bug #421495 (dangerous lookahead check may fail)   
+
+* JFlex 1.4.1 (November 7, 2004)
+- merged in patch by Don Brown (fixes #1049791 Uses Old JUnit method assertFalse)
+- merged in patch by Don Brown (fixes #887821  buffer expansion bug in yy_refill())
+  Thanks to Binesh Bannerjee for providing a simpler test case for this problem.
+- fixed bug #1035407 (ArrayIndexOutOfBounds in IntCharSet)
+- fixed bug #1003569 (Cannot use lookahead with ignorecase)
+- converted dangerous lookahead error to warning
+- print info for EOF actions as well in %debug mode
+- fixed line number count for EOF actions
+- internal: removed unused methods in LexScan.flex and IntCharSet
+
+* JFlex 1.4 (April 12, 2004)
+- new, very fast minimization algorithm (also fixes memory issues)
+- new --jlex option for strict compatibility to JLex. Currently it 
+  changes %ignorecase to JLex semantics, that is, character classes 
+  are interpreted in a caseless way, too.  
+  (fixes bus #751757, %ignorecase ignored by char classes).
+  Thanks to Edward D. Willink for spotting the incompatibility.
+- support for even larger scanners (up to 64K DFA states).
+  Thanks to Karin Vespoor.
+- removed eclipse compiler warnings for generated classes
+  (feature request #778747)
+- implemented faster character classes (feature request #604589).
+  Expressions like [a-z] | [A-Z] are interpreted as one atomic class
+  [a-zA-Z], reducing NFA states and generation time significantly
+  for some specifications. This affects the generation process only,
+  generated scanners remain the same.
+- new %apiprivate switch (feature request #513500/1) that causes all 
+  generated and skeleton methods to be made private. Exceptions to this
+  are user defined functions and the constructor. Thanks to Stephen 
+  Ostermiller for the suggestion.
+- allow user defined javadoc class comments (feature request #513500/2)
+  If the user code section ends with a javadoc comment, JFlex takes this
+  instead of the generated comment. Thanks to Stephen Ostermiller for 
+  the suggestion.  
+- fixed bug #491095 (undefined macros in complement expressions do 
+  not throw exception in generator). Thanks to Stephen Ostermiller
+  for the bug report.
+- fixed bug #495422 (yypushStream/yypopStream in skeleton.nested 
+  work as advertised)
+- fixed bug #611118 (no wrong macro warnings on regexp negation)
+- fixed bug #655528 (%cupsym now also affects %cupdebug)
+  Thanks to Eric Schweitz for the fix.
+- fixed bug #510010 (single-line %initthrow works now 
+  in case of extra whitespace before newline)
+- yyreset() does no longer close the associated reader (use yyclose() 
+  explicitly for that). Makes some reader objects reusable (feature
+  request #513492). Thanks to Stephen Ostermiller for the suggestion.  
+- fixed modifier order in generated code, removes jikes compiler warnings
+  Thanks to Michael Wildpaner for the fix.
+- ant task now also works with ant >= 1.4 (fixes bug #526905)
+- yyreset() does not declare an execption any more (fixes bug #913132)
+- %cup does not include %eofclose in JLex mode (--jlex). (Fixes bug #910562)
+- optional parameter to %eofclose: "%eofclose false" turns off %eofclose if 
+  it was turned on previously (e.g. by %cup). (Fixes bug #910562)
+- jflex build script switched to ant
+- internal: central Options class for better integration with 
+  build tools and IDEs
+- internal: change naming scheme for generated internal variables from 
+  yy_ to zz to comply with Java naming standard. Thanks to Max Gilead 
+  for the patch.
+
+
+* JFlex 1.3.5 (October 8, 2001)
+- fixed all bugs reported for version 1.3.4. Thanks to
+  Amin Ahmad and Fred Wehrhahn for their excellent bug reports.
+- implemented feature request #459014: vim syntax file.  
+  Thanks to Michael Brailsford for his help and suggestions.
+- JFlex should run with JDK 1.1 out-of-the-box again.
+
+
+* JFlex 1.3.4 (October 1, 2001)
+- fixed all bugs reported for version 1.3.3. Thanks to Mike Akerman
+  for his excellent bug reports and his help.
+- implemented feature request #459355: exclusive start states.
+  Thanks to Ed Beroset for the suggestion.
+- introduced %s and %x shorthands for state declarations
+
+
+* JFlex 1.3.3 (September 21, 2001)
+- fixed all reported bugs except #39 (lookahead check at generation
+  time may fail).  Thanks to Axel Schwolow, Karl Meissner, Angelo
+  Borsotti, and Paolo Di Francesco for their excellent bug reports.
+- enhanced %debug output. JFlex scanners in debug mode now print line,
+  column, matched text, and executed action (with line number in spec)
+  for each processed token.  Thanks to 
+  <a href="http://meissner.v0.net/msd.htm">Karl Meissner</a> for the 
+  suggestion.  
+- introduced %cupdebug directive for readable CUP debugging. Generated
+  scanners print line, column, matched text, and CUP symbol name for
+  each returned token. Again thanks to Karl Meissner for tips and
+  contributed Java reflection code.
+- new %cupsym to customize CUP generated symbols class name. Thanks 
+  to Karl Meissner and Paolo Di Francesco.
+- new %throws as shorthand for %yylexthrow
+- code generation now customizable at command line with --table,
+  --pack, and --switch 
+- command line switch --info prints system and JVM information (useful
+  for bug reports) 
+- command line switch --nobak for not generating backup files
+- an Ant task for the Ant build tool http://jakarta.apache.org/ant/
+  contributed by Rafal Mantiuk. Many thanks to him.
+- better error message for missing ] in char class. Thanks to Karl
+  Meissner.
+- performance enhancements in the runtime system. The engine is now
+  10%-50% faster. These are only the first implementations of a few of
+  the many suggestions from Angelo Borsotti. Thanks to Angelo for many
+  insights, tips, and fruitful discussions.
+- a new warning if a rule can never be matched 
+- macros and regular expression can now span multiple lines (note
+  that <tt>|</tt> at the end of a line in a rule is a special action, 
+  not the <tt>|</tt> operator)
+- updated the manual to contain more information about the generated
+  class, clarified the description of lexical states. Thanks to Michael 
+  Binz, Angelo Borsotti, Vasily Karyaev and  for the suggestions.
+- Simplified java example lexer, and allow // style comments at EOF.
+  Thanks to Thomas Mulcahy.
+- Byacc/J example updated to version 1.1
+- New interpreter example using CUP. Thanks to Bernhard Rumpe for
+  the code.
+  
+  
+* JFlex 1.3.2 (February 24, 2001)
+- fixed bug #32 (this time for real). Thanks to Thilo Goetz for 
+  his quick report.
+- updated the binary scanning example with the more comprehensive and 
+  usable class StraightStreamReader by Stephen Ostermiller. Thanks go to
+  him for his contribution. The original version of this class is at
+  http://www.smo.f2s.com/utils/
+- added a link to a Japanese translation of the JFlex manual (it's in Japanese
+  Shift_JIS encoding). The translation is for an older release (1.1.2), but
+  most of the text still applies to the current version. See the change log
+  for the differences between 1.1.2 and the current version. Many thanks to
+  Yuichi Nakajima, Yukio Ikeda, Katsuhiko Yamazaki, and Koji Ooya for
+  their efforts.
+  If you would like to translate the JFlex manual into another language, or
+  if you already have done so, please let me know. I will include a link to
+  it on the documentation page. I can also give you access to the latex
+  sources of the manual, so that printable versions of your translation can
+  be generated, too.
+  
+  
+* JFlex 1.3.1 (February 20, 2001) 
+- fixed all JFlex bugs reported for 1.3 (bugs #32-#36)
+  Thanks to Hans Kratz, Vasily Karyaev, Alexey Yakovets, and Tom Moog for
+  their excellent reports.
+- added two new example scanners:
+  . a demonstration how to scan binary files
+  . a small calculator example for Cup, based on the example in the Linux
+    Gazette by Richard A. Sevenich and Christopher Lopes. See also
+    http://www.linuxgazette.com/issue39/sevenich.html
+    http://www.linuxgazette.com/issue41/sevenich.html
+    http://www.linuxgazette.com/issue41/lopes/lopes.html
+- manual section about encodings, platforms and Unicode.
+  Thanks to Stephen Ostermiller for his valuable input.
+- switch for skipping the minimization step in DFA generation (--nomin). 
+  This feature is still in alpha status and not yet extensively tested. It
+  might be useful when you have very large scanners and not much memory
+  available.
+- switch for generating graphviz dot files for graphical representation (ps
+  or gif) of generated NFA, DFA and minimized DFA (--dot). Might be useful for
+  teaching. This feature is also still in alpha status and not fully finished
+  yet. It is included as preview, comments are welcome, please try it out and
+  tell me what you think. For information on graphviz see
+  http://www.research.att.com:80/sw/tools/graphviz/
+- changed to --style long command line switches (single - still recognized).
+- moved part of the project to http://sourceforge.net/projects/jflex/
+
+
+* JFlex 1.3 (October 21, 2000) 
+
+- Fixed all bugs reported for 1.2.2 (bugs #23-#27). 
+- Better start script for Linux. 
+- Customize for internal error handling in yy_ScanError. 
+- Empty charclass [], and any (=negated empty) charclass [^]. 
+- New negation operator ! for regexps. 
+- New upto operator ~ for regexps. 
+- Customizable buffer size (%buffer). 
+- New char yycharat(int) for efficient access to single characters in matched text. 
+- Split up of too large lex tables for even larger scanner sizes. 
+- New additional external skeleton with support for nested input streams. 
+- JLex compatibility: BOL ^ and EOL $ use unicode line separators as in 
+  http://www.unicode.org/unicode/reports/tr18/tr18-5.1.html. 
+- New resetStream method for reusing scanner objects. 
+_ BYacc/J support (%byaccj) + BYacc/J example. 
+- Include files in lexer specs (%include). 
+- New --dump switch for a dump of the generated charclasses, NFA, DFA, and minimized DFA tables. 
+  
+  
+* JFlex 1.2.2 (August 23, 1999)
+- Updated JFlex to the new CUP version 0.10j. 
+- Eliminated some remaining platform dependent newlines in the generated source code 
+  (affecting the readabilty of the generated code only, no functional changes). 
+- Minor improvements in error reporting (out of memory). 
+- Added a --version command line option for printing the current jflex version. 
+- Updated the Java 1.2 lexer/parser example to CUP 0.10j. 
+
+  
+* JFlex 1.2.1 (June 25, 1999)
+- Fixed all bugs reported for version 1.2 (#19-#22). 
+- Webpage redesigned and moved to http://www.jflex.de. 
+- Example java lexer/parser switched to Java 1.2. 
+
+  
+* JFlex 1.2 (March 21, 1999)
+- Fixed all bugs for 1.1.2. 
+- JFlex now works again with Solaris JIT. 
+- Significant Unicode optimizations in scanning and generation performance, 
+- changed the empty string match wrt. EOF behavior to the one that is commonly expected. 
+- added command line switches for more customization
+- external skeleton files
+- new GUI without any console output
+- <<EOF>> as in lex/flex
+- better error messages
+- better generation speed
+- better generation memory efficiency
+- | Action, trailing context (/ operator)
+- new %final, %abstract and %extends directives
+- uses jar file
+- included makefile for JFlex, 
+- %pack now uses string packing, 
+- %pack now default code generation method, 
+- new %switch directive for old default code generation method, 
+- more convenient declaration of exceptions, 
+- new %int switch, 
+- manual now written in latex, available as html and in printable .ps.gz and pdf file formats. 
+
+  
+* JFlex 1.1.2
+- All bugs reported for version 1.1.1 (#8-#10) have been fixed. 
+  
+  
+* JFlex 1.1.1
+- All bugs reported for version 1.1 (i.e. bug #7 and feature request #6) have been fixed. 
+- Scanning speed was optimized further. 
+  
+  
+* JFlex 1.1 adds new features and fixes all known bugs of 1.0
+- Revised directory structure. 
+- Fixed all reported bugs (#1-#5 and some unreported ones). 
+- Fixed thousands of typos in the manual. 
+- whitespace characters in regular expressions, 
+- flex style repeat expressions, 
+- %caseless switch, 
+- %eofclose switch, 
+- method for closing the input stream, 
+- method for the current lexical state, 
+- method for rereading matched text, 
+- backup of files that are overwitten in the generation process, 
+- improved error reporting, 
+- graphical UI when no filename is provided on the commandline 
+  
+  
+* JFlex 1.0 (May 1998) was the first public release of JFlex. 
+ It was developed using Sun's JDK 1.1, JFlex (bootstrapped) and the parser generator CUP 
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/ComplexSymbolFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/ComplexSymbolFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/ComplexSymbolFactory.java	(revision 25584)
@@ -0,0 +1,119 @@
+package java_cup.runtime;
+
+/**
+ * Default Implementation for SymbolFactory, creates
+ * plain old Symbols
+ *
+ * @version last updated 27-03-2006
+ * @author Michael Petter
+ */
+
+/* *************************************************
+  class DefaultSymbolFactory
+
+  interface for creating new symbols  
+ ***************************************************/
+public class ComplexSymbolFactory implements SymbolFactory{
+    public static class Location {
+        private String unit="unknown";
+        private int line, column;
+        public Location(String unit, int line, int column){
+            this.unit=unit;
+            this.line=line;
+            this.column=column;
+        }
+        public Location(int line, int column){
+            this.line=line;
+            this.column=column;
+        }
+        public String toString(){
+            return unit+":"+line+"/"+column;
+        }
+        public int getColumn(){
+            return column;
+        }
+        public int getLine(){
+            return line;
+        }
+        public String getUnit(){
+            return unit;
+        }
+    }
+    /**
+     * ComplexSymbol with detailed Location Informations and a Name
+     */
+    public static class ComplexSymbol extends Symbol {
+        protected String name;
+        protected Location xleft,xright;
+        public ComplexSymbol(String name, int id) {
+            super(id);
+            this.name=name;
+        }
+        public ComplexSymbol(String name, int id, Object value) {
+            super(id,value);
+            this.name=name;
+        }
+        public String toString(){
+            if (xleft==null || xright==null) return "Symbol: "+name;
+            return "Symbol: "+name+" ("+xleft+" - "+xright+")";
+        }
+        public ComplexSymbol(String name, int id, int state) {
+            super(id,state);
+            this.name=name;
+        }
+        public ComplexSymbol(String name, int id, Symbol left, Symbol right) {
+            super(id,left,right);
+            this.name=name;
+            if (left!=null)  this.xleft = ((ComplexSymbol)left).xleft;
+            if (right!=null) this.xright= ((ComplexSymbol)right).xright;
+        }
+        public ComplexSymbol(String name, int id, Location left, Location right) {
+            super(id);
+            this.name=name;
+            this.xleft=left;
+            this.xright=right;
+        }
+        public ComplexSymbol(String name, int id, Symbol left, Symbol right, Object value) {
+            super(id,value);
+            this.name=name;
+            if (left!=null)  this.xleft = ((ComplexSymbol)left).xleft;
+            if (right!=null) this.xright= ((ComplexSymbol)right).xright;
+        }
+        public ComplexSymbol(String name, int id, Location left, Location right, Object value) {
+            super(id,value);
+            this.name=name;
+            this.xleft=left;
+            this.xright=right;
+        }
+        public Location getLeft(){
+            return xleft;
+        }
+        public Location getRight(){
+            return xright;
+        }
+    }
+
+
+    // Factory methods
+    public Symbol newSymbol(String name, int id, Location left, Location right, Object value){
+        return new ComplexSymbol(name,id,left,right,value);
+    }
+    public Symbol newSymbol(String name, int id, Location left, Location right){
+        return new ComplexSymbol(name,id,left,right);
+    }
+    public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value){
+        return new ComplexSymbol(name,id,left,right,value);
+    }
+    public Symbol newSymbol(String name, int id, Symbol left, Symbol right){
+        return new ComplexSymbol(name,id,left,right);
+    }
+    public Symbol newSymbol(String name, int id){
+        return new ComplexSymbol(name,id);
+    }
+    public Symbol newSymbol(String name, int id, Object value){
+        return new ComplexSymbol(name,id,value);
+    }
+    public Symbol startSymbol(String name, int id, int state){
+        return new ComplexSymbol(name,id,state);
+    }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/DefaultSymbolFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/DefaultSymbolFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/DefaultSymbolFactory.java	(revision 25584)
@@ -0,0 +1,52 @@
+package java_cup.runtime;
+
+/**
+ * Default Implementation for SymbolFactory, creates
+ * plain old Symbols
+ *
+ * @version last updated 27-03-2006
+ * @author Michael Petter
+ */
+
+/* *************************************************
+  class DefaultSymbolFactory
+
+  interface for creating new symbols  
+ ***************************************************/
+public class DefaultSymbolFactory implements SymbolFactory{
+    // Factory methods
+    /**
+     * DefaultSymbolFactory for CUP.
+     * Users are strongly encoraged to use ComplexSymbolFactory instead, since
+     * it offers more detailed information about Symbols in source code.
+     * Yet since migrating has always been a critical process, You have the
+     * chance of still using the oldstyle Symbols.
+     *
+     * @deprecated as of CUP v11a
+     * replaced by the new java_cup.runtime.ComplexSymbolFactory
+     */
+    //@deprecated 
+    public DefaultSymbolFactory(){
+    }
+    public Symbol newSymbol(String name ,int id, Symbol left, Symbol right, Object value){
+        return new Symbol(id,left,right,value);
+    }
+    public Symbol newSymbol(String name, int id, Symbol left, Symbol right){
+        return new Symbol(id,left,right);
+    }
+    public Symbol newSymbol(String name, int id, int left, int right, Object value){
+        return new Symbol(id,left,right,value);
+    }
+    public Symbol newSymbol(String name, int id, int left, int right){
+        return new Symbol(id,left,right);
+    }
+    public Symbol startSymbol(String name, int id, int state){
+        return new Symbol(id,state);
+    }
+    public Symbol newSymbol(String name, int id){
+        return new Symbol(id);
+    }
+    public Symbol newSymbol(String name, int id, Object value){
+        return new Symbol(id,value);
+    }
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/Scanner.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/Scanner.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/Scanner.java	(revision 25584)
@@ -0,0 +1,25 @@
+package java_cup.runtime;
+
+/**
+ * Defines the Scanner interface, which CUP uses in the default
+ * implementation of <code>lr_parser.scan()</code>.  Integration
+ * of scanners implementing <code>Scanner</code> is facilitated.
+ *
+ * @version last updated 23-Jul-1999
+ * @author David MacMahon <davidm@smartsc.com>
+ */
+
+/* *************************************************
+  Interface Scanner
+  
+  Declares the next_token() method that should be
+  implemented by scanners.  This method is typically
+  called by lr_parser.scan().  End-of-file can be
+  indicated either by returning
+  <code>new Symbol(lr_parser.EOF_sym())</code> or
+  <code>null</code>.
+ ***************************************************/
+public interface Scanner {
+    /** Return the next token, or <code>null</code> on end-of-file. */
+    public Symbol next_token() throws java.lang.Exception;
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/Symbol.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/Symbol.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/Symbol.java	(revision 25584)
@@ -0,0 +1,116 @@
+package java_cup.runtime;
+
+/**
+ * Defines the Symbol class, which is used to represent all terminals
+ * and nonterminals while parsing.  The lexer should pass CUP Symbols 
+ * and CUP returns a Symbol.
+ *
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+/* ****************************************************************
+  Class Symbol
+  what the parser expects to receive from the lexer. 
+  the token is identified as follows:
+  sym:    the symbol type
+  parse_state: the parse state.
+  value:  is the lexical value of type Object
+  left :  is the left position in the original input file
+  right:  is the right position in the original input file
+  xleft:  is the left position Object in the original input file
+  xright:  is the left position Object in the original input file
+******************************************************************/
+
+public class Symbol {
+
+//  TUM 20060327: Added new Constructor to provide more flexible way
+//   for location handling
+/*******************************
+ *******************************/
+    public Symbol(int id, Symbol left, Symbol right, Object o){
+        this(id,left.left,right.right,o);
+    }
+    public Symbol(int id, Symbol left, Symbol right){
+        this(id,left.left,right.right);
+    }
+/*******************************
+  Constructor for l,r values
+ *******************************/
+
+  public Symbol(int id, int l, int r, Object o) {
+    this(id);
+    left = l;
+    right = r;
+    value = o;
+  }
+
+/*******************************
+  Constructor for no l,r values
+********************************/
+
+  public Symbol(int id, Object o) {
+    this(id, -1, -1, o);
+  }
+
+/*****************************
+  Constructor for no value
+  ***************************/
+
+  public Symbol(int id, int l, int r) {
+    this(id, l, r, null);
+  }
+
+/***********************************
+  Constructor for no value or l,r
+***********************************/
+
+  public Symbol(int sym_num) {
+    this(sym_num, -1);
+    left = -1;
+    right = -1;
+  }
+
+/***********************************
+  Constructor to give a start state
+***********************************/
+  Symbol(int sym_num, int state)
+    {
+      sym = sym_num;
+      parse_state = state;
+    }
+
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The symbol number of the terminal or non terminal being represented */
+  public int sym;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The parse state to be recorded on the parse stack with this symbol.
+   *  This field is for the convenience of the parser and shouldn't be 
+   *  modified except by the parser. 
+   */
+  public int parse_state;
+  /** This allows us to catch some errors caused by scanners recycling
+   *  symbols.  For the use of the parser only. [CSA, 23-Jul-1999] */
+  boolean used_by_parser = false;
+
+/*******************************
+  The data passed to parser
+ *******************************/
+
+  public int left, right;
+  public Object value;
+
+  /*****************************
+    Printing this token out. (Override for pretty-print).
+    ****************************/
+  public String toString() { return "#"+sym; }
+}
+
+
+
+
+
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/SymbolFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/SymbolFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/SymbolFactory.java	(revision 25584)
@@ -0,0 +1,33 @@
+package java_cup.runtime;
+
+/**
+ * Creates the Symbols interface, which CUP uses as default
+ *
+ * @version last updated 27-03-2006
+ * @author Michael Petter
+ */
+
+/* *************************************************
+  Interface SymbolFactory
+  
+  interface for creating new symbols  
+  You can also use this interface for your own callback hooks
+  Declare Your own factory methods for creation of Objects in Your scanner!
+ ***************************************************/
+public interface SymbolFactory {
+    // Factory methods
+    /**
+     * Construction with left/right propagation switched on
+     */
+    public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value);
+    public Symbol newSymbol(String name, int id, Symbol left, Symbol right);
+    /**
+     * Construction with left/right propagation switched off
+     */
+    public Symbol newSymbol(String name, int id, Object value);
+    public Symbol newSymbol(String name, int id);
+    /**
+     * Construction of start symbol
+     */
+    public Symbol startSymbol(String name, int id, int state);
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/lr_parser.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/lr_parser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/lr_parser.java	(revision 25584)
@@ -0,0 +1,1253 @@
+				    
+package java_cup.runtime;
+
+import java.util.Stack;
+
+/** This class implements a skeleton table driven LR parser.  In general,
+ *  LR parsers are a form of bottom up shift-reduce parsers.  Shift-reduce
+ *  parsers act by shifting input onto a parse stack until the Symbols 
+ *  matching the right hand side of a production appear on the top of the 
+ *  stack.  Once this occurs, a reduce is performed.  This involves removing
+ *  the Symbols corresponding to the right hand side of the production
+ *  (the so called "handle") and replacing them with the non-terminal from
+ *  the left hand side of the production.  <p>
+ *
+ *  To control the decision of whether to shift or reduce at any given point, 
+ *  the parser uses a state machine (the "viable prefix recognition machine" 
+ *  built by the parser generator).  The current state of the machine is placed
+ *  on top of the parse stack (stored as part of a Symbol object representing
+ *  a terminal or non terminal).  The parse action table is consulted 
+ *  (using the current state and the current lookahead Symbol as indexes) to 
+ *  determine whether to shift or to reduce.  When the parser shifts, it 
+ *  changes to a new state by pushing a new Symbol (containing a new state) 
+ *  onto the stack.  When the parser reduces, it pops the handle (right hand 
+ *  side of a production) off the stack.  This leaves the parser in the state 
+ *  it was in before any of those Symbols were matched.  Next the reduce-goto 
+ *  table is consulted (using the new state and current lookahead Symbol as 
+ *  indexes) to determine a new state to go to.  The parser then shifts to 
+ *  this goto state by pushing the left hand side Symbol of the production 
+ *  (also containing the new state) onto the stack.<p>
+ *
+ *  This class actually provides four LR parsers.  The methods parse() and 
+ *  debug_parse() provide two versions of the main parser (the only difference 
+ *  being that debug_parse() emits debugging trace messages as it parses).  
+ *  In addition to these main parsers, the error recovery mechanism uses two 
+ *  more.  One of these is used to simulate "parsing ahead" in the input 
+ *  without carrying out actions (to verify that a potential error recovery 
+ *  has worked), and the other is used to parse through buffered "parse ahead" 
+ *  input in order to execute all actions and re-synchronize the actual parser 
+ *  configuration.<p>
+ *
+ *  This is an abstract class which is normally filled out by a subclass
+ *  generated by the JavaCup parser generator.  In addition to supplying
+ *  the actual parse tables, generated code also supplies methods which 
+ *  invoke various pieces of user supplied code, provide access to certain
+ *  special Symbols (e.g., EOF and error), etc.  Specifically, the following
+ *  abstract methods are normally supplied by generated code:
+ *  <dl compact>
+ *  <dt> short[][] production_table()
+ *  <dd> Provides a reference to the production table (indicating the index of
+ *       the left hand side non terminal and the length of the right hand side
+ *       for each production in the grammar).
+ *  <dt> short[][] action_table()
+ *  <dd> Provides a reference to the parse action table.
+ *  <dt> short[][] reduce_table()
+ *  <dd> Provides a reference to the reduce-goto table.
+ *  <dt> int start_state()      
+ *  <dd> Indicates the index of the start state.
+ *  <dt> int start_production() 
+ *  <dd> Indicates the index of the starting production.
+ *  <dt> int EOF_sym() 
+ *  <dd> Indicates the index of the EOF Symbol.
+ *  <dt> int error_sym() 
+ *  <dd> Indicates the index of the error Symbol.
+ *  <dt> Symbol do_action() 
+ *  <dd> Executes a piece of user supplied action code.  This always comes at 
+ *       the point of a reduce in the parse, so this code also allocates and 
+ *       fills in the left hand side non terminal Symbol object that is to be 
+ *       pushed onto the stack for the reduce.
+ *  <dt> void init_actions()
+ *  <dd> Code to initialize a special object that encapsulates user supplied
+ *       actions (this object is used by do_action() to actually carry out the 
+ *       actions).
+ *  </dl>
+ *  
+ *  In addition to these routines that <i>must</i> be supplied by the 
+ *  generated subclass there are also a series of routines that <i>may</i> 
+ *  be supplied.  These include:
+ *  <dl>
+ *  <dt> Symbol scan()
+ *  <dd> Used to get the next input Symbol from the scanner.
+ *  <dt> Scanner getScanner()
+ *  <dd> Used to provide a scanner for the default implementation of
+ *       scan().
+ *  <dt> int error_sync_size()
+ *  <dd> This determines how many Symbols past the point of an error 
+ *       must be parsed without error in order to consider a recovery to 
+ *       be valid.  This defaults to 3.  Values less than 2 are not 
+ *       recommended.
+ *  <dt> void report_error(String message, Object info)
+ *  <dd> This method is called to report an error.  The default implementation
+ *       simply prints a message to System.err and where the error occurred.
+ *       This method is often replaced in order to provide a more sophisticated
+ *       error reporting mechanism.
+ *  <dt> void report_fatal_error(String message, Object info)
+ *  <dd> This method is called when a fatal error that cannot be recovered from
+ *       is encountered.  In the default implementation, it calls 
+ *       report_error() to emit a message, then throws an exception.
+ *  <dt> void syntax_error(Symbol cur_token)
+ *  <dd> This method is called as soon as syntax error is detected (but
+ *       before recovery is attempted).  In the default implementation it 
+ *       invokes: report_error("Syntax error", null);
+ *  <dt> void unrecovered_syntax_error(Symbol cur_token)
+ *  <dd> This method is called if syntax error recovery fails.  In the default
+ *       implementation it invokes:<br> 
+ *         report_fatal_error("Couldn't repair and continue parse", null);
+ *  </dl>
+ *
+ * @see     java_cup.runtime.Symbol
+ * @see     java_cup.runtime.Symbol
+ * @see     java_cup.runtime.virtual_parse_stack
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+public abstract class lr_parser {
+    /*-----------------------------------------------------------*/
+    /*--- Constructor(s) ----------------------------------------*/
+    /*-----------------------------------------------------------*/
+
+    /** 
+     * Simple constructor. 
+     */
+    public lr_parser() {
+    }
+    
+    /** 
+     * Constructor that sets the default scanner. [CSA/davidm] 
+     */
+    public lr_parser(Scanner s) {
+        this(s,new DefaultSymbolFactory()); // TUM 20060327 old cup v10 Symbols as default
+    }
+    /** 
+     * Constructor that sets the default scanner and a SymbolFactory
+     */
+    public lr_parser(Scanner s, SymbolFactory symfac) {
+        this(); // in case default constructor someday does something
+        symbolFactory = symfac;
+        setScanner(s);
+    }
+    public SymbolFactory symbolFactory;// = new DefaultSymbolFactory();
+    /**
+     * Whenever creation of a new Symbol is necessary, one should use this factory.
+     */
+    public SymbolFactory getSymbolFactory(){
+        return symbolFactory;
+    }
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Static (Class) Variables ------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** The default number of Symbols after an error we much match to consider 
+   *  it recovered from. 
+   */
+  protected final static int _error_sync_size = 3;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The number of Symbols after an error we much match to consider it 
+   *  recovered from. 
+   */
+  protected int error_sync_size() {return _error_sync_size; }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Table of production information (supplied by generated subclass).
+   *  This table contains one entry per production and is indexed by 
+   *  the negative-encoded values (reduce actions) in the action_table.  
+   *  Each entry has two parts, the index of the non-terminal on the 
+   *  left hand side of the production, and the number of Symbols 
+   *  on the right hand side. 
+   */
+  public abstract short[][] production_table();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The action table (supplied by generated subclass).  This table is
+   *  indexed by state and terminal number indicating what action is to
+   *  be taken when the parser is in the given state (i.e., the given state 
+   *  is on top of the stack) and the given terminal is next on the input.  
+   *  States are indexed using the first dimension, however, the entries for 
+   *  a given state are compacted and stored in adjacent index, value pairs 
+   *  which are searched for rather than accessed directly (see get_action()).  
+   *  The actions stored in the table will be either shifts, reduces, or 
+   *  errors.  Shifts are encoded as positive values (one greater than the 
+   *  state shifted to).  Reduces are encoded as negative values (one less 
+   *  than the production reduced by).  Error entries are denoted by zero. 
+   * 
+   * @see java_cup.runtime.lr_parser#get_action
+   */
+  public abstract short[][] action_table();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The reduce-goto table (supplied by generated subclass).  This
+   *  table is indexed by state and non-terminal number and contains
+   *  state numbers.  States are indexed using the first dimension, however,
+   *  the entries for a given state are compacted and stored in adjacent
+   *  index, value pairs which are searched for rather than accessed 
+   *  directly (see get_reduce()).  When a reduce occurs, the handle 
+   *  (corresponding to the RHS of the matched production) is popped off 
+   *  the stack.  The new top of stack indicates a state.  This table is 
+   *  then indexed by that state and the LHS of the reducing production to 
+   *  indicate where to "shift" to. 
+   *
+   * @see java_cup.runtime.lr_parser#get_reduce
+   */
+  public abstract short[][] reduce_table();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the start state (supplied by generated subclass). */
+  public abstract int start_state();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the start production (supplied by generated subclass). */
+  public abstract int start_production();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the end of file terminal Symbol (supplied by generated 
+   *  subclass). 
+   */
+  public abstract int EOF_sym();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The index of the special error Symbol (supplied by generated subclass). */
+  public abstract int error_sym();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Internal flag to indicate when parser should quit. */
+  protected boolean _done_parsing = false;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method is called to indicate that the parser should quit.  This is 
+   *  normally called by an accept action, but can be used to cancel parsing 
+   *  early in other circumstances if desired. 
+   */
+  public void done_parsing()
+    {
+      _done_parsing = true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+  /* Global parse state shared by parse(), error recovery, and 
+   * debugging routines */
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Indication of the index for top of stack (for use by actions). */
+  protected int tos;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The current lookahead Symbol. */
+  protected Symbol cur_token;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The parse stack itself. */
+  protected Stack stack = new Stack();
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Direct reference to the production table. */ 
+  protected short[][] production_tab;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Direct reference to the action table. */
+  protected short[][] action_tab;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Direct reference to the reduce-goto table. */
+  protected short[][] reduce_tab;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This is the scanner object used by the default implementation
+   *  of scan() to get Symbols.  To avoid name conflicts with existing
+   *  code, this field is private. [CSA/davidm] */
+  private Scanner _scanner;
+
+  /**
+   * Simple accessor method to set the default scanner.
+   */
+  public void setScanner(Scanner s) { _scanner = s; }
+
+  /**
+   * Simple accessor method to get the default scanner.
+   */
+  public Scanner getScanner() { return _scanner; }
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Perform a bit of user supplied action code (supplied by generated 
+   *  subclass).  Actions are indexed by an internal action number assigned
+   *  at parser generation time.
+   *
+   * @param act_num   the internal index of the action to be performed.
+   * @param parser    the parser object we are acting for.
+   * @param stack     the parse stack of that object.
+   * @param top       the index of the top element of the parse stack.
+   */
+  public abstract Symbol do_action(
+    int       act_num, 
+    lr_parser parser, 
+    Stack     stack, 
+    int       top) 
+    throws java.lang.Exception;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** User code for initialization inside the parser.  Typically this 
+   *  initializes the scanner.  This is called before the parser requests
+   *  the first Symbol.  Here this is just a placeholder for subclasses that 
+   *  might need this and we perform no action.   This method is normally
+   *  overridden by the generated code using this contents of the "init with"
+   *  clause as its body.
+   */
+  public void user_init() throws java.lang.Exception { }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Initialize the action object.  This is called before the parser does
+   *  any parse actions. This is filled in by generated code to create
+   *  an object that encapsulates all action code. 
+   */ 
+  protected abstract void init_actions() throws java.lang.Exception;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Get the next Symbol from the input (supplied by generated subclass).
+   *  Once end of file has been reached, all subsequent calls to scan 
+   *  should return an EOF Symbol (which is Symbol number 0).  By default
+   *  this method returns getScanner().next_token(); this implementation
+   *  can be overriden by the generated parser using the code declared in
+   *  the "scan with" clause.  Do not recycle objects; every call to
+   *  scan() should return a fresh object.
+   */
+  public Symbol scan() throws java.lang.Exception {
+    Symbol sym = getScanner().next_token();
+    return (sym!=null) ? sym : getSymbolFactory().newSymbol("END_OF_FILE",EOF_sym());
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Report a fatal error.  This method takes a  message string and an 
+   *  additional object (to be used by specializations implemented in 
+   *  subclasses).  Here in the base class a very simple implementation 
+   *  is provided which reports the error then throws an exception. 
+   *
+   * @param message an error message.
+   * @param info    an extra object reserved for use by specialized subclasses.
+   */
+  public void report_fatal_error(
+    String   message, 
+    Object   info)
+    throws java.lang.Exception
+    {
+      /* stop parsing (not really necessary since we throw an exception, but) */
+      done_parsing();
+
+      /* use the normal error message reporting to put out the message */
+      report_error(message, info);
+
+      /* throw an exception */
+      throw new Exception("Can't recover from previous error(s)");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Report a non fatal error (or warning).  This method takes a message 
+   *  string and an additional object (to be used by specializations 
+   *  implemented in subclasses).  Here in the base class a very simple 
+   *  implementation is provided which simply prints the message to 
+   *  System.err. 
+   *
+   * @param message an error message.
+   * @param info    an extra object reserved for use by specialized subclasses.
+   */
+  public void report_error(String message, Object info)
+    {
+      System.err.print(message);
+      System.err.flush();
+      if (info instanceof Symbol)
+	if (((Symbol)info).left != -1)
+	System.err.println(" at character " + ((Symbol)info).left + 
+			   " of input");
+	else System.err.println("");
+      else System.err.println("");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method is called when a syntax error has been detected and recovery 
+   *  is about to be invoked.  Here in the base class we just emit a 
+   *  "Syntax error" error message.  
+   *
+   * @param cur_token the current lookahead Symbol.
+   */
+  public void syntax_error(Symbol cur_token)
+    {
+      report_error("Syntax error", cur_token);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method is called if it is determined that syntax error recovery 
+   *  has been unsuccessful.  Here in the base class we report a fatal error. 
+   *
+   * @param cur_token the current lookahead Symbol.
+   */
+  public void unrecovered_syntax_error(Symbol cur_token)
+    throws java.lang.Exception
+    {
+      report_fatal_error("Couldn't repair and continue parse", cur_token);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Fetch an action from the action table.  The table is broken up into
+   *  rows, one per state (rows are indexed directly by state number).  
+   *  Within each row, a list of index, value pairs are given (as sequential
+   *  entries in the table), and the list is terminated by a default entry 
+   *  (denoted with a Symbol index of -1).  To find the proper entry in a row 
+   *  we do a linear or binary search (depending on the size of the row).  
+   *
+   * @param state the state index of the action being accessed.
+   * @param sym   the Symbol index of the action being accessed.
+   */
+  protected final short get_action(int state, int sym)
+    {
+      short tag;
+      int first, last, probe;
+      short[] row = action_tab[state];
+
+      /* linear search if we are < 10 entries */
+      if (row.length < 20)
+        for (probe = 0; probe < row.length; probe++)
+	  {
+	    /* is this entry labeled with our Symbol or the default? */
+	    tag = row[probe++];
+	    if (tag == sym || tag == -1)
+	      {
+	        /* return the next entry */
+	        return row[probe];
+	      }
+	  }
+      /* otherwise binary search */
+      else
+	{
+	  first = 0; 
+	  last = (row.length-1)/2 - 1;  /* leave out trailing default entry */
+	  while (first <= last)
+	    {
+	      probe = (first+last)/2;
+	      if (sym == row[probe*2])
+		return row[probe*2+1];
+	      else if (sym > row[probe*2])
+		first = probe+1;
+	      else
+	        last = probe-1;
+	    }
+
+	  /* not found, use the default at the end */
+	  return row[row.length-1];
+	}
+
+      /* shouldn't happened, but if we run off the end we return the 
+	 default (error == 0) */
+      return 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Fetch a state from the reduce-goto table.  The table is broken up into
+   *  rows, one per state (rows are indexed directly by state number).  
+   *  Within each row, a list of index, value pairs are given (as sequential
+   *  entries in the table), and the list is terminated by a default entry 
+   *  (denoted with a Symbol index of -1).  To find the proper entry in a row 
+   *  we do a linear search.  
+   *
+   * @param state the state index of the entry being accessed.
+   * @param sym   the Symbol index of the entry being accessed.
+   */
+  protected final short get_reduce(int state, int sym)
+    {
+      short tag;
+      short[] row = reduce_tab[state];
+
+      /* if we have a null row we go with the default */
+      if (row == null)
+        return -1;
+
+      for (int probe = 0; probe < row.length; probe++)
+	{
+	  /* is this entry labeled with our Symbol or the default? */
+	  tag = row[probe++];
+	  if (tag == sym || tag == -1)
+	    {
+	      /* return the next entry */
+	      return row[probe];
+	    }
+	}
+      /* if we run off the end we return the default (error == -1) */
+      return -1;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** This method provides the main parsing routine.  It returns only when 
+   *  done_parsing() has been called (typically because the parser has 
+   *  accepted, or a fatal error has been reported).  See the header 
+   *  documentation for the class regarding how shift/reduce parsers operate
+   *  and how the various tables are used.
+   */
+  public Symbol parse() throws java.lang.Exception
+    {
+      /* the current action code */
+      int act;
+
+      /* the Symbol/stack element returned by a reduce */
+      Symbol lhs_sym = null;
+
+      /* information about production being reduced with */
+      short handle_size, lhs_sym_num;
+
+      /* set up direct reference to tables to drive the parser */
+
+      production_tab = production_table();
+      action_tab     = action_table();
+      reduce_tab     = reduce_table();
+
+      /* initialize the action encapsulation object */
+      init_actions();
+
+      /* do user initialization */
+      user_init();
+
+      /* get the first token */
+      cur_token = scan(); 
+
+      /* push dummy Symbol with start state to get us underway */
+      stack.removeAllElements();
+      stack.push(getSymbolFactory().startSymbol("START", 0, start_state()));
+      tos = 0;
+
+      /* continue until we are told to stop */
+      for (_done_parsing = false; !_done_parsing; )
+	{
+	  /* Check current token for freshness. */
+	  if (cur_token.used_by_parser)
+	    throw new Error("Symbol recycling detected (fix your scanner).");
+
+	  /* current state is always on the top of the stack */
+
+	  /* look up action out of the current state with the current input */
+	  act = get_action(((Symbol)stack.peek()).parse_state, cur_token.sym);
+
+	  /* decode the action -- > 0 encodes shift */
+	  if (act > 0)
+	    {
+	      /* shift to the encoded state by pushing it on the stack */
+	      cur_token.parse_state = act-1;
+	      cur_token.used_by_parser = true;
+	      stack.push(cur_token);
+	      tos++;
+
+	      /* advance to the next Symbol */
+	      cur_token = scan();
+	    }
+	  /* if its less than zero, then it encodes a reduce action */
+	  else if (act < 0)
+	    {
+	      /* perform the action for the reduce */
+	      lhs_sym = do_action((-act)-1, this, stack, tos);
+
+	      /* look up information about the production */
+	      lhs_sym_num = production_tab[(-act)-1][0];
+	      handle_size = production_tab[(-act)-1][1];
+
+	      /* pop the handle off the stack */
+	      for (int i = 0; i < handle_size; i++)
+		{
+		  stack.pop();
+		  tos--;
+		}
+	      
+	      /* look up the state to go to from the one popped back to */
+	      act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num);
+
+	      /* shift to that state */
+	      lhs_sym.parse_state = act;
+	      lhs_sym.used_by_parser = true;
+	      stack.push(lhs_sym);
+	      tos++;
+	    }
+	  /* finally if the entry is zero, we have an error */
+	  else if (act == 0)
+	    {
+	      /* call user syntax error reporting routine */
+	      syntax_error(cur_token);
+
+	      /* try to error recover */
+	      if (!error_recovery(false))
+		{
+		  /* if that fails give up with a fatal syntax error */
+		  unrecovered_syntax_error(cur_token);
+
+		  /* just in case that wasn't fatal enough, end parse */
+		  done_parsing();
+		} else {
+		  lhs_sym = (Symbol)stack.peek();
+		}
+	    }
+	}
+      return lhs_sym;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Write a debugging message to System.err for the debugging version 
+   *  of the parser. 
+   *
+   * @param mess the text of the debugging message.
+   */
+  public void debug_message(String mess)
+    {
+      System.err.println(mess);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Dump the parse stack for debugging purposes. */
+  public void dump_stack()
+    {
+      if (stack == null)
+	{
+	  debug_message("# Stack dump requested, but stack is null");
+	  return;
+	}
+
+      debug_message("============ Parse Stack Dump ============");
+
+      /* dump the stack */
+      for (int i=0; i<stack.size(); i++)
+	{
+	  debug_message("Symbol: " + ((Symbol)stack.elementAt(i)).sym +
+			" State: " + ((Symbol)stack.elementAt(i)).parse_state);
+	}
+      debug_message("==========================================");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do debug output for a reduce. 
+   *
+   * @param prod_num  the production we are reducing with.
+   * @param nt_num    the index of the LHS non terminal.
+   * @param rhs_size  the size of the RHS.
+   */
+  public void debug_reduce(int prod_num, int nt_num, int rhs_size)
+    {
+      debug_message("# Reduce with prod #" + prod_num + " [NT=" + nt_num + 
+	            ", " + "SZ=" + rhs_size + "]");
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do debug output for shift. 
+   *
+   * @param shift_tkn the Symbol being shifted onto the stack.
+   */
+  public void debug_shift(Symbol shift_tkn)
+    {
+      debug_message("# Shift under term #" + shift_tkn.sym + 
+		    " to state #" + shift_tkn.parse_state);
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do debug output for stack state. [CSA]
+   */
+  public void debug_stack() {
+      StringBuffer sb=new StringBuffer("## STACK:");
+      for (int i=0; i<stack.size(); i++) {
+	  Symbol s = (Symbol) stack.elementAt(i);
+	  sb.append(" <state "+s.parse_state+", sym "+s.sym+">");
+	  if ((i%3)==2 || (i==(stack.size()-1))) {
+	      debug_message(sb.toString());
+	      sb = new StringBuffer("         ");
+	  }
+      }
+  }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Perform a parse with debugging output.  This does exactly the
+   *  same things as parse(), except that it calls debug_shift() and
+   *  debug_reduce() when shift and reduce moves are taken by the parser
+   *  and produces various other debugging messages.  
+   */
+  public Symbol debug_parse()
+    throws java.lang.Exception
+    {
+      /* the current action code */
+      int act;
+
+      /* the Symbol/stack element returned by a reduce */
+      Symbol lhs_sym = null;
+
+      /* information about production being reduced with */
+      short handle_size, lhs_sym_num;
+
+      /* set up direct reference to tables to drive the parser */
+      production_tab = production_table();
+      action_tab     = action_table();
+      reduce_tab     = reduce_table();
+
+      debug_message("# Initializing parser");
+
+      /* initialize the action encapsulation object */
+      init_actions();
+
+      /* do user initialization */
+      user_init();
+
+      /* the current Symbol */
+      cur_token = scan(); 
+
+      debug_message("# Current Symbol is #" + cur_token.sym);
+
+      /* push dummy Symbol with start state to get us underway */
+      stack.removeAllElements();
+      stack.push(getSymbolFactory().startSymbol("START",0, start_state()));
+      tos = 0;
+
+      /* continue until we are told to stop */
+      for (_done_parsing = false; !_done_parsing; )
+	{
+	  /* Check current token for freshness. */
+	  if (cur_token.used_by_parser)
+	    throw new Error("Symbol recycling detected (fix your scanner).");
+
+	  /* current state is always on the top of the stack */
+	  //debug_stack();
+
+	  /* look up action out of the current state with the current input */
+	  act = get_action(((Symbol)stack.peek()).parse_state, cur_token.sym);
+
+	  /* decode the action -- > 0 encodes shift */
+	  if (act > 0)
+	    {
+	      /* shift to the encoded state by pushing it on the stack */
+	      cur_token.parse_state = act-1;
+	      cur_token.used_by_parser = true;
+	      debug_shift(cur_token);
+	      stack.push(cur_token);
+	      tos++;
+
+	      /* advance to the next Symbol */
+	      cur_token = scan();
+              debug_message("# Current token is " + cur_token);
+	    }
+	  /* if its less than zero, then it encodes a reduce action */
+	  else if (act < 0)
+	    {
+	      /* perform the action for the reduce */
+	      lhs_sym = do_action((-act)-1, this, stack, tos);
+
+	      /* look up information about the production */
+	      lhs_sym_num = production_tab[(-act)-1][0];
+	      handle_size = production_tab[(-act)-1][1];
+
+	      debug_reduce((-act)-1, lhs_sym_num, handle_size);
+
+	      /* pop the handle off the stack */
+	      for (int i = 0; i < handle_size; i++)
+		{
+		  stack.pop();
+		  tos--;
+		}
+	      
+	      /* look up the state to go to from the one popped back to */
+	      act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num);
+	      debug_message("# Reduce rule: top state " +
+			     ((Symbol)stack.peek()).parse_state +
+			     ", lhs sym " + lhs_sym_num + " -> state " + act); 
+
+	      /* shift to that state */
+	      lhs_sym.parse_state = act;
+	      lhs_sym.used_by_parser = true;
+	      stack.push(lhs_sym);
+	      tos++;
+
+	      debug_message("# Goto state #" + act);
+	    }
+	  /* finally if the entry is zero, we have an error */
+	  else if (act == 0)
+	    {
+	      /* call user syntax error reporting routine */
+	      syntax_error(cur_token);
+
+	      /* try to error recover */
+	      if (!error_recovery(true))
+		{
+		  /* if that fails give up with a fatal syntax error */
+		  unrecovered_syntax_error(cur_token);
+
+		  /* just in case that wasn't fatal enough, end parse */
+		  done_parsing();
+		} else {
+		  lhs_sym = (Symbol)stack.peek();
+		}
+	    }
+	}
+      return lhs_sym;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+  /* Error recovery code */
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Attempt to recover from a syntax error.  This returns false if recovery 
+   *  fails, true if it succeeds.  Recovery happens in 4 steps.  First we
+   *  pop the parse stack down to a point at which we have a shift out
+   *  of the top-most state on the error Symbol.  This represents the
+   *  initial error recovery configuration.  If no such configuration is
+   *  found, then we fail.  Next a small number of "lookahead" or "parse
+   *  ahead" Symbols are read into a buffer.  The size of this buffer is 
+   *  determined by error_sync_size() and determines how many Symbols beyond
+   *  the error must be matched to consider the recovery a success.  Next, 
+   *  we begin to discard Symbols in attempt to get past the point of error
+   *  to a point where we can continue parsing.  After each Symbol, we attempt 
+   *  to "parse ahead" though the buffered lookahead Symbols.  The "parse ahead"
+   *  process simulates that actual parse, but does not modify the real 
+   *  parser's configuration, nor execute any actions. If we can  parse all 
+   *  the stored Symbols without error, then the recovery is considered a 
+   *  success.  Once a successful recovery point is determined, we do an
+   *  actual parse over the stored input -- modifying the real parse 
+   *  configuration and executing all actions.  Finally, we return the the 
+   *  normal parser to continue with the overall parse.
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected boolean error_recovery(boolean debug)
+    throws java.lang.Exception
+    {
+      if (debug) debug_message("# Attempting error recovery");
+
+      /* first pop the stack back into a state that can shift on error and 
+	 do that shift (if that fails, we fail) */
+      if (!find_recovery_config(debug))
+	{
+	  if (debug) debug_message("# Error recovery fails");
+	  return false;
+	}
+
+      /* read ahead to create lookahead we can parse multiple times */
+      read_lookahead();
+
+      /* repeatedly try to parse forward until we make it the required dist */
+      for (;;)
+	{
+	  /* try to parse forward, if it makes it, bail out of loop */
+	  if (debug) debug_message("# Trying to parse ahead");
+	  if (try_parse_ahead(debug))
+	    {
+	      break;
+	    }
+
+	  /* if we are now at EOF, we have failed */
+	  if (lookahead[0].sym == EOF_sym()) 
+	    {
+	      if (debug) debug_message("# Error recovery fails at EOF");
+	      return false;
+	    }
+
+	  /* otherwise, we consume another Symbol and try again */
+	  // BUG FIX by Bruce Hutton
+	  // Computer Science Department, University of Auckland,
+	  // Auckland, New Zealand.
+	  // It is the first token that is being consumed, not the one 
+	  // we were up to parsing
+	  if (debug) 
+	      debug_message("# Consuming Symbol #" + lookahead[ 0 ].sym);
+	  restart_lookahead();
+	}
+
+      /* we have consumed to a point where we can parse forward */
+      if (debug) debug_message("# Parse-ahead ok, going back to normal parse");
+
+      /* do the real parse (including actions) across the lookahead */
+      parse_lookahead(debug);
+
+      /* we have success */
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Determine if we can shift under the special error Symbol out of the 
+   *  state currently on the top of the (real) parse stack. 
+   */
+  protected boolean shift_under_error()
+    {
+      /* is there a shift under error Symbol */
+      return get_action(((Symbol)stack.peek()).parse_state, error_sym()) > 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Put the (real) parse stack into error recovery configuration by 
+   *  popping the stack down to a state that can shift on the special 
+   *  error Symbol, then doing the shift.  If no suitable state exists on 
+   *  the stack we return false 
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected boolean find_recovery_config(boolean debug)
+    {
+      Symbol error_token;
+      int act;
+
+      if (debug) debug_message("# Finding recovery state on stack");
+
+      /* Remember the right-position of the top symbol on the stack */
+      Symbol right = ((Symbol)stack.peek());// TUM 20060327 removed .right	
+      Symbol left  = right;// TUM 20060327 removed .left	
+
+      /* pop down until we can shift under error Symbol */
+      while (!shift_under_error())
+	{
+	  /* pop the stack */
+	  if (debug) 
+	    debug_message("# Pop stack by one, state was # " +
+	                  ((Symbol)stack.peek()).parse_state);
+          left = ((Symbol)stack.pop()); // TUM 20060327 removed .left	
+	  tos--;
+
+	  /* if we have hit bottom, we fail */
+	  if (stack.empty()) 
+	    {
+	      if (debug) debug_message("# No recovery state found on stack");
+	      return false;
+	    }
+	}
+
+      /* state on top of the stack can shift under error, find the shift */
+      act = get_action(((Symbol)stack.peek()).parse_state, error_sym());
+      if (debug) 
+	{
+	  debug_message("# Recover state found (#" + 
+			((Symbol)stack.peek()).parse_state + ")");
+	  debug_message("# Shifting on error to state #" + (act-1));
+	}
+
+      /* build and shift a special error Symbol */
+      error_token = getSymbolFactory().newSymbol("ERROR",error_sym(), left, right);
+      error_token.parse_state = act-1;
+      error_token.used_by_parser = true;
+      stack.push(error_token);
+      tos++;
+
+      return true;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Lookahead Symbols used for attempting error recovery "parse aheads". */
+  protected Symbol lookahead[];
+
+  /** Position in lookahead input buffer used for "parse ahead". */
+  protected int lookahead_pos;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Read from input to establish our buffer of "parse ahead" lookahead 
+   *  Symbols. 
+   */
+  protected void read_lookahead() throws java.lang.Exception
+    {
+      /* create the lookahead array */
+      lookahead = new Symbol[error_sync_size()];
+
+      /* fill in the array */
+      for (int i = 0; i < error_sync_size(); i++)
+	{
+	  lookahead[i] = cur_token;
+	  cur_token = scan();
+	}
+
+      /* start at the beginning */
+      lookahead_pos = 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Return the current lookahead in our error "parse ahead" buffer. */
+  protected Symbol cur_err_token() { return lookahead[lookahead_pos]; }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Advance to next "parse ahead" input Symbol. Return true if we have 
+   *  input to advance to, false otherwise. 
+   */
+  protected boolean advance_lookahead()
+    {
+      /* advance the input location */
+      lookahead_pos++;
+
+      /* return true if we didn't go off the end */
+      return lookahead_pos < error_sync_size();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Reset the parse ahead input to one Symbol past where we started error 
+   *  recovery (this consumes one new Symbol from the real input). 
+   */
+  protected void restart_lookahead() throws java.lang.Exception
+    {
+      /* move all the existing input over */
+      for (int i = 1; i < error_sync_size(); i++)
+	lookahead[i-1] = lookahead[i];
+
+      /* read a new Symbol into the last spot */
+      // BUG Fix by Bruce Hutton
+      // Computer Science Department, University of Auckland,
+      // Auckland, New Zealand. [applied 5-sep-1999 by csa]
+      // The following two lines were out of order!!
+      lookahead[error_sync_size()-1] = cur_token;
+      cur_token = scan();
+
+      /* reset our internal position marker */
+      lookahead_pos = 0;
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Do a simulated parse forward (a "parse ahead") from the current 
+   *  stack configuration using stored lookahead input and a virtual parse
+   *  stack.  Return true if we make it all the way through the stored 
+   *  lookahead input without error. This basically simulates the action of 
+   *  parse() using only our saved "parse ahead" input, and not executing any 
+   *  actions.
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected boolean try_parse_ahead(boolean debug)
+    throws java.lang.Exception
+    {
+      int act;
+      short lhs, rhs_size;
+
+      /* create a virtual stack from the real parse stack */
+      virtual_parse_stack vstack = new virtual_parse_stack(stack);
+
+      /* parse until we fail or get past the lookahead input */
+      for (;;)
+	{
+	  /* look up the action from the current state (on top of stack) */
+	  act = get_action(vstack.top(), cur_err_token().sym);
+
+	  /* if its an error, we fail */
+	  if (act == 0) return false;
+
+	  /* > 0 encodes a shift */
+	  if (act > 0)
+	    {
+	      /* push the new state on the stack */
+	      vstack.push(act-1);
+
+	      if (debug) debug_message("# Parse-ahead shifts Symbol #" + 
+		       cur_err_token().sym + " into state #" + (act-1));
+
+	      /* advance simulated input, if we run off the end, we are done */
+	      if (!advance_lookahead()) return true;
+	    }
+	  /* < 0 encodes a reduce */
+	  else
+	    {
+	      /* if this is a reduce with the start production we are done */
+	      if ((-act)-1 == start_production()) 
+		{
+		  if (debug) debug_message("# Parse-ahead accepts");
+		  return true;
+		}
+
+	      /* get the lhs Symbol and the rhs size */
+	      lhs = production_tab[(-act)-1][0];
+	      rhs_size = production_tab[(-act)-1][1];
+
+	      /* pop handle off the stack */
+	      for (int i = 0; i < rhs_size; i++)
+		vstack.pop();
+
+	      if (debug) 
+		debug_message("# Parse-ahead reduces: handle size = " + 
+	          rhs_size + " lhs = #" + lhs + " from state #" + vstack.top());
+
+	      /* look up goto and push it onto the stack */
+	      vstack.push(get_reduce(vstack.top(), lhs));
+	      if (debug) 
+		debug_message("# Goto state #" + vstack.top());
+	    }
+	}
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Parse forward using stored lookahead Symbols.  In this case we have
+   *  already verified that parsing will make it through the stored lookahead
+   *  Symbols and we are now getting back to the point at which we can hand
+   *  control back to the normal parser.  Consequently, this version of the
+   *  parser performs all actions and modifies the real parse configuration.  
+   *  This returns once we have consumed all the stored input or we accept.
+   *
+   * @param debug should we produce debugging messages as we parse.
+   */
+  protected void parse_lookahead(boolean debug)
+    throws java.lang.Exception
+    {
+      /* the current action code */
+      int act;
+
+      /* the Symbol/stack element returned by a reduce */
+      Symbol lhs_sym = null;
+
+      /* information about production being reduced with */
+      short handle_size, lhs_sym_num;
+
+      /* restart the saved input at the beginning */
+      lookahead_pos = 0;
+
+      if (debug) 
+	{
+	  debug_message("# Reparsing saved input with actions");
+	  debug_message("# Current Symbol is #" + cur_err_token().sym);
+	  debug_message("# Current state is #" + 
+			((Symbol)stack.peek()).parse_state);
+	}
+
+      /* continue until we accept or have read all lookahead input */
+      while(!_done_parsing)
+	{
+	  /* current state is always on the top of the stack */
+
+	  /* look up action out of the current state with the current input */
+	  act = 
+	    get_action(((Symbol)stack.peek()).parse_state, cur_err_token().sym);
+
+	  /* decode the action -- > 0 encodes shift */
+	  if (act > 0)
+	    {
+	      /* shift to the encoded state by pushing it on the stack */
+	      cur_err_token().parse_state = act-1;
+	      cur_err_token().used_by_parser = true;
+	      if (debug) debug_shift(cur_err_token());
+	      stack.push(cur_err_token());
+	      tos++;
+
+	      /* advance to the next Symbol, if there is none, we are done */
+	      if (!advance_lookahead()) 
+		{
+		  if (debug) debug_message("# Completed reparse");
+
+		  /* scan next Symbol so we can continue parse */
+		  // BUGFIX by Chris Harris <ckharris@ucsd.edu>:
+		  //   correct a one-off error by commenting out
+		  //   this next line.
+		  /*cur_token = scan();*/
+
+		  /* go back to normal parser */
+		  return;
+		}
+	      
+	      if (debug) 
+		debug_message("# Current Symbol is #" + cur_err_token().sym);
+	    }
+	  /* if its less than zero, then it encodes a reduce action */
+	  else if (act < 0)
+	    {
+	      /* perform the action for the reduce */
+	      lhs_sym = do_action((-act)-1, this, stack, tos);
+
+	      /* look up information about the production */
+	      lhs_sym_num = production_tab[(-act)-1][0];
+	      handle_size = production_tab[(-act)-1][1];
+
+	      if (debug) debug_reduce((-act)-1, lhs_sym_num, handle_size);
+
+	      /* pop the handle off the stack */
+	      for (int i = 0; i < handle_size; i++)
+		{
+		  stack.pop();
+		  tos--;
+		}
+	      
+	      /* look up the state to go to from the one popped back to */
+	      act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num);
+
+	      /* shift to that state */
+	      lhs_sym.parse_state = act;
+	      lhs_sym.used_by_parser = true;
+	      stack.push(lhs_sym);
+	      tos++;
+	       
+	      if (debug) debug_message("# Goto state #" + act);
+
+	    }
+	  /* finally if the entry is zero, we have an error 
+	     (shouldn't happen here, but...)*/
+	  else if (act == 0)
+	    {
+	      report_fatal_error("Syntax error", lhs_sym);
+	      return;
+	    }
+	}
+
+	
+    }
+
+  /*-----------------------------------------------------------*/
+
+  /** Utility function: unpacks parse tables from strings */
+  protected static short[][] unpackFromStrings(String[] sa)
+    {
+      // Concatanate initialization strings.
+      StringBuffer sb = new StringBuffer(sa[0]);
+      for (int i=1; i<sa.length; i++)
+	sb.append(sa[i]);
+      int n=0; // location in initialization string
+      int size1 = (((int)sb.charAt(n))<<16) | ((int)sb.charAt(n+1)); n+=2;
+      short[][] result = new short[size1][];
+      for (int i=0; i<size1; i++) {
+        int size2 = (((int)sb.charAt(n))<<16) | ((int)sb.charAt(n+1)); n+=2;
+        result[i] = new short[size2];
+        for (int j=0; j<size2; j++)
+          result[i][j] = (short) (sb.charAt(n++)-2);
+      }
+      return result;
+    }
+}
+
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/virtual_parse_stack.java
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/virtual_parse_stack.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/java_cup/runtime/virtual_parse_stack.java	(revision 25584)
@@ -0,0 +1,145 @@
+
+package java_cup.runtime;
+
+import java.util.Stack;
+
+/** This class implements a temporary or "virtual" parse stack that 
+ *  replaces the top portion of the actual parse stack (the part that 
+ *  has been changed by some set of operations) while maintaining its
+ *  original contents.  This data structure is used when the parse needs 
+ *  to "parse ahead" to determine if a given error recovery attempt will 
+ *  allow the parse to continue far enough to consider it successful.  Once 
+ *  success or failure of parse ahead is determined the system then 
+ *  reverts to the original parse stack (which has not actually been 
+ *  modified).  Since parse ahead does not execute actions, only parse
+ *  state is maintained on the virtual stack, not full Symbol objects.
+ *
+ * @see     java_cup.runtime.lr_parser
+ * @version last updated: 7/3/96
+ * @author  Frank Flannery
+ */
+
+public class virtual_parse_stack {
+  /*-----------------------------------------------------------*/
+  /*--- Constructor(s) ----------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Constructor to build a virtual stack out of a real stack. */
+  public virtual_parse_stack(Stack shadowing_stack) throws java.lang.Exception
+    {
+      /* sanity check */
+      if (shadowing_stack == null)
+	throw new Exception(
+	  "Internal parser error: attempt to create null virtual stack");
+
+      /* set up our internals */
+      real_stack = shadowing_stack;
+      vstack     = new Stack();
+      real_next  = 0;
+
+      /* get one element onto the virtual portion of the stack */
+      get_from_real();
+    }
+
+  /*-----------------------------------------------------------*/
+  /*--- (Access to) Instance Variables ------------------------*/
+  /*-----------------------------------------------------------*/
+       
+  /** The real stack that we shadow.  This is accessed when we move off
+   *  the bottom of the virtual portion of the stack, but is always left
+   *  unmodified.
+   */
+  protected Stack real_stack;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Top of stack indicator for where we leave off in the real stack.
+   *  This is measured from top of stack, so 0 would indicate that no
+   *  elements have been "moved" from the real to virtual stack. 
+   */
+  protected int real_next;
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** The virtual top portion of the stack.  This stack contains Integer
+   *  objects with state numbers.  This stack shadows the top portion
+   *  of the real stack within the area that has been modified (via operations
+   *  on the virtual stack).  When this portion of the stack becomes empty we 
+   *  transfer elements from the underlying stack onto this stack. 
+   */
+  protected Stack vstack;
+
+  /*-----------------------------------------------------------*/
+  /*--- General Methods ---------------------------------------*/
+  /*-----------------------------------------------------------*/
+
+  /** Transfer an element from the real to the virtual stack.  This assumes 
+   *  that the virtual stack is currently empty.  
+   */
+  protected void get_from_real()
+    {
+      Symbol stack_sym;
+
+      /* don't transfer if the real stack is empty */
+      if (real_next >= real_stack.size()) return;
+
+      /* get a copy of the first Symbol we have not transfered */
+      stack_sym = (Symbol)real_stack.elementAt(real_stack.size()-1-real_next);
+
+      /* record the transfer */
+      real_next++;
+
+      /* put the state number from the Symbol onto the virtual stack */
+      vstack.push(new Integer(stack_sym.parse_state));
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Indicate whether the stack is empty. */
+  public boolean empty()
+    {
+      /* if vstack is empty then we were unable to transfer onto it and 
+	 the whole thing is empty. */
+      return vstack.empty();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+      
+  /** Return value on the top of the stack (without popping it). */
+  public int top() throws java.lang.Exception
+    {
+      if (vstack.empty())
+	throw new Exception(
+		  "Internal parser error: top() called on empty virtual stack");
+
+      return ((Integer)vstack.peek()).intValue();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Pop the stack. */
+  public void pop() throws java.lang.Exception
+    {
+      if (vstack.empty())
+	throw new Exception(
+		  "Internal parser error: pop from empty virtual stack");
+
+      /* pop it */
+      vstack.pop();
+
+      /* if we are now empty transfer an element (if there is one) */
+      if (vstack.empty())
+        get_from_real();
+    }
+
+  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
+
+  /** Push a state number onto the stack. */
+  public void push(int state_num)
+    {
+      vstack.push(new Integer(state_num));
+    }
+
+  /*-----------------------------------------------------------*/
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/manifest
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/manifest	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/manifest	(revision 25584)
@@ -0,0 +1,1 @@
+Main-Class: JFlex.Main
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/skeleton.default
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/skeleton.default	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/skeleton.default	(revision 25584)
@@ -0,0 +1,327 @@
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+--- private static final int ZZ_BUFFERSIZE = ...;
+
+  /** lexical states */
+---  lexical states, charmap
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+--- isFinal list
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** number of newlines encountered up to the start of the matched text */
+  private int yyline;
+
+  /** the number of characters up to the start of the matched text */
+  private int yychar;
+
+  /**
+   * the number of characters from the last newline up to the start of the 
+   * matched text
+   */
+  private int yycolumn;
+
+  /** 
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /** denotes if the user-EOF-code has already been executed */
+  private boolean zzEOFDone;
+
+--- user class code
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+--- constructor declaration
+
+
+  /**
+   * Refills the input buffer.
+   *
+   * @return      <code>false</code>, iff there was new input.
+   * 
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  private boolean zzRefill() throws java.io.IOException {
+
+    /* first: make room (if you can) */
+    if (zzStartRead > 0) {
+      System.arraycopy(zzBuffer, zzStartRead,
+                       zzBuffer, 0,
+                       zzEndRead-zzStartRead);
+
+      /* translate stored positions */
+      zzEndRead-= zzStartRead;
+      zzCurrentPos-= zzStartRead;
+      zzMarkedPos-= zzStartRead;
+      zzStartRead = 0;
+    }
+
+    /* is the buffer big enough? */
+    if (zzCurrentPos >= zzBuffer.length) {
+      /* if not: blow it up */
+      char newBuffer[] = new char[zzCurrentPos*2];
+      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
+      zzBuffer = newBuffer;
+    }
+
+    /* finally: fill the buffer with new input */
+    int numRead = zzReader.read(zzBuffer, zzEndRead,
+                                            zzBuffer.length-zzEndRead);
+
+    if (numRead > 0) {
+      zzEndRead+= numRead;
+      return false;
+    }
+    // unlikely but not impossible: read 0 characters, but not at end of stream    
+    if (numRead == 0) {
+      int c = zzReader.read();
+      if (c == -1) {
+        return true;
+      } else {
+        zzBuffer[zzEndRead++] = (char) c;
+        return false;
+      }     
+    }
+
+	// numRead < 0
+    return true;
+  }
+
+    
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Resets the scanner to read from a new input stream.
+   * Does not close the old reader.
+   *
+   * All internal variables are reset, the old input stream 
+   * <b>cannot</b> be reused (internal buffer is discarded and lost).
+   * Lexical state is set to <tt>ZZ_INITIAL</tt>.
+   *
+   * @param reader   the new input stream 
+   */
+  public final void yyreset(java.io.Reader reader) {
+    zzReader = reader;
+    zzAtBOL  = true;
+    zzAtEOF  = false;
+    zzEOFDone = false;
+    zzEndRead = zzStartRead = 0;
+    zzCurrentPos = zzMarkedPos = 0;
+    yyline = yychar = yycolumn = 0;
+    zzLexicalState = YYINITIAL;
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+--- zzScanError declaration
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+--- throws clause
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+--- yypushback decl (contains zzScanError exception)
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+--- zzDoEOF
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+--- yylex declaration
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+--- local declarations
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+--- start admin (line, char, col count)
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+--- start admin (lexstate etc)
+
+      zzForAction: {
+        while (true) {
+    
+--- next input, line, col, char count, next transition, isFinal action
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+--- line count update
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+--- char count update
+
+--- actions
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+--- eofvalue
+          } 
+          else {
+--- no match
+          }
+      }
+    }
+  }
+
+--- main
+
+}
Index: /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/skeleton.nested
===================================================================
--- /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/skeleton.nested	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel-packages/jflex-1.4.3/src/skeleton.nested	(revision 25584)
@@ -0,0 +1,428 @@
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+--- private static final int ZZ_BUFFERSIZE = ...;
+
+  /** lexical states */
+---  lexical states, charmap
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+--- isFinal list
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+  
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** number of newlines encountered up to the start of the matched text */
+  private int yyline;
+
+  /** the number of characters up to the start of the matched text */
+  private int yychar;
+
+  /**
+   * the number of characters from the last newline up to the start of the 
+   * matched text
+   */
+  private int yycolumn;
+
+  /** 
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /** denotes if the user-EOF-code has already been executed */
+  private boolean zzEOFDone;
+
+  /** the stack of open (nested) input streams to read from */
+  private java.util.Stack zzStreams = new java.util.Stack();
+
+  /**
+   * inner class used to store info for nested
+   * input streams
+   */
+  private static final class ZzFlexStreamInfo {
+    java.io.Reader zzReader;
+    int zzEndRead;
+    int zzStartRead;
+    int zzCurrentPos;
+    int zzMarkedPos;
+    int yyline;
+    int yycolumn;
+    char [] zzBuffer;
+    boolean zzAtEOF;
+    boolean zzEOFDone;
+
+    /** sets all values stored in this class */
+    ZzFlexStreamInfo(java.io.Reader zzReader, int zzEndRead, int zzStartRead,
+                  int zzCurrentPos, int zzMarkedPos, 
+                  char [] zzBuffer, boolean zzAtEOF, int yyline, int yycolumn) {
+      this.zzReader      = zzReader;
+      this.zzEndRead     = zzEndRead;
+      this.zzStartRead   = zzStartRead;
+      this.zzCurrentPos  = zzCurrentPos;
+      this.zzMarkedPos   = zzMarkedPos;
+      this.zzBuffer      = zzBuffer;
+      this.zzAtEOF       = zzAtEOF;
+      this.zzEOFDone     = zzEOFDone;
+      this.yyline         = yyline;
+      this.yycolumn       = yycolumn;
+    }
+  }
+
+--- user class code
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+--- constructor declaration
+
+
+  /**
+   * Refills the input buffer.
+   *
+   * @return      <code>false</code>, iff there was new input.
+   * 
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  private boolean zzRefill() throws java.io.IOException {
+
+    /* first: make room (if you can) */
+    if (zzStartRead > 0) {
+      System.arraycopy(zzBuffer, zzStartRead,
+                       zzBuffer, 0,
+                       zzEndRead-zzStartRead);
+
+      /* translate stored positions */
+      zzEndRead-= zzStartRead;
+      zzCurrentPos-= zzStartRead;
+      zzMarkedPos-= zzStartRead;
+      zzStartRead = 0;
+    }
+
+    /* is the buffer big enough? */
+    if (zzCurrentPos >= zzBuffer.length) {
+      /* if not: blow it up */
+      char newBuffer[] = new char[zzCurrentPos*2];
+      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
+      zzBuffer = newBuffer;
+    }
+
+    /* finally: fill the buffer with new input */
+    int numRead = zzReader.read(zzBuffer, zzEndRead,
+                                            zzBuffer.length-zzEndRead);
+
+    if (numRead > 0) {
+      zzEndRead+= numRead;
+      return false;
+    }
+    // unlikely but not impossible: read 0 characters, but not at end of stream
+    if (numRead == 0) {
+      int c = zzReader.read();
+      if (c == -1) {
+        return true;
+      } else {
+        zzBuffer[zzEndRead++] = (char) c;
+        return false;
+      }     
+    }
+    
+    // numRead < 0) 
+    return true;
+  }
+
+    
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Stores the current input stream on a stack, and
+   * reads from a new stream. Lexical state, line,
+   * char, and column counting remain untouched.
+   *
+   * The current input stream can be restored with
+   * yypopstream (usually in an <<EOF>> action).
+   *
+   * @param reader the new input stream to read from
+   *
+   * @see #yypopStream()
+   */
+  public final void yypushStream(java.io.Reader reader) {
+    zzStreams.push(
+      new ZzFlexStreamInfo(zzReader, zzEndRead, zzStartRead, zzCurrentPos,
+                        zzMarkedPos, zzBuffer, zzAtEOF,
+                        yyline, yycolumn)
+    );
+    zzAtEOF  = false;
+    zzBuffer = new char[ZZ_BUFFERSIZE];
+    zzReader = reader;
+    zzEndRead = zzStartRead = 0;
+    zzCurrentPos = zzMarkedPos = 0;
+    yyline = yycolumn = 0;
+  }
+    
+
+  /**
+   * Closes the current input stream and continues to
+   * read from the one on top of the stream stack. 
+   *
+   * @throws java.util.EmptyStackException
+   *         if there is no further stream to read from.
+   *
+   * @throws java.io.IOException
+   *         if there was an error in closing the stream.
+   *
+   * @see #yypushStream(java.io.Reader)
+   */
+  public final void yypopStream() throws java.io.IOException {
+    zzReader.close();
+    ZzFlexStreamInfo s = (ZzFlexStreamInfo) zzStreams.pop();
+    zzBuffer      = s.zzBuffer;
+    zzReader      = s.zzReader;
+    zzEndRead     = s.zzEndRead;
+    zzStartRead   = s.zzStartRead;
+    zzCurrentPos  = s.zzCurrentPos;
+    zzMarkedPos   = s.zzMarkedPos ;
+    zzAtEOF       = s.zzAtEOF;
+    zzEOFDone     = s.zzEOFDone;
+    yyline         = s.yyline;
+    yycolumn       = s.yycolumn;
+  }
+
+
+  /**
+   * Returns true iff there are still streams left 
+   * to read from on the stream stack.
+   */
+  public final boolean yymoreStreams() {
+    return !zzStreams.isEmpty();
+  }
+
+
+  /**
+   * Resets the scanner to read from a new input stream.
+   * Does not close the old reader.
+   *
+   * All internal variables are reset, the old input stream 
+   * <b>cannot</b> be reused (internal buffer is discarded and lost).
+   * Lexical state is set to <tt>ZZ_INITIAL</tt>.
+   *
+   * @param reader   the new input stream 
+   *
+   * @see #yypushStream(java.io.Reader)
+   * @see #yypopStream()
+   */
+  public final void yyreset(java.io.Reader reader) {
+    zzReader = reader;
+    zzAtBOL  = true;
+    zzAtEOF  = false;
+    zzEOFDone = false;
+    zzEndRead = zzStartRead = 0;
+    zzCurrentPos = zzMarkedPos = 0;
+    yyline = yychar = yycolumn = 0;
+    zzLexicalState = YYINITIAL;
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+--- zzScanError declaration
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+--- throws clause
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+--- yypushback decl (contains zzScanError exception)
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+--- zzDoEOF
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+--- yylex declaration
+    int zzInput;
+    int zzAction;
+
+--- local declarations
+
+    while (true) {
+      // cached fields:
+      int zzCurrentPosL;
+      int zzMarkedPosL = zzMarkedPos;
+      int zzEndReadL = zzEndRead;
+      char [] zzBufferL = zzBuffer;
+      char [] zzCMapL = ZZ_CMAP;
+
+--- start admin (line, char, col count)
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+--- start admin (lexstate etc)
+
+      zzForAction: {
+        while (true) {
+    
+--- next input, line, col, char count, next transition, isFinal action
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+--- line count update
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+--- char count update
+
+--- actions
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+--- eofvalue
+          } 
+          else {
+--- no match
+          }
+      }
+    }
+  }
+
+--- main
+
+}
Index: /other-projects/rsyntax-textarea/devel.bash
===================================================================
--- /other-projects/rsyntax-textarea/devel.bash	(revision 25584)
+++ /other-projects/rsyntax-textarea/devel.bash	(revision 25584)
@@ -0,0 +1,47 @@
+
+extdesc="the Developer's RSyntax Text Area Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+##source cascade-make/lib/cascade-lib.bash
+
+if [ "x$GEXTRSYNTAX" = "x" ] ; then
+  export GEXTRSYNTAX=$fulldir
+  export GEXTRSYNTAX_INSTALLED=$GEXTRSYNTAX/$GSDLOS
+
+#  export PATH=$GEXTRSYNTAX_INSTALLED/bin:$PATH
+
+  export PATH=$GEXTRSYNTAX/bin/script:$PATH
+
+#  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+#    export LD_LIBRARY_PATH=$GEXTRSYNTAX_INSTALLED/lib
+#  else
+#    export LD_LIBRARY_PATH=$GEXTRSYNTAX_INSTALLED/lib:$LD_LIBRARY_PATH
+#  fi
+#  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+#    export DYLD_LIBRARY_PATH=$GEXTRSYNTAX_INSTALLED/lib
+#  else
+#    export DYLD_LIBRARY_PATH=$GEXTRSYNTAX_INSTALLED/lib:$DYLD_LIBRARY_PATH
+#  fi
+
+#  if [ -e "devel-srcpack" ] ; then
+#    export LD_LIBRARY_PATH=$GEXTRSYNTAX_INSTALLED/devel/lib:$LD_LIBRARY_PATH
+#    export DYLD_LIBRARY_PATH=$GEXTRSYNTAX_INSTALLED/devel/lib:$DYLD_LIBRARY_PATH
+#  fi
+
+  
+  extdir=${GEXTRSYNTAX##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /other-projects/rsyntax-textarea/lib/jflex-mode.el
===================================================================
--- /other-projects/rsyntax-textarea/lib/jflex-mode.el	(revision 25584)
+++ /other-projects/rsyntax-textarea/lib/jflex-mode.el	(revision 25584)
@@ -0,0 +1,114 @@
+; -*- Mode: Emacs-Lisp; -*- 
+
+;;;  jflex-mode
+
+;;;  author: Gerwin Klein <lsf@jflex.de>
+;;;  $Revision: 50 $, $Date: 2003-06-08 21:01:12 +1000 (Sun, 08 Jun 2003) $
+
+(require 'derived)
+(require 'font-lock)
+
+(define-derived-mode jflex-mode java-mode "JFlex"
+  "Major mode for editing JFlex files"
+  
+  ;; set the indentation 
+  (setq c-basic-offset 2)
+
+  (c-set-offset 'knr-argdecl-intro 0)
+  (c-set-offset 'topmost-intro-cont 0)
+
+  ;; remove auto and hungry anything
+  (c-toggle-auto-hungry-state -1)
+  (c-toggle-auto-state -1)
+  (c-toggle-hungry-state -1)
+
+  (use-local-map jflex-mode-map)
+
+  ;; get rid of that damn electric-brace
+  (define-key jflex-mode-map "{"	'self-insert-command)
+  (define-key jflex-mode-map "}"	'self-insert-command)
+
+  (define-key jflex-mode-map [tab] 'jflex-indent-command)
+
+  )
+
+(defalias 'jflex-indent-command 'c-indent-command)
+
+(defconst jflex-font-lock-keywords
+  (append 
+   '( 
+     ("^%%" . font-lock-reference-face) 
+     "^%{"
+     "^%init{"
+     "^%initthrow{"
+     "^%eof{"
+     "^%eofthrow{"
+     "^%yylexthrow{"
+     "^%eofval{"
+     "^%}"
+     "^%init}"
+     "^%initthrow}"
+     "^%eof}"
+     "^%eofthrow}"
+     "^%yylexthrow}"
+     "^%eofval}"
+     "^%standalone"        
+     "^%scanerror"
+     "^%switch"
+     "^%states" ; fixme: state identifiers
+     "^%state"
+     "^%s"
+     "^%xstates"
+     "^%xstate"
+     "^%x"
+     "^%char"  
+     "^%line"     
+     "^%column"
+     "^%byaccj"
+     "^%cupsym"
+     "^%cupdebug" 
+     "^%cup"
+     "^%eofclose"    
+     "^%class"
+     "^%function"
+     "^%type"
+     "^%integer"
+     "^%intwrap"         
+     "^%int"
+     "^%yyeof"
+     "^%notunix"
+     "^%7bit"      
+     "^%full"
+     "^%8bit"
+     "^%unicode"
+     "^%16bit"
+     "^%caseless"
+     "^%ignorecase"
+     "^%implements"
+     "^%extends"
+     "^%public"
+     "^%apiprivate"
+     "^%final"    
+     "^%abstract"    
+     "^%debug"          
+     "^%table"
+     "^%pack"
+     "^%include"
+     "^%buffer"
+     "^%initthrow"
+     "^%eofthrow"
+     "^%yylexthrow"
+     "^%throws"
+     ("%[%{}0-9a-zA-Z]+" . font-lock-warning-face) ; errors
+     ("{[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*}" . font-lock-variable-name-face) ; macro uses
+     "<<EOF>>" ; special <<EOF>> symbol
+     ("<[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\(,[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\)*>" . font-lock-type-face) ; lex state list
+     )
+   java-font-lock-keywords-2)
+  "JFlex keywords for font-lock mode")
+
+(put 'jflex-mode 'font-lock-defaults
+	 '(jflex-font-lock-keywords      
+	   nil nil ((?_ . "w")) beginning-of-defun))
+
+(provide 'jflex-mode)
Index: /other-projects/rsyntax-textarea/lib/jflex.vim
===================================================================
--- /other-projects/rsyntax-textarea/lib/jflex.vim	(revision 25584)
+++ /other-projects/rsyntax-textarea/lib/jflex.vim	(revision 25584)
@@ -0,0 +1,149 @@
+" Vim syntax file
+" Language:         JFlex
+" Maintainer:       Gerwin Klein <lsf@jflex.de>
+" Last Change:      $Revision: 50 $, $Date: 2003-06-08 21:01:12 +1000 (Sun, 08 Jun 2003) $
+
+" Thanks to Michael Brailsford for help and suggestions
+
+" Quit when a syntax file was already loaded	{{{
+if exists("b:current_syntax")
+	finish
+endif
+"}}}
+
+" Include java syntax {{{
+if version >= 600
+	runtime! syntax/java.vim
+	unlet b:current_syntax 
+else
+	so $VIMRUNTIME/syntax/java.vim
+endif
+"}}}
+
+syn cluster jflexOptions contains=jflexOption,jflexCodeInclude,jflexComment,jflexMacroIdent,jflexMacroRegExp,jflexOptionError
+syn cluster jflexRules contains=jflexRule,jflexComment,jflexActionCode,jflexRuleStates,jflexRegExp
+
+" java code section
+syn region jflexStart start="/\*\|//\|import\|package\|class"me=s end="^%%"me=e-2 contains=@javaTop nextgroup=jflexOptionReg
+
+" %% 
+" options 
+syn region jflexOptionReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexOptions nextgroup=jflexRulesReg
+
+syn match jflexOptionError "%\i*" contained
+
+syn match jflexOption "^\(%s\|%x\)" contained
+syn match jflexOption "^%state" contained
+syn match jflexOption "^%states" contained
+syn match jflexOption "^%xstate" contained
+syn match jflexOption "^%xstates" contained
+syn match jflexOption "^%char" contained
+syn match jflexOption "^%line" contained
+syn match jflexOption "^%column" contained
+syn match jflexOption "^%byaccj" contained
+syn match jflexOption "^%cup" contained
+syn match jflexOption "^%cupsym" contained
+syn match jflexOption "^%cupdebug" contained
+syn match jflexOption "^%eofclose" contained
+syn match jflexOption "^%class" contained
+syn match jflexOption "^%function" contained
+syn match jflexOption "^%type" contained
+syn match jflexOption "^%integer" contained
+syn match jflexOption "^%int" contained
+syn match jflexOption "^%intwrap" contained
+syn match jflexOption "^%yyeof" contained
+syn match jflexOption "^%notunix" contained
+syn match jflexOption "^%7bit" contained
+syn match jflexOption "^%8bit" contained
+syn match jflexOption "^%full" contained
+syn match jflexOption "^%16bit" contained
+syn match jflexOption "^%unicode" contained
+syn match jflexOption "^%caseless" contained
+syn match jflexOption "^%ignorecase" contained
+syn match jflexOption "^%implements" contained
+syn match jflexOption "^%extends" contained
+syn match jflexOption "^%public" contained
+syn match jflexOption "^%apiprivate" contained
+syn match jflexOption "^%final" contained
+syn match jflexOption "^%abstract" contained
+syn match jflexOption "^%debug" contained
+syn match jflexOption "^%standalone" contained
+syn match jflexOption "^%switch" contained
+syn match jflexOption "^%table" contained
+syn match jflexOption "^%pack" contained
+syn match jflexOption "^%include" contained
+syn match jflexOption "^%buffer" contained
+syn match jflexOption "^%initthrow" contained
+syn match jflexOption "^%eofthrow" contained
+syn match jflexOption "^%yylexthrow" contained
+syn match jflexOption "^%throws" contained
+syn match jflexOption "^%scannerror" contained
+
+syn match jflexMacroIdent "\I\i*\s*="me=e-1 contained nextgroup=jflexMacroRegExp
+
+syn region jflexMacroRegExp matchgroup=jflexOperator start="=" end="^\(%\|\I\|\i\|/\)"me=e-1 contains=NONE contained
+
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%{" end="^%}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%init{" end="^%init}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%initthrow{" end="^%initthrow}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eof{" end="^%eof}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofthrow{" end="^%eofthrow}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%yylexthrow{" end="^%yylexthrow}" contains=@javaTop contained
+syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofval{" end="^%eofval}" contains=@javaTop contained
+
+" rules (end pattern shouldn't occur, if it does anyway we just stay in jflexRulesReg)
+syn region jflexRulesReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexRules 
+
+" at first everything but strings is a regexp
+syn match jflexRegExp "\([^\" \t]\|\\\"\)\+" contained
+
+" take out comments
+syn match jflexComment "//.*" contained
+syn region jflexComment start="/\*" end="\*/" contained contains=jflexComment
+
+" lex states
+syn match jflexRuleStates "<\s*\I\i*\(\s*,\s*\I\i*\)*\s*>" contained skipnl skipwhite nextgroup=jflexStateGroup
+
+" action code (only after states braces and macro use)
+syn region jflexActionCode matchgroup=Delimiter start="{" end="}" contained contains=@javaTop,jflexJavaBraces
+
+" macro use
+syn match jflexRegExp "{\s*\I\i*\s*}" contained
+
+" state braces (only active after <state>)
+syn region jflexStateGroup matchgroup=jflexRuleStates start="{$" start="{\s" end="}" contained contains=@jflexRules
+
+" string
+syn region jflexRegExp matchgroup=String start=+"+ skip=+\\\\\|\\"+ end=+"+ contained
+
+" not to be confused with a state
+syn match jflexRegExp "<<EOF>>" contained
+
+" escape sequence
+syn match jflexRegExp "\\." contained
+
+
+" keep braces in actions balanced
+syn region jflexJavaBraces start="{" end="}" contained contains=@javaTop,jflexJavaBraces
+
+
+" syncing
+syn sync clear
+syn sync minlines=10
+syn sync match jflexSync grouphere jflexOptionReg "^%[a-z]"
+syn sync match jflexSync grouphere jflexRulesReg "^<"
+
+
+" highlighting
+hi link jflexOption      Special
+hi link jflexMacroIdent  Ident
+hi link jflexMacroRegExp Macro
+hi link jflexOptionError Error
+hi link jflexComment     Comment
+hi link jflexOperator    Operator
+hi link jflexRuleStates  Special
+hi link jflexRegExp      Function
+hi jflexSectionSep guifg=yellow ctermfg=yellow guibg=blue ctermbg=blue gui=bold cterm=bold
+hi link jflexCodeIncludeMark jflexSectionSep
+
+let b:current_syntax="jflex"
Index: /other-projects/rsyntax-textarea/src/.classpath
===================================================================
--- /other-projects/rsyntax-textarea/src/.classpath	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/.classpath	(revision 25584)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="i18n"/>
+	<classpathentry kind="src" path="test"/>
+	<classpathentry kind="src" path="themes"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: /other-projects/rsyntax-textarea/src/REGENERATE-FLEX.sh
===================================================================
--- /other-projects/rsyntax-textarea/src/REGENERATE-FLEX.sh	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/REGENERATE-FLEX.sh	(revision 25584)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+pushd java/org/fife/ui/rsyntaxtextarea/modes/
+
+
+for f in *.flex ; do
+  echo "Checking $f ..."
+  if [ $f -nt ${f%.*}.java ] ; then
+    jflex $f
+    echo "... regenerated"
+  else 
+    echo "... does not need to be regenerated"
+  fi
+
+
+done
+
+popd
Index: /other-projects/rsyntax-textarea/src/build.xml
===================================================================
--- /other-projects/rsyntax-textarea/src/build.xml	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/build.xml	(revision 25584)
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!-- 
+
+	This is the Ant build script for rsyntaxtextarea.jar.
+	Available targets include:
+	
+		1. compile:         Compiles all org.fife classes into ${class-dir}.
+		2. make-jar:        Creates the jar file.
+		3. make-source-zip: Creates a source zip file.
+		3. make-javadoc:    Creates the javadoc for RSyntaxTextArea.
+
+	Author:   Robert Futrell
+	Version:  1.4
+	Date:     20feb2009
+
+-->
+
+
+<project name="RSyntaxTextArea" default="make-jar" basedir=".">
+
+	<description>RSyntaxTextArea build file</description>
+
+
+	<!-- Set global properties for this build. -->
+	<property name="version"          value="2.0.3"/>
+	<property name="source-dir"       location="java"/>
+	<property name="class-dir"        location="ant-classes"/>
+	<property name="dist-dir"         location="dist"/>
+	<property name="doc-dir"          location="javadoc"/>
+	<property name="debug"            value="true"/>
+	<property name="debuglevel"       value="lines,var,source"/>
+	<property name="java-level"       value="1.4"/>
+
+
+	<!-- Compiles the classes.  -->
+	<target name="compile" description="Compile the source">
+		<delete includeEmptyDirs="true" quiet="true" dir="${class-dir}"/>
+		<mkdir dir="${class-dir}"/>
+		<javac srcdir="${source-dir}" destdir="${class-dir}"
+			deprecation="yes" debug="${debug}" debuglevel="${debuglevel}"
+			source="${java-level}" target="${java-level}"/>
+	</target>
+
+
+	<!-- Creates the jar file. -->
+	<target name="make-jar" depends="compile"
+			description="Create RSyntaxTextArea jar">
+		<delete includeEmptyDirs="true" quiet="true" dir="${dist-dir}"/>
+		<mkdir dir="${dist-dir}"/>
+		<jar destfile="${dist-dir}/rsyntaxtextarea.jar">
+			<fileset dir="${class-dir}"/>
+			<fileset dir="i18n"/>
+			<fileset dir="${source-dir}">
+				<include name="theme.dtd"/>
+			</fileset>
+			<manifest>
+				<attribute name="Specification-Title" value="RSyntaxTextArea"/>
+				<attribute name="Specification-Version" value="${version}"/>
+				<attribute name="Implementation-Title" value="org.fife.ui"/>
+				<attribute name="Implementation-Version" value="${version}"/>
+				<section name="RTextArea">
+					<attribute name="Specification-Title" value="RTextArea"/>
+					<attribute name="Specification-Version" value="${version}"/>
+					<attribute name="Implementation-Title" value="org.fife.ui.rtextarea"/>
+					<attribute name="Implementation-Version" value="${version}"/>
+				</section>
+				<section name="RSyntaxTextArea">
+					<attribute name="Specification-Title" value="RSyntaxTextArea-Core"/>
+					<attribute name="Specification-Version" value="${version}"/>
+					<attribute name="Implementation-Title" value="org.fife.ui.rsyntaxtextarea"/>
+					<attribute name="Implementation-Version" value="${version}"/>
+				</section>
+			</manifest>
+		</jar>
+		<copy todir="${dist-dir}">
+			<fileset dir="distfiles"/>
+		</copy>
+	</target>
+
+
+	<!-- Builds the source zip file. -->
+	<target name="make-source-zip" description="Builds the source zip file">
+		<zip destfile="./rsyntaxtextarea_${version}_Source.zip">
+			<fileset dir=".">
+				<include name="distfiles/**"/>
+				<include name="i18n/**"/>
+				<include name="java/**"/>
+				<include name="build.xml"/>
+				<include name=".properties"/>
+				<include name=".classpath"/>
+			</fileset>
+		</zip>
+	</target>
+
+
+	<!-- Builds the javadoc.  -->
+	<target name="make-javadoc" depends="compile">
+		<javadoc  destdir="${doc-dir}" author="true" version="true"
+			 	breakiterator="yes">
+			<packageset dir="${source-dir}" defaultexcludes="yes">
+				<include name="org/**"/>
+			</packageset>
+		</javadoc>
+	</target>
+
+
+</project>
Index: /other-projects/rsyntax-textarea/src/dist/RSyntaxTextArea.License.txt
===================================================================
--- /other-projects/rsyntax-textarea/src/dist/RSyntaxTextArea.License.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/dist/RSyntaxTextArea.License.txt	(revision 25584)
@@ -0,0 +1,24 @@
+Copyright (c) 2012, Robert Futrell
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the author nor the names of its contributors may
+      be used to endorse or promote products derived from this software
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: /other-projects/rsyntax-textarea/src/dist/readme.txt
===================================================================
--- /other-projects/rsyntax-textarea/src/dist/readme.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/dist/readme.txt	(revision 25584)
@@ -0,0 +1,35 @@
+RSyntaxTextArea Readme
+----------------------
+Please contact me if you are using RSyntaxTextArea in your project!  I like
+to know when people are finding it useful.  Please send mail to:
+robert -at- fifesoft dot com.
+
+
+* About RSyntaxTextArea
+
+  RSyntaxTextArea is a syntax highlighting text component, written in Swing.
+  It allows applications to easily embed syntax highlighting for most common
+  programming languages.  Most other standard programmer's editor features are
+  built-in: auto-indent, bracket matching, undo/redo, etc.  Auto-completion
+  is available as an add-on library (see http://fifesoft.com/autocomplete).
+
+* License
+
+  RSyntaxTextArea is licensed under a modified BSD license.  Please see the
+  included RSyntaxTextArea.License.txt file.
+
+* Feedback
+
+  I hope you find RSyntaxTextArea useful.  Bug reports, feature requests, and
+  just general questions are always welcome.  Ways you can submit feedback:
+  
+    * http://forum.fifesoft.com (preferred)
+         Has a forum for RSyntaxTextArea and related projects, where you can
+         ask questions and get feedback quickly.
+
+    * http://sourceforge.net/projects/rsyntaxtextarea
+         Has a tracker for bug reports, feature requests, etc.
+
+    * http://fifesoft.com/rsyntaxtextarea
+         Project home page, which contains general information and example
+         source code.
Index: /other-projects/rsyntax-textarea/src/distfiles/RSyntaxTextArea.License.txt
===================================================================
--- /other-projects/rsyntax-textarea/src/distfiles/RSyntaxTextArea.License.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/distfiles/RSyntaxTextArea.License.txt	(revision 25584)
@@ -0,0 +1,24 @@
+Copyright (c) 2012, Robert Futrell
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the author nor the names of its contributors may
+      be used to endorse or promote products derived from this software
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: /other-projects/rsyntax-textarea/src/distfiles/readme.txt
===================================================================
--- /other-projects/rsyntax-textarea/src/distfiles/readme.txt	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/distfiles/readme.txt	(revision 25584)
@@ -0,0 +1,35 @@
+RSyntaxTextArea Readme
+----------------------
+Please contact me if you are using RSyntaxTextArea in your project!  I like
+to know when people are finding it useful.  Please send mail to:
+robert -at- fifesoft dot com.
+
+
+* About RSyntaxTextArea
+
+  RSyntaxTextArea is a syntax highlighting text component, written in Swing.
+  It allows applications to easily embed syntax highlighting for most common
+  programming languages.  Most other standard programmer's editor features are
+  built-in: auto-indent, bracket matching, undo/redo, etc.  Auto-completion
+  is available as an add-on library (see http://fifesoft.com/autocomplete).
+
+* License
+
+  RSyntaxTextArea is licensed under a modified BSD license.  Please see the
+  included RSyntaxTextArea.License.txt file.
+
+* Feedback
+
+  I hope you find RSyntaxTextArea useful.  Bug reports, feature requests, and
+  just general questions are always welcome.  Ways you can submit feedback:
+  
+    * http://forum.fifesoft.com (preferred)
+         Has a forum for RSyntaxTextArea and related projects, where you can
+         ask questions and get feedback quickly.
+
+    * http://sourceforge.net/projects/rsyntaxtextarea
+         Has a tracker for bug reports, feature requests, etc.
+
+    * http://fifesoft.com/rsyntaxtextarea
+         Project home page, which contains general information and example
+         source code.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties	(revision 25584)
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties	(revision 25584)
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties	(revision 25584)
@@ -0,0 +1,1 @@
+FocusHotkey=Press 'F2' for focus
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea.properties	(revision 25584)
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copy
+Action.Copy.Desc=Copies current selection to the clipboard.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cut
+Action.Cut.Desc=Removes current selection and places it on the clipboard.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Delete
+Action.Delete.Desc=Removes current selection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Paste
+Action.Paste.Desc=Places text on clipboard at current location in text file.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Select All
+Action.SelectAll.Desc=Selects all text in current text document.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=Can't Undo
+Action.Undo.Desc=Takes back the last action.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=Can't Redo
+Action.Redo.Desc=Re-applies the last action undone.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=\u0646
+Action.Copy.Name=\u0646\u0633\u062e
+Action.Copy.Desc=\u0646\u0633\u062e \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629.
+
+Action.Cut.Mnemonic=\u0642
+Action.Cut.Name=\u0642\u0635
+Action.Cut.Desc=\u0645\u0633\u062d \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a \u0648\u0646\u0642\u0644\u0647 \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629.
+
+Action.Delete.Mnemonic=\u062d
+Action.Delete.Name=\u062d\u0630\u0641
+Action.Delete.Desc=\u062d\u0630\u0641 \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a.
+
+Action.Paste.Mnemonic=\u0644
+Action.Paste.Name=\u0644\u0635\u0642
+Action.Paste.Desc=\u0644\u0635\u0642 \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0648\u062c\u0648\u062f \u0641\u064a \u0627\u0644\u062d\u0627\u0641\u0638\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u0645\u0643\u0627\u0646.
+
+Action.SelectAll.Mnemonic=\u0643
+Action.SelectAll.Name=\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0643\u0644
+Action.SelectAll.Desc=\u062a\u062d\u062f\u064a\u062f \u062c\u0645\u064a\u0639 \u0627\u0644\u0646\u0635 \u0641\u064a \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0627\u0644\u062d\u0627\u0644\u064a.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u062a\u0631\u0627\u062c\u0639
+Action.Undo.Desc=\u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646 \u0622\u062e\u0631 \u062e\u0637\u0648\u0629.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=\u0644\u0627 \u064a\u0645\u0643\u0646 \u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u0631\u0627\u062c\u0639
+Action.Redo.Desc=\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646 \u0622\u062e\u0631 \u062e\u0637\u0648\u0629.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_de.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_de.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_de.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopieren
+Action.Copy.Desc=Kopiert die aktuelle Auswahl in die Zwischenablage.
+
+Action.Cut.Mnemonic=U
+Action.Cut.Name=Ausschneiden
+Action.Cut.Desc=Ausschneiden in die Zwischenablage.
+
+Action.Delete.Mnemonic=L
+Action.Delete.Name=L\u00f6schen
+Action.Delete.Desc=Auswahl entfernen.
+
+Action.Paste.Mnemonic=I
+Action.Paste.Name=Einf\u00fcgen
+Action.Paste.Desc=Zwischenablage hier einf\u00fcgen.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Alle ausw\u00e4hlen
+Action.SelectAll.Desc=W\u00e4hlt den gesamten Text aus.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=R\u00fcckg\u00e4ngig nicht m\u00f6glich
+Action.Undo.Desc=Macht die letzte Aktion r\u00fcckg\u00e4ngig.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=Wiederholung nicht m\u00f6glich
+Action.Redo.Desc=Wiederholt die letzte Aktion.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_es.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_es.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_es.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copiar
+Action.Copy.Desc=Copia la selecci\u00f3n actual en el portapapeles.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cortar
+Action.Cut.Desc=Elimina la selecci\u00f3n actual y la p\u00f3ne en el portapapeles.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Eliminar
+Action.Delete.Desc=Elimina la selecci\u00f3n actual.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Pegar
+Action.Paste.Desc=P\u00f3ne el texto del portapapeles en la posici\u00f3n actual del archivo de texto.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Seleccionar todo
+Action.SelectAll.Desc=Selecciona todo el texto en el documento de texto actual.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=No se puede deshacer
+Action.Undo.Desc=Deshace la \u00faltima acci\u00f3n.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=No se puede rehacer
+Action.Redo.Desc=Rehace la \u00faltima acci\u00f3n deshecha.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copier
+Action.Copy.Desc=Copie la s\u00e9lection dans le presse-papiers.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Couper
+Action.Cut.Desc=Coupe la s\u00e9lection et la place dans le presse-papiers.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Effacer
+Action.Delete.Desc=Efface la s\u00e9lection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Coller
+Action.Paste.Desc=Insert le contenu du presse-papiers \u00e0 l'emplacement courant.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=S\u00e9lectionner tout
+Action.SelectAll.Desc=S\u00e9lectionne tout le texte du document courant.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=Annuler
+Action.Undo.Desc=Annule la derni\u00e8re action.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=R\u00e9tablir
+Action.Redo.Desc=R\u00e9p\u00e8te la derni\u00e8re action annul\u00e9e.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=M
+Action.Copy.Name=M\u00e1sol
+Action.Copy.Desc=\u00c1tm\u00e1solja a kijel\u00f6lt r\u00e9szt a v\u00e1g\u00f3lapra.
+
+Action.Cut.Mnemonic=K
+Action.Cut.Name=Kiv\u00e1g
+Action.Cut.Desc=T\u00f6rli a kijel\u00f6lt r\u00e9szt, \u00e9s \u00e1thelyezi a v\u00e1g\u00f3lapra.
+
+Action.Delete.Mnemonic=T
+Action.Delete.Name=T\u00f6r\u00f6l
+Action.Delete.Desc=T\u00f6rli a kijel\u00f6l\u00e9st.
+
+Action.Paste.Mnemonic=B
+Action.Paste.Name=Beilleszt
+Action.Paste.Desc=Beilleszti a v\u00e1g\u00f3lapon l\u00e9v\u0151 r\u00e9szt a dokumentumba.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Mindent kijel\u00f6l
+Action.SelectAll.Desc=Kijel\u00f6li az \u00f6sszes sz\u00f6veget a jelenlegi dokumentumban.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=Nem vonhat\u00f3 vissza
+Action.Undo.Desc=Visszavonja az el\u0151z\u0151 m\u0171veletet.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=Nem \u00e1ll\u00edthat\u00f3 vissza
+Action.Redo.Desc=\u00dajra elv\u00e9gzi az utolj\u00e1ra v\u00e9grehajtott m\u0171veletet, amit nem siker\u00fclt v\u00e9grehajtani.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_in.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_in.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_in.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Salin
+Action.Copy.Desc=Salin current selection ke clipboard.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cut
+Action.Cut.Desc=Hapus current selection dan letakkan dalam clipboard.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Hapus
+Action.Delete.Desc=Hapus current selection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Paste
+Action.Paste.Desc=Letakkan text pada clipboard di lokasi saat ini dalam text file.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Pilih Semua
+Action.SelectAll.Desc=Pilih semua text dalam dokumen text saat ini.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=Tidak Dapat Undo
+Action.Undo.Desc=Kembali ke aksi terakhir.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=Tidak dapat Redo
+Action.Redo.Desc=Ulangi aksi terakhir yang di-undone.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_it.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_it.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_it.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copia
+Action.Copy.Desc=Copia la selezione corrente negli appunti.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Taglia
+Action.Cut.Desc=Rimuove la selezione corrente e la memorizza negli appunti.
+
+Action.Delete.Mnemonic=E
+Action.Delete.Name=Elimina
+Action.Delete.Desc=Rimuove la selezione corrente.
+
+Action.Paste.Mnemonic=I
+Action.Paste.Name=Incolla
+Action.Paste.Desc=Inserisce il testo presente negli appunti nella posizione corrente nel file di testo.
+
+Action.SelectAll.Mnemonic=E
+Action.SelectAll.Name=Seleziona tutto
+Action.SelectAll.Desc=Seleziona tutto il testo nel documento corrente.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=Impossibile annullare
+Action.Undo.Desc=Annulla l'ultima azione.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=Impossibile ripristinare
+Action.Redo.Desc=Riapplica l'ultima azione annullata.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u30b3\u30d4\u30fc
+Action.Copy.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u30ab\u30c3\u30c8
+Action.Cut.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u524a\u9664\u3057\u3066\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u79fb\u3057\u307e\u3059
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u524a\u9664
+Action.Delete.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u524a\u9664\u3057\u307e\u3059
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u8cbc\u308a\u4ed8\u3051
+Action.Paste.Desc=\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30ab\u30fc\u30bd\u30eb\u4f4d\u7f6e\u306b\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u8cbc\u308a\u4ed8\u3051\u307e\u3059
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u3059\u3079\u3066\u9078\u629e
+Action.SelectAll.Desc=\u30ab\u30ec\u30f3\u30c8\u30c6\u30ad\u30b9\u30c8\u66f8\u985e\u306e\u30c6\u30ad\u30b9\u30c8\u3059\u3079\u3066\u3092\u9078\u629e\u3057\u307e\u3059
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=\u5143\u306b\u623b\u305b\u307e\u305b\u3093
+Action.Undo.Desc=\u524d\u56de\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u53d6\u308a\u6d88\u3057\u307e\u3059
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=\u518d\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093
+Action.Redo.Desc=\u53d6\u308a\u6d88\u3055\u308c\u305f\u524d\u56de\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u518d\u9069\u7528\u3057\u307e\u3059
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\ubcf5\uc0ac
+Action.Copy.Desc=\ud604\uc7ac\uc758 \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac\ud55c\ub2e4.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\uc798\ub77c\ub0b4\uae30
+Action.Cut.Desc=\ud604\uc7ac\uc758 \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc81c\uac70\ud574\uc11c \ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac\ud55c\ub2e4.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\uc9c0\uc6b0\uae30
+Action.Delete.Desc=\ud604\uc7ac\uc758 \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc81c\uac70\ud55c\ub2e4.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\ubd99\uc5ec\ub123\uae30
+Action.Paste.Desc=\ud074\ub9bd\ubcf4\ub4dc\uc5d0 \uc788\ub294 \ud14d\uc2a4\ud2b8\ub97c \ud604\uc7ac\uc758 \uc704\uce58\ub85c \ubd80\ud168 \uc900\ub2e4.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\uc804\uccb4 \uc120\ud0dd
+Action.SelectAll.Desc=\ud604\uc7ac\uc758 \ud14d\uc2a4\ud2b8 \ud30c\uc77c\uc758 \ubaa8\ub4e0 \ud14d\uc2a4\ud2b8\ub97c \uc120\ud0dd\ud55c\ub2e4.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=\ucde8\uc18c\ud560\uc218 \uc5c6\uc74c
+Action.Undo.Desc=\ub9c8\uc9c0\ub9c9 action\uc744 \ucde8\uc18c\ud55c\ub2e4.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=\ub2e4\uc2dc \ud560\uc218 \uc5c6\uc74c
+Action.Redo.Desc=\ucde8\uc18c\ub41c action\uc744 \ub2e4\uc2dc \uc801\uc6a9\ud55c\ub2e4.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopi\u00ebren
+Action.Copy.Desc=Kopieert de huidige selectie naar het prikbord.
+
+Action.Cut.Mnemonic=X
+Action.Cut.Name=Knippen
+Action.Cut.Desc=Haalt de huidige selectie weg en plaatst het op het prikbord
+
+Action.Delete.Mnemonic=V
+Action.Delete.Name=Verwijderen
+Action.Delete.Desc=Verwijdert huidige selectie.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Plakken
+Action.Paste.Desc=Plaatst tekst van het prikbordop de huidige locatie in het tekst bestand.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Alles selecteren
+Action.SelectAll.Desc=Selecteerd alle tekst in het huidige document.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=Ongedaan maken niet mogelijk
+Action.Undo.Desc=Haalt de laatste actie terug.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=Opnieuw uitvoeren niet mogelijk
+Action.Redo.Desc=Herhaalt de laatste teruggehaalde actie.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copiar
+Action.Copy.Desc=Copia o texto selecionado para a \u00e1rea de transfer\u00eancia.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Recortar
+Action.Cut.Desc=Remove o texto selecionado e o coloca na \u00e1rea de transfer\u00eancia.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Excluir
+Action.Delete.Desc=Remove o texto selecionado.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Colar
+Action.Paste.Desc=Coloca o texto da \u00e1rea de transfer\u00eancia na posi\u00e7\u00e3o atual do arquivo.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Selecionar Tudo
+Action.SelectAll.Desc=Seleciona todo o texto no documento de texto atual.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=Imposs\u00edvel Desfazer
+Action.Undo.Desc=Desfaz a \u00faltima a\u00e7\u00e3o.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=Imposs\u00edvel Refazer
+Action.Redo.Desc=Refaz a \u00faltima a\u00e7\u00e3o desfeita.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=\u041a
+Action.Copy.Name=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+Action.Copy.Desc=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430.
+
+Action.Cut.Mnemonic=\u0412
+Action.Cut.Name=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c
+Action.Cut.Desc=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430.
+
+Action.Delete.Mnemonic=\u0423
+Action.Delete.Name=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+Action.Delete.Desc=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430.
+
+Action.Paste.Mnemonic=\u0421
+Action.Paste.Name=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
+Action.Paste.Desc=\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0444\u0430\u0439\u043b\u0435.
+
+Action.SelectAll.Mnemonic=\u042b
+Action.SelectAll.Name=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
+Action.SelectAll.Desc=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u0435.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=\u041e\u0442\u043c\u0435\u043d\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430
+Action.Undo.Desc=\u041e\u0442\u043a\u0430\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=\u041f\u043e\u0432\u0442\u043e\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d
+Action.Redo.Desc=\u0412\u044b\u0437\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=K
+Action.Copy.Name=Kopyala
+Action.Copy.Desc=Secileni ClipBoarda Kopyalar.
+
+Action.Cut.Mnemonic=X
+Action.Cut.Name=Kes
+Action.Cut.Desc=Secileni Kaldirip ClipBoarda Yerlestirir.
+
+Action.Delete.Mnemonic=S
+Action.Delete.Name=Sil
+Action.Delete.Desc=Secileni Kaldir.
+
+Action.Paste.Mnemonic=Y
+Action.Paste.Name=Yapistir
+Action.Paste.Desc=Metni Metin Dosyasindaki Su Anki Yere Yapistir.
+
+Action.SelectAll.Mnemonic=T
+Action.SelectAll.Name=Tumunu Sec
+Action.SelectAll.Desc=Metin Belgesindeki Butun Metini Secer.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=Geri Alinamaz
+Action.Undo.Desc=Son Eylemi Geri Alir.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=Yeniden Yapilamaz
+Action.Redo.Desc=Geri Alinan Eylemi Yeniden Uygular.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties	(revision 25584)
@@ -0,0 +1,30 @@
+#Version History
+#Version     Date     Author     Contact     
+# create     2006-4-14      SunYi     SonYiChi@gmail.com 
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u590d\u5236
+Action.Copy.Desc=\u5c06\u5f53\u524d\u9009\u62e9\u590d\u5236\u5230\u526a\u8d34\u677f.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u526a\u5207
+Action.Cut.Desc=\u5c06\u5f53\u524d\u9009\u62e9\u590d\u5236\u5230\u526a\u8d34\u677f\u5e76\u4ece\u6587\u672c\u533a\u57df\u5220\u9664.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u5220\u9664
+Action.Delete.Desc=\u5220\u9664\u5f53\u524d\u9009\u62e9\u533a\u57df.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u7c98\u8d34
+Action.Paste.Desc=\u5c06\u5f53\u524d\u526a\u8d34\u677f\u5185\u5bb9\u590d\u5236\u5230\u6587\u672c\u533a\u57df.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u5168\u9009
+Action.SelectAll.Desc=\u9009\u62e9\u5f53\u524d\u6587\u6863\u4e2d\u5168\u90e8\u5185\u5bb9.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=\u65e0\u6cd5\u64a4\u9500
+Action.Undo.Desc=\u64a4\u9500\u4e0a\u6b21\u64cd\u4f5c.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=\u65e0\u6cd5\u91cd\u590d
+Action.Redo.Desc=\u6267\u884c\u4e0b\u4e2a\u64cd\u4f5c.
Index: /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties
===================================================================
--- /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties	(revision 25584)
@@ -0,0 +1,27 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u8907\u88fd
+Action.Copy.Desc=\u62f7\u8c9d\u73fe\u9078\u9805\u5165\u526a\u8cbc\u677f.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u526a\u5207
+Action.Cut.Desc=\u522a\u9664\u9078\u64c7\u4e26\u653e\u5165\u526a\u8cbc\u677f.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u522a\u9664
+Action.Delete.Desc=\u522a\u9664\u7576\u524d\u9078\u9805.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u7c98\u8cbc
+Action.Paste.Desc=\u5c07\u526a\u8cbc\u677f\u4e2d\u7684\u6587\u672c\u653e\u5165\u7576\u524d\u4f4d\u7f6e.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u5168\u9078
+Action.SelectAll.Desc=\u5168\u9078\u73fe\u6a94\u6848\u6240\u6709\u6587\u5b57.
+
+Action.Undo.Mnemonic=U
+Action.CantUndo.Name=\u7121\u6cd5\u64a4\u92b7
+Action.Undo.Desc=\u53d6\u6d88\u6700\u5f8c\u4e00\u6b21\u884c\u52d5.
+
+Action.Redo.Mnemonic=R
+Action.CantRedo.Name=\u7121\u6cd5\u91cd\u505a
+Action.Redo.Desc=\u91cd\u8907\u6700\u5f8c\u53d6\u6d88\u7684\u884c\u52d5.
Index: /other-projects/rsyntax-textarea/src/java/org/fife/io/DocumentReader.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/io/DocumentReader.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/io/DocumentReader.java	(revision 25584)
@@ -0,0 +1,209 @@
+/*
+ * 02/24/2004
+ *
+ * DocumentReader.java - A reader for javax.swing.text.Document
+ * objects.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.Reader;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Segment;
+
+
+/**
+ * A <code>Reader</code> for <code>javax.swing.text.Document</code> objects.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class DocumentReader extends Reader {
+
+	/**
+	 * The stream's position in the document.
+	 */
+	private long position;
+	
+	/**
+	 * A remembered position in the document.
+	 */
+	private long mark;
+	
+	/**
+	 * The document we're working on.
+	 */
+	private Document document;
+	
+	/**
+	 * Used for fast character access.
+	 */
+	private Segment segment;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param document The document we're 'reading'.
+	 */
+	public DocumentReader(Document document) {
+		position = 0;
+		mark = -1;
+		this.document = document;
+		this.segment = new Segment();
+	}
+
+
+	/**
+	 * This currently does nothing...
+	 */
+	public void close() {
+	}
+
+
+	/**
+	 * Marks the present position in the stream.  Subsequent calls to
+	 * <code>reset()</code> will reposition the stream to this point.
+	 *
+	 * @param readAheadLimit Ignored.
+	 */
+	public void mark(int readAheadLimit) {
+		mark = position;
+	}
+
+
+	/**
+	 * Tells whether this reader supports the <code>mark</code> operation.
+	 * This always returns <code>true</code> for <code>DocumentReader</code>.
+	 */
+	public boolean markSupported() {
+		return true;
+	}
+
+
+	/**
+	 * Reads the single character at the current position in the document.
+	 */
+	public int read() {
+		if(position>=document.getLength()) {
+			return -1;      // Read past end of document.
+		}
+		try {
+			document.getText((int)position,1, segment);
+			position++;
+			return segment.array[segment.offset];
+		} catch (BadLocationException ble) {
+			/* Should never happen?? */
+			ble.printStackTrace();
+			return -1;
+		}
+	}
+
+
+	/**
+	 * Read <code>array.length</code> characters from the beginning
+	 * of the document into <code>array</code>.
+	 *
+	 * @param array The array to read characters into.
+	 * @return The number of characters read.
+	 */
+	public int read(char array[]) {
+		return read(array, 0, array.length);
+	}
+
+
+	/**
+	 * Reads characters into a portion of an array.
+	 *
+	 * @param cbuf The destination buffer.
+	 * @param off Offset at which to start storing characters.
+	 * @param len Maximum number of characters to read.
+	 * @return The number of characters read, or <code>-1</code> if the
+	 *         end of the stream (document) has been reached.
+	 */
+	public int read(char cbuf[], int off, int len) {
+		int k;
+		if(position>=document.getLength()) {
+			return -1;      // Read past end of document.
+		}
+		k = len;
+		if((position+k)>=document.getLength())
+			k = document.getLength() - (int)position;
+		if(off + k >= cbuf.length)
+			k = cbuf.length - off;
+		try {
+			document.getText((int)position, k, segment);
+			position += k;
+			System.arraycopy(segment.array,segment.offset,
+							cbuf,off,
+							k);
+			return k;
+		} catch (BadLocationException ble) {
+			/* Should never happen ? */
+			return -1;
+		}
+	}
+
+
+	/**
+	 * Tells whether this reader is ready to be read without
+	 * blocking for input.  <code>DocumentReader</code> will
+	 * always return true.
+	 *
+	 * @return <code>true</code> if the next read operation will
+	 *         return without blocking.
+	 */
+	public boolean ready() {
+		return true;
+	}
+
+
+	/**
+	 * Resets the stream.  If the stream has been marked, then attempt to
+	 * reposition it at the mark.  If the stream has not been marked, then
+	 * move it to the beginning of the document.
+	 */
+	public void reset() {
+		if(mark==-1) {
+			position = 0;
+		}
+		else {
+			position = mark;
+			mark = -1;
+		}
+	}
+
+
+	/**
+	 * Skips characters.  This will not 'skip' past the end of the document.
+	 *
+	 * @param n The number of characters to skip.
+	 * @return The number of characters actually skipped.
+	 */
+	public long skip(long n) {
+		if (position+n<=document.getLength()) {
+			position += n;
+			return n;
+		}
+		long temp = position;
+		position = document.getLength();
+		return document.getLength() - temp;
+	}
+
+
+	/**
+	 * Move to the specified position in the document.  If <code>pos</code>
+	 * is greater than the document's length, the stream's position is moved
+	 * to the end of the document.
+	 *
+	 * @param pos The position in the document to move to.
+	 */
+	public void seek(long pos) {
+		position = Math.min(pos, document.getLength());
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/io/UnicodeReader.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/io/UnicodeReader.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/io/UnicodeReader.java	(revision 25584)
@@ -0,0 +1,268 @@
+/*
+ * 09/23/2004
+ *
+ * UnicodeReader.java - A reader for Unicode input streams that is capable of
+ * discerning which particular encoding is being used via the BOM.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PushbackInputStream;
+import java.io.Reader;
+
+
+/**
+ * A reader capable of identifying Unicode streams by their BOMs.  This class
+ * will recognize the following encodings:
+ * <ul>
+ *   <li>UTF-8
+ *   <li>UTF-16LE
+ *   <li>UTF-16BE
+ *   <li>UTF-32LE
+ *   <li>UTF-32BE
+ * </ul>
+ * If the stream is not found to be any of the above, then a default encoding
+ * is used for reading.  The user can specify this default encoding, or a system
+ * default will be used.<p>
+ *
+ * For optimum performance, it is recommended that you wrap all instances of
+ * <code>UnicodeReader</code> with a <code>java.io.BufferedReader</code>.<p>
+ *
+ * This class is mostly ripped off from the workaround in the description of
+ * Java Bug 4508058.
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+public class UnicodeReader extends Reader {
+
+	/**
+	 * The input stream from which we're really reading.
+	 */
+	private InputStreamReader internalIn = null;
+
+	/**
+	 * The encoding being used.  We keep our own instead of using the string
+	 * returned by <code>java.io.InputStreamReader</code> since that class
+	 * does not return user-friendly names.
+	 */
+	private String encoding;
+
+	/**
+	 * The size of a BOM.
+	 */
+	private static final int BOM_SIZE = 4;
+
+
+	/**
+	 * This utility constructor is here because you will usually use a
+	 * <code>UnicodeReader</code> on files.<p>
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a system default encoding is used.
+	 *
+	 * @param file The file from which you want to read.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 * @throws FileNotFoundException If the file does not exist, is a
+	 *         directory, or cannot be opened for reading.
+	 * @throws SecurityException If a security manager exists and its
+	 *         checkRead method denies read access to the file.
+	 */
+	public UnicodeReader(String file) throws IOException,
+							FileNotFoundException, SecurityException {
+		this(new File(file));
+	}
+
+
+	/**
+	 * This utility constructor is here because you will usually use a
+	 * <code>UnicodeReader</code> on files.<p>
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a system default encoding is used.
+	 *
+	 * @param file The file from which you want to read.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 * @throws FileNotFoundException If the file does not exist, is a
+	 *         directory, or cannot be opened for reading.
+	 * @throws SecurityException If a security manager exists and its
+	 *         checkRead method denies read access to the file.
+	 */
+	public UnicodeReader(File file) throws IOException, FileNotFoundException,
+									SecurityException {
+		this(new FileInputStream(file));
+	}
+
+
+	/**
+	 * This utility constructor is here because you will usually use a
+	 * <code>UnicodeReader</code> on files.<p>
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a specified default encoding is
+	 * used.
+	 *
+	 * @param file The file from which you want to read.
+	 * @param defaultEncoding The encoding to use if no BOM is found.  If
+	 *        this value is <code>null</code>, a system default is used.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 * @throws FileNotFoundException If the file does not exist, is a
+	 *         directory, or cannot be opened for reading.
+	 * @throws SecurityException If a security manager exists and its
+	 *         checkRead method denies read access to the file.
+	 */
+	public UnicodeReader(File file, String defaultEncoding)
+						throws IOException, FileNotFoundException,
+								SecurityException {
+		this(new FileInputStream(file), defaultEncoding);
+	}
+
+
+	/**
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then a system default encoding is used.
+	 *
+	 * @param in The input stream from which to read.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 */
+	public UnicodeReader(InputStream in) throws IOException {
+		this(in, null);
+	}
+
+
+	/**
+	 * Creates a reader using the encoding specified by the BOM in the file;
+	 * if there is no recognized BOM, then <code>defaultEncoding</code> is
+	 * used.
+	 *
+	 * @param in The input stream from which to read.
+	 * @param defaultEncoding The encoding to use if no recognized BOM is
+	 *        found.  If this value is <code>null</code>, a system default
+	 *        is used.
+	 * @throws IOException If an error occurs when checking for/reading the
+	 *         BOM.
+	 */
+	public UnicodeReader(InputStream in, String defaultEncoding)
+									throws IOException {
+		init(in, defaultEncoding);
+	}
+
+
+	/**
+	 * Closes this reader.
+	 */
+	public void close() throws IOException {
+		internalIn.close();
+	}
+
+
+	/**
+	 * Returns the encoding being used to read this input stream (i.e., the
+	 * encoding of the file).  If a BOM was recognized, then the specific
+	 * Unicode type is returned; otherwise, either the default encoding passed
+	 * into the constructor or the system default is returned.
+	 *
+	 * @return The encoding of the stream.
+	 */
+	public String getEncoding() {
+		return encoding;
+	}
+
+
+	/**
+	 * Read-ahead four bytes and check for BOM marks. Extra bytes are
+	 * unread back to the stream, only BOM bytes are skipped.
+	 *
+	 * @param defaultEncoding The encoding to use if no BOM was recognized.  If
+	 *        this value is <code>null</code>, then a system default is used.
+	 * @throws IOException If an error occurs when trying to read a BOM.
+	 */
+	protected void init(InputStream in, String defaultEncoding)
+											throws IOException {
+
+		PushbackInputStream tempIn = new PushbackInputStream(in, BOM_SIZE);
+
+		byte bom[] = new byte[BOM_SIZE];
+		int n, unread;
+		n = tempIn.read(bom, 0, bom.length);
+
+		if ((bom[0]==(byte)0x00) && (bom[1]==(byte)0x00) &&
+				(bom[2]==(byte)0xFE) && (bom[3]==(byte)0xFF)) {
+			encoding = "UTF-32BE";
+			unread = n - 4;
+		}
+
+		else if (n==BOM_SIZE && // Last 2 bytes are 0; could be an empty UTF-16
+				(bom[0]==(byte)0xFF) && (bom[1]==(byte)0xFE) &&
+				(bom[2]==(byte)0x00) && (bom[3]==(byte)0x00)) {
+			encoding = "UTF-32LE";
+			unread = n - 4;
+		}
+		
+		else if ((bom[0]==(byte)0xEF) &&
+			(bom[1]==(byte)0xBB) &&
+			(bom[2]==(byte)0xBF)) {
+			encoding = "UTF-8";
+			unread = n - 3;
+		}
+
+		else if ((bom[0]==(byte)0xFE) && (bom[1] == (byte)0xFF)) {
+			encoding = "UTF-16BE";
+			unread = n - 2;
+		}
+
+		else if ((bom[0]==(byte)0xFF) && (bom[1]== (byte)0xFE)) {
+			encoding = "UTF-16LE";
+			unread = n - 2;
+		}
+
+		else {
+			// Unicode BOM mark not found, unread all bytes
+			encoding = defaultEncoding;
+			unread = n;
+		}
+
+		if (unread > 0)
+			tempIn.unread(bom, (n - unread), unread);
+		else if (unread < -1)
+			tempIn.unread(bom, 0, 0);
+
+		// Use given encoding
+		if (encoding == null) {
+			internalIn = new InputStreamReader(tempIn);
+			encoding = internalIn.getEncoding(); // Get the default.
+		}
+		else {
+			internalIn = new InputStreamReader(tempIn, encoding);
+		}
+
+	}
+
+
+	/**
+	 * Read characters into a portion of an array. This method will block until
+	 * some input is available, an I/O error occurs, or the end of the stream
+	 * is reached.
+	 *
+	 * @param cbuf The buffer into which to read.
+	 * @param off The offset at which to start storing characters.
+	 * @param len The maximum number of characters to read.
+	 *
+	 * @return The number of characters read, or <code>-1</code> if the end
+	 *         of the stream has been reached.
+	 */
+	public int read(char[] cbuf, int off, int len) throws IOException {
+		return internalIn.read(cbuf, off, len);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/io/UnicodeWriter.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/io/UnicodeWriter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/io/UnicodeWriter.java	(revision 25584)
@@ -0,0 +1,253 @@
+/*
+ * 09/24/2004
+ *
+ * UnicodeWriter.java - Writes Unicode output with the proper BOM.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+
+
+/**
+ * Writes Unicode text to an output stream.  If the specified encoding is a
+ * Unicode, then the text is preceeded by the proper Unicode BOM.  If it is any
+ * other encoding, this class behaves just like <code>OutputStreamWriter</code>.
+ * This class is here because Java's <code>OutputStreamWriter</code> apparently
+ * doesn't believe in writing BOMs.
+ * <p>
+ *
+ * For optimum performance, it is recommended that you wrap all instances of
+ * <code>UnicodeWriter</code> with a <code>java.io.BufferedWriter</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ */
+public class UnicodeWriter extends Writer {
+
+	/**
+	 * If this system property evaluates to "<code>false</code>", ignoring
+	 * case, files written out as UTF-8 will not have a BOM written for them.
+	 * Otherwise (even if the property is not set), UTF-8 files will have a
+	 * BOM written.
+	 */
+	public static final String PROPERTY_WRITE_UTF8_BOM	=
+												"UnicodeWriter.writeUtf8BOM";
+
+
+	/**
+	 * The writer actually doing the writing.
+	 */
+	private OutputStreamWriter internalOut;
+
+	private static final byte[] UTF8_BOM = new byte[] {
+												(byte)0xEF,
+												(byte)0xBB,
+												(byte)0xBF
+											};
+
+	private static final byte[] UTF16LE_BOM = new byte[] { 
+												(byte)0xFF,
+												(byte)0xFE
+											};
+
+	private static final byte[] UTF16BE_BOM = new byte[] {
+												(byte)0xFE,
+												(byte)0xFF
+											};
+
+	private static final byte[] UTF32LE_BOM = new byte[] {
+												(byte)0xFF,
+												(byte)0xFE,
+												(byte)0x00,
+												(byte)0x00
+											};
+
+	private static final byte[] UTF32BE_BOM = new byte[] {
+												(byte)0x00,
+												(byte)0x00,
+												(byte)0xFE,
+												(byte)0xFF
+											};
+
+
+	/**
+	 * This is a utility constructor since the vast majority of the time, this
+	 * class will be used to write Unicode files.
+	 *
+	 * @param fileName The file to which to write the Unicode output.
+	 * @param encoding The encoding to use.
+	 * @throws UnsupportedEncodingException If the specified encoding is not
+	 *         supported.
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public UnicodeWriter(String fileName, String encoding)
+						throws UnsupportedEncodingException, IOException {
+		this(new FileOutputStream(fileName), encoding);
+	}
+
+
+
+	/**
+	 * This is a utility constructor since the vast majority of the time, this
+	 * class will be used to write Unicode files.
+	 *
+	 * @param file The file to which to write the Unicode output.
+	 * @param encoding The encoding to use.
+	 * @throws UnsupportedEncodingException If the specified encoding is not
+	 *         supported.
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public UnicodeWriter(File file, String encoding)
+						throws UnsupportedEncodingException, IOException {
+		this(new FileOutputStream(file), encoding);
+	}
+
+
+
+	/**
+	 * Creates a new writer.
+	 *
+	 * @param out The output stream to write.
+	 * @param encoding The encoding to use.
+	 * @throws UnsupportedEncodingException If the specified encoding is not
+	 *         supported.
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public UnicodeWriter(OutputStream out, String encoding)
+						throws UnsupportedEncodingException, IOException {
+		init(out, encoding);
+	}
+
+
+	/**
+	 * Closes this writer.
+	 *
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public void close() throws IOException {
+		internalOut.close();
+	}
+
+
+	/**
+	 * Flushes the stream.
+	 *
+	 * @throws IOException If an IO exception occurs.
+	 */
+	public void flush() throws IOException {
+		internalOut.flush();
+	}
+
+
+	/**
+	 * Returns the encoding being used to write this output stream (i.e., the
+	 * encoding of the file).
+	 *
+	 * @return The encoding of the stream.
+	 */
+	public String getEncoding() {
+		return internalOut.getEncoding();
+	}
+
+
+	/**
+	 * Returns whether UTF-8 files should have a BOM in them when written.
+	 *
+	 * @return Whether to write a BOM for UTF-8 files.
+	 */
+	public static boolean getWriteUtf8BOM() {
+		String prop = System.getProperty(PROPERTY_WRITE_UTF8_BOM);
+		if (prop!=null && Boolean.valueOf(prop).equals(Boolean.FALSE)) {
+			return false;
+		}
+		return true;
+	}
+
+
+	/**
+	 * Initializes the internal output stream and writes the BOM if the
+	 * specified encoding is a Unicode encoding.
+	 *
+	 * @param out The output stream we are writing.
+	 * @param encoding The encoding in which to write.
+	 * @throws UnsupportedEncodingException If the specified encoding isn't
+	 *         supported.
+	 * @throws IOException If an I/O error occurs while writing a BOM.
+	 */
+	private void init(OutputStream out, String encoding)
+						throws UnsupportedEncodingException, IOException {
+
+		internalOut = new OutputStreamWriter(out, encoding);
+
+		// Write the proper BOM if they specified a Unicode encoding.
+		// NOTE: Creating an OutputStreamWriter with encoding "UTF-16" DOES
+		// DOES write out the BOM; "UTF-16LE", "UTF-16BE", "UTF-32", "UTF-32LE"
+		// and "UTF-32BE" don't.
+		if ("UTF-8".equals(encoding)) {
+			if (getWriteUtf8BOM()) {
+				out.write(UTF8_BOM, 0, UTF8_BOM.length);
+			}
+		}
+		else if ("UTF-16LE".equals(encoding)) {
+			out.write(UTF16LE_BOM, 0, UTF16LE_BOM.length);
+		}
+		else if (/*"UTF-16".equals(encoding) || */"UTF-16BE".equals(encoding)) {
+			out.write(UTF16BE_BOM, 0, UTF16BE_BOM.length);
+		}
+		else if ("UTF-32LE".equals(encoding)) {
+			out.write(UTF32LE_BOM, 0, UTF32LE_BOM.length);
+		}
+		else if ("UTF-32".equals(encoding) || "UTF-32BE".equals(encoding)) {
+			out.write(UTF32BE_BOM, 0, UTF32BE_BOM.length);
+		}
+
+	}
+
+
+	/**
+	 * Writes a portion of an array of characters.
+	 *
+	 * @param cbuf The buffer of characters.
+	 * @param off The offset from which to start writing characters.
+	 * @param len The number of characters to write.
+	 * @throws IOException If an I/O error occurs.
+	 */
+	public void write(char[] cbuf, int off, int len) throws IOException {
+		internalOut.write(cbuf, off, len);
+	}
+
+
+	/**
+	 * Writes a single character.
+	 *
+	 * @param c An integer specifying the character to write.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public void write(int c) throws IOException {
+		internalOut.write(c);
+	}
+
+
+	/**
+	 * Writes a portion of a string.
+	 *
+	 * @param str The string from which to write.
+	 * @param off The offset from which to start writing characters.
+	 * @param len The number of characters to write.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public void write(String str, int off, int len) throws IOException {
+		internalOut.write(str, off, len);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/io/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/io/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/io/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Utility I/O classes.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/print/RPrintUtilities.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/print/RPrintUtilities.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/print/RPrintUtilities.java	(revision 25584)
@@ -0,0 +1,530 @@
+/*
+ * 11/14/2003
+ *
+ * RPrintUtilities.java - A collection of static methods useful for printing
+ * text from Swing text components.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.print;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Segment;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.TabExpander;
+import javax.swing.text.Utilities;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.print.*;
+
+
+
+/**
+ * A collection of static methods useful for printing text from Swing text components.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class RPrintUtilities {
+
+	private static int currentDocLineNumber;		// The line number in the document we are currently on.
+	private static int numDocLines;				// The number of lines in the current document.
+	private static Element rootElement;			// The first Element (line) in the current document.
+
+	// The characters at which to break a line if implementing word wrap.
+	private static final char [] breakChars = { ' ', '\t', ',', '.', ';', '?', '!' };
+
+	// These variables are 'global' because RPrintTabExpander uses them.
+	private static int xOffset;					// The x-offset (for the page margin) when printing.
+	private static int tabSizeInSpaces;			// The length of a tab, in spaces.
+	private static FontMetrics fm;				// The metrics of the font currently being used to print.
+
+
+	/**
+	 * Returns the position closest to, but before, position <code>maxCharsPerLine</code> in
+	 * <code>line</code> of one of the chars in <code>breakChars</code>, or simply returns
+	 * <code>maxCharsPerLine-1</code> if none of the <code>breakChars</code> comes before
+	 * that position.  This position represents the logical line break for this <code>java.lang.String</code>
+	 * if it is being printed in a monospaced font when lines can only be <code>maxCharsPerLine</code>
+	 * characters long.
+	 *
+	 * @param line The text being printed.
+	 * @param maxCharsPerLine Only up-to this many characters from
+	 *        <code>line</code> can be printed on one line.
+	 * @return The logical position at which to stop printing <code>line</code>
+	 *         to simulate word wrap.
+	 */
+	private static int getLineBreakPoint(String line, final int maxCharsPerLine) {
+
+		int breakPoint = -1;
+		for (int i=0; i<breakChars.length; i++) {
+			int breakCharPos = line.lastIndexOf(breakChars[i], maxCharsPerLine-1);
+			if (breakCharPos > breakPoint)
+				breakPoint = breakCharPos;
+		}
+
+		return (breakPoint==-1 ? maxCharsPerLine-1 : breakPoint);
+
+	}
+
+
+	/**
+	 * Prints a <code>Document</code> using a monospaced font, and does no word wrapping (ie,
+	 * words will wrap mid-word to the next line).  This method is expected to be called from
+	 * Printable 'print(Graphics g)' functions.
+	 *
+	 * @param g The graphics context to write to.
+	 * @param doc The <code>javax.swing.text.Document</code> to print.
+	 * @param fontSize the point size to use for the monospaced font.
+	 * @param pageIndex The page number to print.
+	 * @param pageFormat The format to print the page with.
+	 * @param tabSize The number of spaces to expand tabs to.
+	 *
+	 * @see #printDocumentMonospacedWordWrap
+	 */
+	public static int printDocumentMonospaced(Graphics g, Document doc, int fontSize, int pageIndex,
+							PageFormat pageFormat, int tabSize) {
+
+		g.setColor(Color.BLACK);
+		g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
+
+		// Initialize our static variables (these are used by our tab expander below).
+		tabSizeInSpaces = tabSize;
+		fm = g.getFontMetrics();
+
+		// Create our tab expander.
+		//RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+		// Get width and height of characters in this monospaced font.
+		int fontWidth = fm.charWidth('w');	// Any character will do as font is monospaced.
+		int fontHeight = fm.getHeight();
+
+		int MAX_CHARS_PER_LINE = (int)pageFormat.getImageableWidth() / fontWidth;
+		int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+		final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+		// The (x,y) coordinate to print at (in pixels, not characters).
+		// Since y is the baseline of where we'll start printing (not the top-left
+		// corner), we offset it by the font's ascent ( + 1 just for good measure).
+		xOffset = (int)pageFormat.getImageableX();
+		int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+		// A counter to keep track of the number of lines that WOULD HAVE been
+		// printed if we were printing all lines.
+		int numPrintedLines = 0;
+
+		// Keep going while there are more lines in the document.
+		currentDocLineNumber = 0;						// The line number of the document we're currently on.
+		rootElement = doc.getDefaultRootElement();		// To shorten accesses in our loop.
+		numDocLines = rootElement.getElementCount();	// The number of lines in our document.
+		while (currentDocLineNumber<numDocLines) {
+
+			// Get the line we are going to print.
+			String curLineString;
+			Element currentLine = rootElement.getElement(currentDocLineNumber);
+			int startOffs = currentLine.getStartOffset();
+			try {
+				curLineString = doc.getText(startOffs, currentLine.getEndOffset()-startOffs);
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+				return Printable.NO_SUCH_PAGE;
+			}
+
+			// Get rid of newlines, because they end up as boxes if you don't; this is a monospaced font.
+			curLineString = curLineString.replaceAll("\n", "");
+
+			// Replace tabs with how many spaces they should be.
+			if (tabSizeInSpaces == 0) {
+				curLineString = curLineString.replaceAll("\t", "");
+			}
+			else {
+				int tabIndex = curLineString.indexOf('\t');
+				while (tabIndex > -1) {
+					int spacesNeeded = tabSizeInSpaces - (tabIndex % tabSizeInSpaces);
+					String replacementString = "";
+					for (int i=0; i<spacesNeeded; i++)
+						replacementString += ' ';
+					// Note that "\t" is actually a regex for this method.
+					curLineString = curLineString.replaceFirst("\t", replacementString);
+					tabIndex = curLineString.indexOf('\t');
+				}
+			}
+
+			// If this document line is too long to fit on one printed line on the page,
+			// break it up into multpile lines.
+			while (curLineString.length() > MAX_CHARS_PER_LINE) {
+
+				numPrintedLines++;
+				if (numPrintedLines > STARTING_LINE_NUMBER) {
+						g.drawString(curLineString.substring(0,MAX_CHARS_PER_LINE), xOffset,y);
+						y += fontHeight;
+						if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+							return Printable.PAGE_EXISTS;
+	 			}
+
+				curLineString = curLineString.substring(MAX_CHARS_PER_LINE, curLineString.length());
+
+			}
+
+			currentDocLineNumber += 1; // We have printed one more line from the document.
+
+			numPrintedLines++;
+			if (numPrintedLines>STARTING_LINE_NUMBER) {
+				g.drawString(curLineString, xOffset,y);
+				y += fontHeight;
+				if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+					return Printable.PAGE_EXISTS;
+			}
+
+
+		}
+
+		// Now, the whole document has been "printed."  Decide if this page had any text on it or not.
+		if (numPrintedLines > STARTING_LINE_NUMBER)
+			return Printable.PAGE_EXISTS;
+		return Printable.NO_SUCH_PAGE;
+
+	}
+
+
+	/**
+	 * Prints a <code>Document</code> using a monospaced font, word wrapping on
+	 * the characters ' ', '\t', '\n', ',', '.', and ';'.  This method is
+	 * expected to be called from Printable 'print(Graphics g)' functions.
+	 *
+	 * @param g The graphics context to write to.
+	 * @param doc The <code>javax.swing.text.Document</code> to print.
+	 * @param fontSize the point size to use for the monospaced font.
+	 * @param pageIndex The page number to print.
+	 * @param pageFormat The format to print the page with.
+	 * @param tabSize The number of spaces to expand tabs to.
+	 *
+	 * @see #printDocumentMonospaced
+	 */
+	public static int printDocumentMonospacedWordWrap(Graphics g, Document doc,
+								int fontSize, int pageIndex,
+								PageFormat pageFormat, int tabSize) {
+
+		g.setColor(Color.BLACK);
+		g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
+
+		// Initialize our static variables (these are used by our tab expander below).
+		tabSizeInSpaces = tabSize;
+		fm = g.getFontMetrics();
+
+		// Create our tab expander.
+		//RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+		// Get width and height of characters in this monospaced font.
+		int fontWidth = fm.charWidth('w'); 	// Any character will do here, since font is monospaced.
+		int fontHeight = fm.getHeight();
+
+		int MAX_CHARS_PER_LINE = (int)pageFormat.getImageableWidth() / fontWidth;
+		int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+		final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+		// The (x,y) coordinate to print at (in pixels, not characters).
+		// Since y is the baseline of where we'll start printing (not the top-left
+		// corner), we offset it by the font's ascent ( + 1 just for good measure).
+		xOffset = (int)pageFormat.getImageableX();
+		int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+		// A counter to keep track of the number of lines that WOULD HAVE been
+		// printed if we were printing all lines.
+		int numPrintedLines = 0;
+
+		// Keep going while there are more lines in the document.
+		currentDocLineNumber = 0;						// The line number of the document we're currently on.
+		rootElement = doc.getDefaultRootElement();		// To shorten accesses in our loop.
+		numDocLines = rootElement.getElementCount();	// The number of lines in our document.
+		while (currentDocLineNumber<numDocLines) {
+
+			// Get the line we are going to print.
+			String curLineString;
+			Element currentLine = rootElement.getElement(currentDocLineNumber);
+			int startOffs = currentLine.getStartOffset();
+			try {
+				curLineString = doc.getText(startOffs, currentLine.getEndOffset()-startOffs);
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+				return Printable.NO_SUCH_PAGE;
+			}
+
+			// Remove newlines, because they end up as boxes if you don't; this is a monospaced font.
+			curLineString = curLineString.replaceAll("\n", "");
+
+			// Replace tabs with how many spaces they should be.
+			if (tabSizeInSpaces == 0) {
+				curLineString = curLineString.replaceAll("\t", "");
+			}
+			else {
+				int tabIndex = curLineString.indexOf('\t');
+				while (tabIndex > -1) {
+					int spacesNeeded = tabSizeInSpaces - (tabIndex % tabSizeInSpaces);
+					String replacementString = "";
+					for (int i=0; i<spacesNeeded; i++)
+						replacementString += ' ';
+					// Note that "\t" is actually a regex for this method.
+					curLineString = curLineString.replaceFirst("\t", replacementString);
+					tabIndex = curLineString.indexOf('\t');
+				}
+			}
+
+			// If this document line is too long to fit on one printed line on the page,
+			// break it up into multpile lines.
+			while (curLineString.length() > MAX_CHARS_PER_LINE) {
+
+				int breakPoint = getLineBreakPoint(curLineString, MAX_CHARS_PER_LINE) + 1;
+
+				numPrintedLines++;
+				if (numPrintedLines > STARTING_LINE_NUMBER) {
+						g.drawString(curLineString.substring(0,breakPoint), xOffset,y);
+						y += fontHeight;
+						if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+							return Printable.PAGE_EXISTS;
+	 			}
+
+				curLineString = curLineString.substring(breakPoint, curLineString.length());
+
+			}
+
+			currentDocLineNumber += 1; // We have printed one more line from the document.
+
+			numPrintedLines++;
+			if (numPrintedLines>STARTING_LINE_NUMBER) {
+				g.drawString(curLineString, xOffset,y);
+				y += fontHeight;
+				if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+					return Printable.PAGE_EXISTS;
+			}
+
+
+		}
+
+		// Now, the whole document has been "printed."  Decide if this page had any text on it or not.
+		if (numPrintedLines > STARTING_LINE_NUMBER)
+			return Printable.PAGE_EXISTS;
+		return Printable.NO_SUCH_PAGE;
+
+	}
+
+
+	/**
+	 * Prints a <code>Document</code> using the specified font, word wrapping
+	 * on the characters ' ', '\t', '\n', ',', '.', and ';'.  This method is
+	 * expected to be called from Printable 'print(Graphics g)' functions.
+	 *
+	 * @param g The graphics context to write to.
+	 * @param textComponent The <code>javax.swing.text.JTextComponent</code>
+	 *        whose text you're printing.
+	 * @param font The font to use for printing.  If <code>null</code>, then
+	 *        <code>textComponent</code>'s font is used.
+	 * @param pageIndex The page number to print.
+	 * @param pageFormat The format to print the page with.
+	 * @param tabSize The number of spaces to convert tabs to.
+	 *
+	 */
+	public static int printDocumentWordWrap(Graphics g, JTextComponent textComponent,
+										Font font, int pageIndex,
+										PageFormat pageFormat,
+										int tabSize) {
+
+		// Initialize our graphics object.
+		g.setColor(Color.BLACK);
+		g.setFont(font!=null ? font : textComponent.getFont());
+
+		// Initialize our static variables (these are used by our tab expander below).
+		tabSizeInSpaces = tabSize;
+		fm = g.getFontMetrics();
+		int fontHeight = fm.getHeight();
+
+		final int LINE_LENGTH_IN_PIXELS = (int)pageFormat.getImageableWidth();
+		final int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+		final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+		// Create our tab expander.
+		RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+		// The (x,y) coordinate to print at (in pixels, not characters).
+		// Since y is the baseline of where we'll start printing (not the top-left
+		// corner), we offset it by the font's ascent ( + 1 just for good measure).
+		xOffset = (int)pageFormat.getImageableX();
+		int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+		// A counter to keep track of the number of lines that WOULD HAVE been
+		// printed if we were printing all lines.
+		int numPrintedLines = 0;
+
+		// Keep going while there are more lines in the document.
+		Document doc = textComponent.getDocument();
+		rootElement = doc.getDefaultRootElement();
+		numDocLines = rootElement.getElementCount();		// The number of lines in our document.
+		currentDocLineNumber = 0;					// The line number of the document we're currently on.
+		int startingOffset = 0;						// Used when a line is so long it has to be wrapped.
+		while (currentDocLineNumber<numDocLines) {
+
+			Segment currentLineSeg = new Segment();
+
+			// Get the current line (as an Element), and its starting and ending offset in doc.
+			Element currentLine  = rootElement.getElement(currentDocLineNumber);
+			int currentLineStart = currentLine.getStartOffset();
+			int currentLineEnd   = currentLine.getEndOffset();
+
+			// Put the chars of this line in currentLineSeg, but only starting at our desired offset
+			// (because this line may be the second part of a wrapped line, so we'd start after the part
+			// that has already been printed).
+			try {
+				doc.getText(currentLineStart+startingOffset, currentLineEnd-(currentLineStart+startingOffset),
+							currentLineSeg);
+			} catch (BadLocationException ble) {
+				System.err.println("BadLocationException in print (where there shouldn't be one!): " + ble);
+				return Printable.NO_SUCH_PAGE;
+			}
+
+			// Remove any spaces and/or tabs from the end of the segment (would cause problems if you left 'em).
+			currentLineSeg = removeEndingWhitespace(currentLineSeg);
+
+			// Figger out how long the line is, in pixels.
+			int currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+
+//System.err.println("'" + currentLineSeg + "' - " + currentLineLengthInPixels + "/" + LINE_LENGTH_IN_PIXELS);
+			// If it'll fit by itself on a printed line, great.
+			if (currentLineLengthInPixels <= LINE_LENGTH_IN_PIXELS) {
+				currentDocLineNumber += 1; 	// We (will) have printed one more line from the document.
+				startingOffset = 0;			// Start at the first character in the new document line.
+			}
+
+			// If it won't fit on a printed line by itself (i.e., it needs to be wrapped)...
+			else {
+
+				// Loop while the current line is too long to fit on a printed line.
+				int currentPos = -1;
+				while (currentLineLengthInPixels > LINE_LENGTH_IN_PIXELS) {
+
+//System.err.println("'" + currentLineSeg + "' - " + currentLineLengthInPixels + "/" + LINE_LENGTH_IN_PIXELS);
+
+					// Remove any spaces and/or tabs from the end of the segment (would cause problems if you left 'em).
+					currentLineSeg = removeEndingWhitespace(currentLineSeg);
+
+					// currentPos will be the last position in the current text of a "line break character."
+					currentPos = -1;
+					String currentLineString = currentLineSeg.toString();
+					for (int i=0; i<breakChars.length; i++) {
+						// "+1" below so we include the character on the line.
+						int pos = currentLineString.lastIndexOf(breakChars[i]) + 1;
+						//if (pos>-1 && pos>currentPos)
+						//	currentPos = pos;
+						if (pos>0 && pos>currentPos & pos!=currentLineString.length())
+							currentPos = pos;
+					}
+
+					// If we didn't find a line break character, we'll simply break the line at
+					// the last character that fits on a printed line.
+					// So here, we set currentPos to be the position of the last character that fits
+					// on the current printed line.
+					if (currentPos == -1) {
+
+						// Fix currentLineSeg so that it contains exactly enough text to fit in
+						// LINE_LENGTH_IN_PIXELS pixels...
+						currentPos = 0;
+						do {
+							currentPos++;
+							try {
+								doc.getText(currentLineStart+startingOffset, currentPos, currentLineSeg);
+							} catch (BadLocationException ble) {
+								System.err.println(ble);
+								return Printable.NO_SUCH_PAGE;
+							}
+							currentLineLengthInPixels = Utilities.
+								getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+						} while (currentLineLengthInPixels <= LINE_LENGTH_IN_PIXELS);
+						currentPos--;
+
+					}
+
+					try {
+						doc.getText((currentLineStart+startingOffset), currentPos, currentLineSeg);
+					} catch (BadLocationException ble) {
+						System.err.println("BadLocationException in print (a):");
+						System.err.println("==> currentLineStart: " + currentLineStart +
+									"; startingOffset: " + startingOffset + "; currentPos: " + currentPos);
+						System.err.println("==> Range: " + (currentLineStart+startingOffset) + " - " +
+									(currentLineStart+startingOffset+currentPos));
+						ble.printStackTrace();
+						return Printable.NO_SUCH_PAGE;
+					}
+
+					currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+				} // End of while (currentLineLengthInPixels > LINE_LENGTH_IN_PIXELS).
+
+				startingOffset += currentPos;	// Where to start (offset from line's start), since this line wraps.
+
+			} // End of else.
+
+			numPrintedLines++;
+			if (numPrintedLines>STARTING_LINE_NUMBER) {
+				//g.drawString(currentLineSeg.toString(), xOffset,y);
+				Utilities.drawTabbedText(currentLineSeg, xOffset,y, g, tabExpander, 0);
+				y += fontHeight;
+				if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+					return Printable.PAGE_EXISTS;
+			}
+
+		}
+
+		// Now, the whole document has been "printed."  Decide if this page had any text on it or not.
+		if (numPrintedLines > STARTING_LINE_NUMBER)
+			return Printable.PAGE_EXISTS;
+		return Printable.NO_SUCH_PAGE;
+
+	}
+
+
+	/**
+	 * Removes any spaces or tabs from the end of the segment.
+	 *
+	 * @param segment The segment from which to remove tailing whitespace.
+	 * @return <code>segment</code> with trailing whitespace removed.
+	 */
+	private static Segment removeEndingWhitespace(Segment segment) {
+		int toTrim = 0;
+		char currentChar = segment.setIndex(segment.getEndIndex()-1);
+		while ((currentChar==' ' || currentChar=='\t') && currentChar!=Segment.DONE) {
+			toTrim++;
+			currentChar = segment.previous();
+		}
+		String stringVal = segment.toString();
+		String newStringVal = stringVal.substring(0,stringVal.length()-toTrim);
+		return new Segment(newStringVal.toCharArray(), 0, newStringVal.length());
+	}
+
+
+	/**
+	 * A tab expander for the document currently being printed with the
+	 * font being used for the printing.
+	 */
+	private static class RPrintTabExpander implements TabExpander {
+
+		RPrintTabExpander() {
+		}
+
+		public float nextTabStop(float x, int tabOffset) {
+			if (tabSizeInSpaces == 0)
+				return x;
+			int tabSizeInPixels = tabSizeInSpaces * fm.charWidth(' ');
+			int ntabs = (((int) x) - xOffset) / tabSizeInPixels;
+			return xOffset + ((ntabs + 1) * tabSizeInPixels);
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/print/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/print/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/print/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Utility methods for printing text in a <code>JTextComponent</code>.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java	(revision 25584)
@@ -0,0 +1,219 @@
+/*
+ * 01/25/2009
+ *
+ * AbstractJFlexCTokenMaker.java - Base class for token makers that use curly
+ * braces to denote code blocks, such as C, C++, Java, Perl, etc.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.ActionEvent;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.swing.Action;
+import javax.swing.UIManager;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rtextarea.RTextArea;
+
+
+
+/**
+ * Base class for JFlex-based token makers using C-style syntax.  This class
+ * knows how to auto-indent after opening braces and parens.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
+
+	protected static final Action INSERT_BREAK_ACTION = new InsertBreakAction();
+
+
+	/**
+	 * Returns <code>true</code> always as C-style languages use curly braces
+	 * to denote code blocks.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	/**
+	 * Returns an action to handle "insert break" key presses (i.e. Enter).
+	 * An action is returned that handles newlines differently in multi-line
+	 * comments.
+	 *
+	 * @return The action.
+	 */
+	public Action getInsertBreakAction() {
+		return INSERT_BREAK_ACTION;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.FUNCTION;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getShouldIndentNextLineAfter(Token t) {
+		if (t!=null && t.textCount==1) {
+			char ch = t.text[t.textOffset];
+			return ch=='{' || ch=='(';
+		}
+		return false;
+	}
+
+
+	/**
+	 * Action that knows how to special-case inserting a newline in a
+	 * multi-line comment for languages like C and Java.
+	 */
+	private static class InsertBreakAction extends
+							RSyntaxTextAreaEditorKit.InsertBreakAction {
+
+		private static final Pattern p =
+							Pattern.compile("([ \\t]*)(/?[\\*]+)([ \\t]*)");
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)getTextComponent(e);
+			RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+
+			int line = textArea.getCaretLineNumber();
+			int type = doc.getLastTokenTypeOnLine(line);
+
+			// Only in MLC's should we try this
+			if (type==Token.COMMENT_DOCUMENTATION ||
+					type==Token.COMMENT_MULTILINE) {
+				insertBreakInMLC(e, rsta, line);
+			}
+			else {
+				handleInsertBreak(rsta, true);
+			}
+
+		}
+
+
+		/**
+		 * Returns whether the MLC token containing <code>offs</code> appears
+		 * to have a "nested" comment (i.e., contains "<code>/*</code>"
+		 * somewhere inside of it).  This implies that it is likely a "new" MLC
+		 * and needs to be closed.  While not foolproof, this is usually good
+		 * enough of a sign.
+		 *
+		 * @param textArea
+		 * @param line
+		 * @param offs
+		 * @return Whether a comment appears to be nested inside this one.
+		 */
+		private boolean appearsNested(RSyntaxTextArea textArea,
+						int line, int offs) {
+
+			final int firstLine = line; // Remember the line we start at.
+
+			while (line<textArea.getLineCount()) {
+				Token t = textArea.getTokenListForLine(line);
+				int i = 0;
+				// If examining the first line, start at offs.
+				if (line++==firstLine) {
+					t = RSyntaxUtilities.getTokenAtOffset(t, offs);
+					if (t==null) { // offs was at end of the line
+						continue;
+					}
+					i = t.documentToToken(offs);
+				}
+				else {
+					i = t.textOffset;
+				}
+				while (i<t.textOffset+t.textCount-1) {
+					if (t.text[i]=='/' && t.text[i+1]=='*') {
+						return true;
+					}
+					i++;
+				}
+				// If tokens come after this one on this line, our MLC ended.
+				if (t.getNextToken()!=null) {
+					return false;
+				}
+			}
+
+			return true; // No match - MLC goes to the end of the file
+
+		}
+
+		private void insertBreakInMLC(ActionEvent e, RSyntaxTextArea textArea,
+										int line) {
+
+			Matcher m = null;
+			int start = -1;
+			int end = -1;
+			try {
+				start = textArea.getLineStartOffset(line);
+				end = textArea.getLineEndOffset(line);
+				String text = textArea.getText(start, end-start);
+				m = p.matcher(text);
+			} catch (BadLocationException ble) { // Never happens
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				ble.printStackTrace();
+				return;
+			}
+
+			if (m.lookingAt()) {
+
+				String leadingWS = m.group(1);
+				String mlcMarker = m.group(2);
+
+				// If the caret is "inside" any leading whitespace or MLC
+				// marker, move it to the end of the line.
+				int dot = textArea.getCaretPosition();
+				if (dot>=start &&
+						dot<start+leadingWS.length()+mlcMarker.length()) {
+					// If we're in the whitespace before the very start of the
+					// MLC though, just insert a normal newline
+					if (mlcMarker.charAt(0)=='/') {
+						handleInsertBreak(textArea, true);
+						return;
+					}
+					textArea.setCaretPosition(end-1);
+				}
+
+				boolean firstMlcLine = mlcMarker.charAt(0)=='/';
+				boolean nested = appearsNested(textArea, line,
+												start+leadingWS.length()+2);
+				String header = leadingWS +
+						(firstMlcLine ? " * " : "*") +
+						m.group(3);
+				textArea.replaceSelection("\n" + header);
+				if (nested) {
+					dot = textArea.getCaretPosition(); // Has changed
+					textArea.insert("\n" + leadingWS + " */", dot);
+					textArea.setCaretPosition(dot);
+				}
+
+			}
+			else {
+				handleInsertBreak(textArea, true);
+			}
+
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java	(revision 25584)
@@ -0,0 +1,32 @@
+/*
+ * 03/23/2005
+ *
+ * AbstractJFlexTokenMaker.java - Base class for token makers generated from
+ * programs such as JFlex.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * Base class for JFlex-generated token makers.  This class attempts to factor
+ * out all common code from these classes.  Many methods <em>almost</em> could
+ * be factored out into this class, but cannot because they reference JFlex
+ * variables that we cannot access from this class.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public abstract class AbstractJFlexTokenMaker extends TokenMakerBase {
+
+	protected Segment s;
+
+	protected int start;		// Just for states.
+	protected int offsetShift;	// As parser always starts at 0, but our line doesn't.
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java	(revision 25584)
@@ -0,0 +1,67 @@
+/*
+ * 11/07/2004
+ *
+ * AbstractTokenMaker.java - An abstract implementation of TokenMaker.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An abstract implementation of the
+ * {@link org.fife.ui.rsyntaxtextarea.TokenMaker} interface.  It should
+ * be overridden for every language for which you want to provide
+ * syntax highlighting.<p>
+ *
+ * @see Token
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public abstract class AbstractTokenMaker extends TokenMakerBase {
+
+	/**
+	 * Hash table of words to highlight and what token type they are.
+	 * The keys are the words to highlight, and their values are the
+	 * token types, for example, <code>Token.RESERVED_WORD</code> or
+	 * <code>Token.FUNCTION</code>.
+	 */
+	protected TokenMap wordsToHighlight;
+
+
+	/**
+	 * Constructor.
+	 */
+	public AbstractTokenMaker() {
+		wordsToHighlight = getWordsToHighlight();
+	}
+
+
+	/**
+	 * Returns the words to highlight for this programming language.
+	 *
+	 * @return A <code>TokenMap</code> containing the words to highlight for
+	 *         this programming language.
+	 */
+	public abstract TokenMap getWordsToHighlight();
+
+
+	/**
+	 * Removes the token last added from the linked list of tokens.  The
+	 * programmer should never have to call this directly; it can be called
+	 * by subclasses of <code>TokenMaker</code> if necessary.
+	 */
+	public void removeLastToken() {
+		if (previousToken==null) {
+			firstToken = currentToken = null;
+		}
+		else {
+			currentToken = previousToken;
+			currentToken.setNextToken(null);
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java	(revision 25584)
@@ -0,0 +1,98 @@
+/*
+ * 12/14/08
+ *
+ * AbstractTokenMakerFactory.java - Base class for TokenMaker implementations.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Base class for {@link TokenMakerFactory} implementations.  A
+ * <code>java.util.Map</code> maps keys to the names of {@link TokenMaker}
+ * classes.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
+
+	/**
+	 * A mapping from keys to the names of {@link TokenMaker} implementation
+	 * class names.  When {@link #getTokenMaker(String)} is called with a key
+	 * defined in this map, a <code>TokenMaker</code> of the corresponding type
+	 * is returned.
+	 */
+	private Map tokenMakerMap;
+
+
+	/**
+	 * Constructor.
+	 */
+	protected AbstractTokenMakerFactory() {
+		tokenMakerMap = createTokenMakerKeyToClassNameMap();
+	}
+
+
+
+	/**
+	 * Creates and returns a mapping from keys to the names of
+	 * {@link TokenMaker} implementation classes.  When
+	 * {@link #getTokenMaker(String)} is called with a key defined in this
+	 * map, a <code>TokenMaker</code> of the corresponding type is returned.
+	 *
+	 * @return The map.
+	 */
+	protected abstract Map createTokenMakerKeyToClassNameMap();
+
+
+	/**
+	 * Returns a {@link TokenMaker} for the specified key.
+	 *
+	 * @param key The key.
+	 * @return The corresponding <code>TokenMaker</code>, or <code>null</code>
+	 *         if none matches the specified key.
+	 */
+	protected TokenMaker getTokenMakerImpl(String key) {
+		String clazz = (String)tokenMakerMap.get(key);
+		if (clazz!=null) {
+			try {
+				return (TokenMaker)Class.forName(clazz).newInstance();
+			} catch (RuntimeException re) { // FindBugs
+				throw re;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return null;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Set keySet() {
+		return tokenMakerMap.keySet();
+	}
+
+
+	/**
+	 * Adds a mapping from a key to a <code>TokenMaker</code> implementation
+	 * class name.
+	 *
+	 * @param key The key.
+	 * @param className The <code>TokenMaker</code> class name.
+	 * @return The previous value for the specified key, or <code>null</code>
+	 *         if there was none.
+	 */
+	public String putMapping(String key, String className) {
+		return (String)tokenMakerMap.put(key, className);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java	(revision 25584)
@@ -0,0 +1,68 @@
+/*
+ * 02/06/2011
+ *
+ * ActiveLineRangeEvent.java - Notifies listeners of an "active line range"
+ * change in an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.EventObject;
+
+
+/**
+ * The event fired by {@link RSyntaxTextArea}s when the active line range
+ * changes.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class ActiveLineRangeEvent extends EventObject {
+
+	private int min;
+	private int max;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param source The text area.
+	 * @param min The first line in the active line range, or
+	 *        <code>-1</code> if the line range is being cleared.
+	 * @param max The last line in the active line range, or
+	 *        <code>-1</code> if the line range is being cleared.
+	 */
+	public ActiveLineRangeEvent(RSyntaxTextArea source, int min, int max) {
+		super(source);
+		this.min = min;
+		this.max = max;
+	}
+
+
+	/**
+	 * Returns the last line in the active line range.
+	 *
+	 * @return The last line, or <code>-1</code> if the range is being
+	 *         cleared.
+	 * @see #getMin()
+	 */
+	public int getMax() {
+		return max;
+	}
+
+
+	/**
+	 * Returns the first line in the active line range.
+	 *
+	 * @return The first line, or <code>-1</code> if the range is being
+	 *         cleared.
+	 * @see #getMax()
+	 */
+	public int getMin() {
+		return min;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java	(revision 25584)
@@ -0,0 +1,44 @@
+/*
+ * 02/06/2011
+ *
+ * ActiveLineRangeListener.java - Listens for "active line range" changes
+ * in an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.EventListener;
+
+
+/**
+ * Listens for "active line range" events from an <code>RSyntaxTextArea</code>.
+ * If a text area contains some semantic knowledge of the programming language
+ * being edited, it may broadcast {@link ActiveLineRangeEvent}s whenever the
+ * caret moves into a new "block" of code.  Listeners can listen for these
+ * events and respond accordingly.<p>
+ * 
+ * See the <code>RSTALanguageSupport</code> project at
+ * <a href="http://fifesoft.com">http://fifesoft.com</a> for some
+ * <code>LanguageSupport</code> implementations that may broadcast these
+ * events.  Note that if an RSTA/LanguageSupport does not support broadcasting
+ * these events, the listener will simply never receive any notifications.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ActiveLineRangeListener extends EventListener {
+
+
+	/**
+	 * Called whenever the "active line range" changes.
+	 *
+	 * @param e Information about the line range change.  If there is no longer
+	 *        an "active line range," the "minimum" and "maximum" line values
+	 *        should both be <code>-1</code>.
+	 */
+	public void activeLineRangeChanged(ActiveLineRangeEvent e);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java	(revision 25584)
@@ -0,0 +1,67 @@
+/*
+ * 07/23/2009
+ *
+ * ChangeableColorHighlightPainter.java - A highlighter whose color you can
+ * change.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
+
+
+/**
+ * A highlighter whose color you can change.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class ChangeableColorHighlightPainter extends DefaultHighlightPainter {
+
+	/**
+	 * DefaultHighlightPainter doesn't allow changing color, so we must cache
+	 * ours here.
+	 */
+	private Color color;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param color The initial color to use.  This cannot be <code>null</code>.
+	 */
+	public ChangeableColorHighlightPainter(Color color) {
+		super(color);
+		setColor(color);
+	}
+
+
+	/**
+	 * Returns the color to paint with.
+	 *
+	 * @return The color.
+	 * @see #setColor(Color)
+	 */
+	public Color getColor() {
+		return color;
+	}
+
+
+	/**
+	 * Sets the color to paint the bounding boxes with.
+	 *
+	 * @param color The new color.  This cannot be <code>null</code>.
+	 * @see #getColor()
+	 */
+	public void setColor(Color color) {
+		if (color==null) {
+			throw new IllegalArgumentException("color cannot be null");
+		}
+		this.color = color;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java	(revision 25584)
@@ -0,0 +1,470 @@
+/*
+ * 02/21/2005
+ *
+ * CodeTemplateManager.java - manages code templates.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.*;
+import javax.swing.KeyStroke;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.templates.CodeTemplate;
+
+
+/**
+ * Manages "code templates."<p>
+ *
+ * All methods in this class are synchronized for thread safety, but as a
+ * best practice, you should probably only modify the templates known to a
+ * <code>CodeTemplateManager</code> on the EDT.  Modifying a
+ * <code>CodeTemplate</code> retrieved from a <code>CodeTemplateManager</code>
+ * while <em>not</em> on the EDT could cause problems.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class CodeTemplateManager {
+
+	private int maxTemplateIDLength;
+	private List templates;
+
+	private KeyStroke insertTrigger;
+	private String insertTriggerString;
+	private Segment s;
+	private TemplateComparator comparator;
+	private File directory;
+
+	private static final int mask = InputEvent.CTRL_MASK|InputEvent.SHIFT_MASK;
+	static final KeyStroke TEMPLATE_KEYSTROKE = KeyStroke.
+								getKeyStroke(KeyEvent.VK_SPACE, mask);
+
+
+	/**
+	 * Constructor.
+	 */
+	public CodeTemplateManager() {
+
+		// Default insert trigger is a space.
+		// FIXME:  See notes in RSyntaxTextAreaDefaultInputMap.
+		setInsertTrigger(TEMPLATE_KEYSTROKE);
+
+		s = new Segment();
+		comparator = new TemplateComparator();
+		templates = new ArrayList();
+
+	}
+
+
+	/**
+	 * Registers the specified template with this template manager.
+	 *
+	 * @param template The template to register.
+	 * @throws IllegalArgumentException If <code>template</code> is
+	 *         <code>null</code>.
+	 * @see #removeTemplate(CodeTemplate)
+	 * @see #removeTemplate(String)
+	 */
+	public synchronized void addTemplate(CodeTemplate template) {
+		if (template==null) {
+			throw new IllegalArgumentException("template cannot be null");
+		}
+		templates.add(template);
+		sortTemplates();
+	}
+
+
+	/**
+	 * Returns the keystroke that is the "insert trigger" for templates;
+	 * that is, the character that, when inserted into an instance of
+	 * <code>RSyntaxTextArea</code>, triggers the search for
+	 * a template matching the token ending at the caret position.
+	 *
+	 * @return The insert trigger.
+	 * @see #getInsertTriggerString()
+	 * @see #setInsertTrigger(KeyStroke)
+	 */
+	/*
+	 * FIXME:  This text IS what's inserted if the trigger character is pressed
+	 * in a text area but no template matches, but it is NOT the trigger
+	 * character used in the text areas.  This is because space (" ") is
+	 * hard-coded into RSyntaxTextAreaDefaultInputMap.java.  We need to make
+	 * this dynamic somehow.  See RSyntaxTextAreaDefaultInputMap.java.
+	 */
+	public KeyStroke getInsertTrigger() {
+		return insertTrigger;
+	}
+
+
+	/**
+	 * Returns the "insert trigger" for templates; that is, the character
+	 * that, when inserted into an instance of <code>RSyntaxTextArea</code>,
+	 * triggers the search for a template matching the token ending at the
+	 * caret position.
+	 *
+	 * @return The insert trigger character.
+	 * @see #getInsertTrigger()
+	 * @see #setInsertTrigger(KeyStroke)
+	 */
+	/*
+	 * FIXME:  This text IS what's inserted if the trigger character is pressed
+	 * in a text area but no template matches, but it is NOT the trigger
+	 * character used in the text areas.  This is because space (" ") is
+	 * hard-coded into RSyntaxTextAreaDefaultInputMap.java.  We need to make
+	 * this dynamic somehow.  See RSyntaxTextAreaDefaultInputMap.java.
+	 */
+	public String getInsertTriggerString() {
+		return insertTriggerString;
+	}
+
+
+	/**
+	 * Returns the template that should be inserted at the current caret
+	 * position, assuming the trigger character was pressed.
+	 *
+	 * @param textArea The text area that's getting text inserted into it.
+	 * @return A template that should be inserted, if appropriate, or
+	 *         <code>null</code> if no template should be inserted.
+	 */
+	public synchronized CodeTemplate getTemplate(RSyntaxTextArea textArea) {
+		int caretPos = textArea.getCaretPosition();
+		int charsToGet = Math.min(caretPos, maxTemplateIDLength);
+		try {
+			Document doc = textArea.getDocument();
+			doc.getText(caretPos-charsToGet, charsToGet, s);
+			int index = Collections.binarySearch(templates, s, comparator);
+			return index>=0 ? (CodeTemplate)templates.get(index) : null;
+		} catch (BadLocationException ble) {
+			ble.printStackTrace();
+			throw new InternalError("Error in CodeTemplateManager");
+		}
+	}
+
+
+	/**
+	 * Returns the number of templates this manager knows about.
+	 *
+	 * @return The template count.
+	 */
+	public synchronized int getTemplateCount() {
+		return templates.size();
+	}
+
+
+	/**
+	 * Returns the templates currently available.
+	 *
+	 * @return The templates available.
+	 */
+	public synchronized CodeTemplate[] getTemplates() {
+		CodeTemplate[] temp = new CodeTemplate[templates.size()];
+		return (CodeTemplate[])templates.toArray(temp);
+	}
+
+
+	/**
+	 * Returns whether the specified character is a valid character for a
+	 * <code>CodeTemplate</code> id.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether the character is a valid template character.
+	 */
+	public static final boolean isValidChar(char ch) {
+		return RSyntaxUtilities.isLetterOrDigit(ch) || ch=='_';
+	}
+
+
+	/**
+	 * Returns the specified code template.
+	 *
+	 * @param template The template to remove.
+	 * @return <code>true</code> if the template was removed, <code>false</code>
+	 *         if the template was not in this template manager.
+	 * @throws IllegalArgumentException If <code>template</code> is
+	 *         <code>null</code>.
+	 * @see #removeTemplate(String)
+	 * @see #addTemplate(CodeTemplate)
+	 */
+	public synchronized boolean removeTemplate(CodeTemplate template) {
+
+		if (template==null) {
+			throw new IllegalArgumentException("template cannot be null");
+		}
+
+		// TODO: Do a binary search
+		return templates.remove(template);
+
+	}
+
+
+	/**
+	 * Returns the code template with the specified id.
+	 *
+	 * @param id The id to check for.
+	 * @return The code template that was removed, or <code>null</code> if
+	 *         there was no template with the specified ID.
+	 * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+	 * @see #removeTemplate(CodeTemplate)
+	 * @see #addTemplate(CodeTemplate)
+	 */
+	public synchronized CodeTemplate removeTemplate(String id) {
+
+		if (id==null) {
+			throw new IllegalArgumentException("id cannot be null");
+		}
+
+		// TODO: Do a binary search
+		for (Iterator i=templates.iterator(); i.hasNext(); ) {
+			CodeTemplate template = (CodeTemplate)i.next();
+			if (id.equals(template.getID())) {
+				i.remove();
+				return template;
+			}
+		}
+
+		return null;
+
+	}
+
+
+	/**
+	 * Replaces the current set of available templates with the ones
+	 * specified.
+	 *
+	 * @param newTemplates The new set of templates.  Note that we will
+	 *        be taking a shallow copy of these and sorting them.
+	 */
+	public synchronized void replaceTemplates(CodeTemplate[] newTemplates) {
+		templates.clear();
+		if (newTemplates!=null) {
+			for (int i=0; i<newTemplates.length; i++) {
+				templates.add(newTemplates[i]);
+			}
+		}
+		sortTemplates(); // Also recomputes maxTemplateIDLength.
+	}
+
+
+	/**
+	 * Saves all templates as XML files in the current template directory.
+	 *
+	 * @return Whether or not the save was successful.
+	 */
+	public synchronized boolean saveTemplates() {
+
+		if (templates==null)
+			return true;
+		if (directory==null || !directory.isDirectory())
+			return false;
+
+		// Blow away all old XML files to start anew, as some might be from
+		// templates we're removed from the template manager.
+		File[] oldXMLFiles = directory.listFiles(new XMLFileFilter());
+		if (oldXMLFiles==null)
+			return false; // Either an IOException or it isn't a directory.
+		int count = oldXMLFiles.length;
+		for (int i=0; i<count; i++) {
+			/*boolean deleted = */oldXMLFiles[i].delete();
+		}
+
+		// Save all current templates as XML.
+		boolean wasSuccessful = true;
+		for (Iterator i=templates.iterator(); i.hasNext(); ) {
+			CodeTemplate template = (CodeTemplate)i.next();
+			File xmlFile = new File(directory, template.getID() + ".xml");
+			try {
+				XMLEncoder e = new XMLEncoder(new BufferedOutputStream(
+										new FileOutputStream(xmlFile)));
+				e.writeObject(template);
+				e.close();
+			} catch (IOException ioe) {
+				ioe.printStackTrace();
+				wasSuccessful = false;
+			}
+		}
+
+		return wasSuccessful;
+
+	}
+
+
+	/**
+	 * Sets the "trigger" character for templates.
+	 *
+	 * @param trigger The trigger character to set for templates.  This means
+	 *        that when this character is pressed in an
+	 *        <code>RSyntaxTextArea</code>,  the last-typed token is found,
+	 *        and is checked against all template ID's to see if a template
+	 *        should be inserted.  If a template ID matches, that template is
+	 *        inserted; if not, the trigger character is inserted.  If this
+	 *        parameter is <code>null</code>, no change is made to the trigger
+	 *        character.
+	 * @see #getInsertTrigger()
+	 * @see #getInsertTriggerString()
+	 */
+	/*
+	 * FIXME:  The trigger set here IS inserted when no matching template
+	 * is found, but a space character (" ") is always used as the "trigger"
+	 * to look for templates.  This is because it is hard-coded in
+	 * RSyntaxTextArea's input map this way.  We need to change this.
+	 * See RSyntaxTextAreaDefaultInputMap.java.
+	 */
+	public void setInsertTrigger(KeyStroke trigger) {
+		if (trigger!=null) {
+			insertTrigger = trigger;
+			insertTriggerString = Character.toString(trigger.getKeyChar());
+		}
+	}
+
+
+	/**
+	 * Sets the directory in which to look for templates.  Calling this
+	 * method adds any new templates found in the specified directory to
+	 * the templates already registered.
+	 *
+	 * @param dir The new directory in which to look for templates.
+	 * @return The new number of templates in this template manager, or
+	 *         <code>-1</code> if the specified directory does not exist.
+	 */
+	public synchronized int setTemplateDirectory(File dir) {
+
+		if (dir!=null && dir.isDirectory()) {
+
+			this.directory = dir;
+
+			File[] files = dir.listFiles(new XMLFileFilter());
+			int newCount = files==null ? 0 : files.length;
+			int oldCount = templates.size();
+
+			List temp = new ArrayList(oldCount+newCount);
+			temp.addAll(templates);
+
+			for (int i=0; i<newCount; i++) {
+				try {
+					XMLDecoder d = new XMLDecoder(new BufferedInputStream(
+						new FileInputStream(files[i])));
+					Object obj = d.readObject();
+					if (!(obj instanceof CodeTemplate)) {
+						throw new IOException("Not a CodeTemplate: " +
+										files[i].getAbsolutePath());
+					}
+					temp.add(obj);
+					d.close();
+				} catch (/*IO, NoSuchElement*/Exception e) {
+					// NoSuchElementException can be thrown when reading
+					// an XML file not in the format expected by XMLDecoder.
+					// (e.g. CodeTemplates in an old format).
+					e.printStackTrace();
+				}
+			}
+			templates = temp;
+			sortTemplates();
+
+			return getTemplateCount();
+
+		}
+
+		return -1;
+
+	}
+
+
+	/**
+	 * Removes any null entries in the current set of templates (if
+	 * any), sorts the remaining templates, and computes the new
+	 * maximum template ID length.
+	 */
+	private synchronized void sortTemplates() {
+
+		// Get the maximum length of a template ID.
+		maxTemplateIDLength = 0;
+
+		// Remove any null entries (should only happen because of
+		// IOExceptions, etc. when loading from files), and sort
+		// the remaining list.
+		for (Iterator i=templates.iterator(); i.hasNext(); ) {
+			CodeTemplate temp = (CodeTemplate)i.next();
+			if (temp==null || temp.getID()==null) {
+				i.remove();
+			}
+			else {
+				maxTemplateIDLength = Math.max(maxTemplateIDLength,
+										temp.getID().length());
+			}
+		}
+
+		Collections.sort(templates);
+
+	}
+
+
+	/**
+	 * A comparator that takes a <code>CodeTemplate</code> as its first
+	 * parameter and a <code>Segment</code> as its second, and knows
+	 * to compare the template's ID to the segment's text.
+	 */
+	private static class TemplateComparator implements Comparator, Serializable{
+
+		public int compare(Object template, Object segment) {
+
+			// Get template start index (0) and length.
+			CodeTemplate t = (CodeTemplate)template;
+			final char[] templateArray = t.getID().toCharArray();
+			int i = 0;
+			int len1 = templateArray.length;
+
+			// Find "token" part of segment and get its offset and length.
+			Segment s = (Segment)segment;
+			char[] segArray = s.array;
+			int len2 = s.count;
+			int j = s.offset + len2 - 1;
+			while (j>=s.offset && isValidChar(segArray[j])) {
+				j--;
+			}
+			j++;
+			int segShift = j - s.offset;
+			len2 -= segShift;
+
+			int n = Math.min(len1, len2);
+			while (n-- != 0) {
+				char c1 = templateArray[i++];
+				char c2 = segArray[j++];
+				if (c1 != c2)
+					return c1 - c2;
+			}
+			return len1 - len2;
+
+		}
+
+	}
+
+
+	/**
+	 * A file filter for File.listFiles() (NOT for JFileChoosers!) that
+	 * accepts only XML files.
+	 */
+	private static class XMLFileFilter implements FileFilter {
+		public boolean accept(File f) {
+			return f.getName().toLowerCase().endsWith(".xml");
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultToken.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultToken.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultToken.java	(revision 25584)
@@ -0,0 +1,379 @@
+/*
+ * 10/28/2004
+ *
+ * DefaultToken.java - The default token used in syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import javax.swing.text.Segment;
+import javax.swing.text.TabExpander;
+import javax.swing.text.Utilities;
+
+
+/**
+ * The default token used in the <code>org.fife.ui.rsyntaxtextarea</code> syntax
+ * package.  This token type paints itself as you would expect, and properly
+ * accounts for rendering hints (anti-aliasing and fractional font metrics).<p>
+ *
+ * The current implementation paints as follows:
+ * <ul>
+ *   <li>The first tab, if any, is found in the token.</li>
+ *   <li>All characters up to that tab, if it exists, are painted as a
+ *       group.  If no tab was found, all characters in the token are
+ *       painted.</li>
+ *   <li>If a tab was found, its width is calculated and it is painted.</li>
+ *   <li>Repeat until all characters are painted.</li>
+ * </ul>
+ * This method allows for rendering hints to be honored, since all possible
+ * characters are painted in a group.  However, adjacent tokens will not have
+ * their "touching" characters rendered with rendering hints.<p>
+ *
+ * A problem with this implementation is that FontMetrics.charsWidth() is still
+ * used to calculate the width of a group of chars painted.  Thus, the group of
+ * characters will be painted with the rendering hints specified, but the
+ * following tab (or group of characters if the current group was the end of a
+ * token) will not necessarily be painted at the proper x-coordinate (as
+ * FontMetrics.charsWidth() returns an <code>int</code> and not a
+ * <code>float</code>).  The way around this would be to calculate the token's
+ * width in such a way that a float is returned (Font.getStringBounds()?).
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ * @see Token
+ * @see VisibleWhitespaceToken
+ */
+public class DefaultToken extends Token {
+
+
+	/**
+	 * Creates a "null token."  The token itself is not null; rather, it
+	 * signifies that it is the last token in a linked list of tokens and
+	 * that it is not part of a "multi-line token."
+	 */
+	public DefaultToken() {
+		super();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param startOffset The offset into the document at which this
+	 *        token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public DefaultToken(final Segment line, final int beg, final int end,
+							final int startOffset, final int type) {
+		this(line.array, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param startOffset The offset into the document at which this
+	 *        token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public DefaultToken(final char[] line, final int beg, final int end,
+							final int startOffset, final int type) {
+		super(line, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Determines the offset into this token list (i.e., into the
+	 * document) that covers pixel location <code>x</code> if the token list
+	 * starts at pixel location <code>x0</code><p>.
+	 * This method will return the document position "closest" to the
+	 * x-coordinate (i.e., if they click on the "right-half" of the
+	 * <code>w</code> in <code>awe</code>, the caret will be placed in
+	 * between the <code>w</code> and <code>e</code>; similarly, clicking on
+	 * the left-half places the caret between the <code>a</code> and
+	 * <code>w</code>).  This makes it useful for methods such as
+	 * <code>viewToModel</code> found in <code>javax.swing.text.View</code>
+	 * subclasses.
+	 *
+	 * @param textArea The text area from which the token list was derived.
+	 * @param e How to expand tabs.
+	 * @param x0 The pixel x-location that is the beginning of
+	 *        <code>tokenList</code>.
+	 * @param x The pixel-position for which you want to get the corresponding
+	 *        offset.
+	 * @return The position (in the document, NOT into the token list!) that
+	 *         covers the pixel location.  If <code>tokenList</code> is
+	 *         <code>null</code> or has type <code>Token.NULL</code>, then
+	 *         <code>-1</code is returned; the caller should recognize this and
+	 *         return the actual end position of the (empty) line.
+	 */
+	public int getListOffset(RSyntaxTextArea textArea, TabExpander e,
+								float x0, float x) {
+
+		// If the coordinate in question is before this line's start, quit.
+		if (x0 >= x)
+			return offset;
+
+		float currX = x0;	// x-coordinate of current char.
+		float nextX = x0;	// x-coordinate of next char.
+		float stableX = x0;	// Cached ending x-coord. of last tab or token.
+		Token token = this;
+		int last = offset;
+		FontMetrics fm = null;
+
+		while (token!=null && token.isPaintable()) {
+
+			fm = textArea.getFontMetricsForTokenType(token.type);
+			char[] text = token.text;
+			int start = token.textOffset;
+			int end = start + token.textCount;
+
+			for (int i=start; i<end; i++) {
+				currX = nextX;
+				if (text[i] == '\t') {
+					nextX = e.nextTabStop(nextX, 0);
+					stableX = nextX;	// Cache ending x-coord. of tab.
+					start = i+1;		// Do charsWidth() from next char.
+				}
+				else {
+					nextX = stableX + fm.charsWidth(text, start, i-start+1);
+				}
+				if (x>=currX && x<nextX) {
+					if ((x-currX) < (nextX-x)) {
+						return last + i-token.textOffset;
+					}
+					return last + i+1-token.textOffset;
+				}
+			}
+
+			stableX = nextX;		// Cache ending x-coordinate of token.
+			last += token.textCount;
+			token = token.getNextToken();
+
+		}
+
+		// If we didn't find anything, return the end position of the text.
+		return last;
+
+	}
+
+
+	/**
+	 * Returns the width of a specified number of characters in this token.
+	 * For example, for the token "while", specifying a value of <code>3</code>
+	 * here returns the width of the "whi" portion of the token.<p>
+	 *
+	 * @param numChars The number of characters for which to get the width.
+	 * @param textArea The text area in which this token is being painted.
+	 * @param e How to expand tabs.  This value cannot be <code>null</code>.
+	 * @param x0 The pixel-location at which this token begins.  This is needed
+	 *        because of tabs.
+	 * @return The width of the specified number of characters in this token.
+	 * @see #getWidth
+	 */
+	public float getWidthUpTo(int numChars, RSyntaxTextArea textArea,
+							TabExpander e, float x0) {
+		float width = x0;
+		FontMetrics fm = textArea.getFontMetricsForTokenType(type);
+		if (fm!=null) {
+			int w;
+			int currentStart = textOffset;
+			int endBefore = textOffset + numChars;
+			for (int i=currentStart; i<endBefore; i++) {
+				if (text[i] == '\t') {
+					// Since TokenMaker implementations usually group all
+					// adjacent whitespace into a single token, there
+					// aren't usually any characters to compute a width
+					// for here, so we check before calling.
+					w = i-currentStart;
+					if (w>0)
+						width += fm.charsWidth(text, currentStart, w);
+					currentStart = i+1;
+					width = e.nextTabStop(width, 0);
+				}
+			}
+			// Most (non-whitespace) tokens will have characters at this
+			// point to get the widths for, so we don't check for w>0 (mini-
+			// optimization).
+			w = endBefore-currentStart;
+			width += fm.charsWidth(text, currentStart, w);
+		}
+		return width - x0;
+	}
+
+
+	/**
+	 * Returns the bounding box for the specified document location.  The
+	 * location must be in the specified token list.
+	 *
+	 * @param textArea The text area from which the token list was derived.
+	 * @param e How to expand tabs.
+	 * @param pos The position in the document for which to get the bounding
+	 *        box in the view.
+	 * @param x0 The pixel x-location that is the beginning of
+	 *        <code>tokenList</code>.
+	 * @param rect The rectangle in which we'll be returning the results.  This
+	 *        object is reused to keep from frequent memory allocations.
+	 * @return The bounding box for the specified position in the model.
+	 */
+	public Rectangle listOffsetToView(RSyntaxTextArea textArea, TabExpander e,
+										int pos, int x0, Rectangle rect) {
+
+		int stableX = x0;	// Cached ending x-coord. of last tab or token.
+		Token token = this;
+		FontMetrics fm = null;
+		Segment s = new Segment();
+
+		while (token!=null && token.isPaintable()) {
+
+			fm = textArea.getFontMetricsForTokenType(token.type);
+			if (fm==null) {
+				return rect; // Don't return null as things'll error.
+			}
+			char[] text = token.text;
+			int start = token.textOffset;
+			int end = start + token.textCount;
+
+			// If this token contains the position for which to get the
+			// bounding box...
+			if (token.containsPosition(pos)) {
+
+				s.array = token.text;
+				s.offset = token.textOffset;
+				s.count = pos-token.offset;
+
+				// Must use this (actually fm.charWidth()), and not
+				// fm.charsWidth() for returned value to match up with where
+				// text is actually painted on OS X!
+				int w = Utilities.getTabbedTextWidth(s, fm, stableX, e,
+													token.offset);
+				rect.x = stableX + w;
+				end = token.documentToToken(pos);
+
+				if (text[end]=='\t') {
+					rect.width = fm.charWidth(' ');
+				}
+				else {
+					rect.width = fm.charWidth(text[end]);
+				}
+
+				return rect;
+
+			}
+
+			// If this token does not contain the position for which to get
+			// the bounding box...
+			else {
+				s.array = token.text;
+				s.offset = token.textOffset;
+				s.count = token.textCount;
+				stableX += Utilities.getTabbedTextWidth(s, fm, stableX, e,
+														token.offset);
+			}
+
+			token = token.getNextToken();
+
+		}
+
+		// If we didn't find anything, we're at the end of the line.  Return
+		// a width of 1 (so selection highlights don't extend way past line's
+		// text).  A ConfigurableCaret will know to paint itself with a larger
+		// width.
+		rect.x = stableX;
+		rect.width = 1;
+		return rect;
+
+	}
+
+
+	/**
+	 * Paints this token.
+	 *
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @param clipStart The left boundary of the clip rectangle in which we're
+	 *        painting.  This optimizes painting by allowing us to not paint
+	 *        when this token is "to the left" of the clip rectangle.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public float paint(Graphics2D g, float x, float y, RSyntaxTextArea host,
+								TabExpander e, float clipStart) {
+
+		int origX = (int)x;
+		int end = textOffset + textCount;
+		float nextX = x;
+		int flushLen = 0;
+		int flushIndex = textOffset;
+		Color fg = host.getForegroundForToken(this);
+		Color bg = host.getBackgroundForTokenType(type);
+		g.setFont(host.getFontForTokenType(type));
+		FontMetrics fm = host.getFontMetricsForTokenType(type);
+
+		for (int i=textOffset; i<end; i++) {
+			switch (text[i]) {
+				case '\t':
+					nextX = e.nextTabStop(
+						x+fm.charsWidth(text, flushIndex,flushLen), 0);
+					if (bg!=null) {
+						paintBackground(x,y, nextX-x,fm.getHeight(),
+										g, fm.getAscent(), host, bg);
+					}
+					if (flushLen > 0) {
+						g.setColor(fg);
+						g.drawChars(text, flushIndex, flushLen, (int)x,(int)y);
+						flushLen = 0;
+					}
+					flushIndex = i + 1;
+					x = nextX;
+					break;
+				default:
+					flushLen += 1;
+					break;
+			}
+		}
+
+		nextX = x+fm.charsWidth(text, flushIndex,flushLen);
+
+		if (flushLen>0 && nextX>=clipStart) {
+			if (bg!=null) {
+				paintBackground(x,y, nextX-x,fm.getHeight(),
+								g, fm.getAscent(), host, bg);
+			}
+			g.setColor(fg);
+			g.drawChars(text, flushIndex, flushLen, (int)x,(int)y);
+		}
+
+		if (host.getUnderlineForToken(this)) {
+			g.setColor(fg);
+			int y2 = (int)(y+1);
+			g.drawLine(origX,y2, (int)nextX,y2);
+		}
+
+		// Don't check if it's whitespace - some TokenMakers may return types
+		// other than Token.WHITESPACE for spaces (such as Token.IDENTIFIER).
+		// This also allows us to paint tab lines for MLC's.
+		if (host.getPaintTabLines() && origX==host.getMargin().left) {// && isWhitespace()) {
+			paintTabLines(origX, (int)y, (int)nextX, g, e, host);
+		}
+
+		return nextX;
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java	(revision 25584)
@@ -0,0 +1,167 @@
+/*
+ * 10/28/2004
+ *
+ * DefaultTokenFactory.java - Default token factory.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * This class generates tokens for a {@link TokenMaker}.  This class is here
+ * because it reuses tokens when they aren't needed anymore to prevent
+ * This class doesn't actually create new tokens every time
+ * <code>createToken</code> is called.  Instead, it internally keeps a stack of
+ * available already-created tokens.  When more tokens are needed to properly
+ * display a line, more tokens are added to the available stack.  This saves
+ * from needless repetitive memory allocation. However, it makes it IMPERATIVE
+ * that users call <code>resetTokenList</code> when creating a new token list so
+ * that the token maker can keep an accurate list of available tokens.<p>
+ *
+ * NOTE:  This class should only be used by {@link TokenMaker}; nobody else
+ * needs it!
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+class DefaultTokenFactory implements TokenFactory {
+
+	private int size;
+	private int increment;
+	private Token[] tokenList;
+	private int currentFreeToken;
+
+	protected static final int DEFAULT_START_SIZE	= 30;
+	protected static final int DEFAULT_INCREMENT		= 10;
+
+
+	/**
+	 * Cosnstructor.
+	 */
+	public DefaultTokenFactory() {
+		this(DEFAULT_START_SIZE, DEFAULT_INCREMENT);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param size The initial number of tokens in this factory.
+	 * @param increment How many tokens to increment by when the stack gets
+	 *        empty.
+	 */
+	public DefaultTokenFactory(int size, int increment) {
+
+		this.size = size;
+		this.increment = increment;
+		this.currentFreeToken = 0;
+
+		// Give us some tokens to initially work with.
+		tokenList = new Token[size];
+		for (int i=0; i<size; i++)
+			tokenList[i] = createInternalUseOnlyToken();
+
+	}
+
+
+	/**
+	 * Adds tokens to the internal token list.  This is called whenever a
+	 * request is made and no more tokens are available.
+	 */
+	private final void augmentTokenList() {
+		Token[] temp = new Token[size + increment];
+		System.arraycopy(tokenList,0, temp,0, size);
+		size += increment;
+		tokenList = temp;
+		for (int i=0; i<increment; i++) {
+			tokenList[size-i-1] = createInternalUseOnlyToken();
+		}
+		//System.err.println("... size up to: " + size);
+	}
+
+
+	/**
+	 * Creates a token for use internally by this token factory.  This method
+	 * should NOT be called externally; only by this class and possibly
+	 * subclasses.
+	 *
+	 * @return A token to add to this token factory's internal stack.  If a
+	 *         subclass wants to produce a stack of a token other than
+	 *         {@link DefaultToken}, then this method can be overridden to
+	 *         return a new instance of the desired token type.
+	 */
+	protected Token createInternalUseOnlyToken() {
+		return new DefaultToken();
+	}
+
+
+	/**
+	 * Returns a null token.
+	 *
+	 * @return A null token.
+	 */
+	public Token createToken() {
+		Token token = tokenList[currentFreeToken];
+		token.text = null;
+		token.type = Token.NULL;
+		token.offset = -1;
+		token.setNextToken(null);
+		currentFreeToken++;
+		if (currentFreeToken==size)
+			augmentTokenList();
+		return token;	
+	}
+
+
+	/**
+	 * Returns a token.
+	 *
+	 * @param line The segment from which to get the token's text.
+	 * @param beg The starting offset of the token's text in the segment.
+	 * @param end The ending offset of the token's text in the segment.
+	 * @param startOffset The offset in the document of the token.
+	 * @param type The type of token.
+	 * @return The token.
+	 */
+	public Token createToken(final Segment line, final int beg,
+					final int end, final int startOffset, final int type) {
+		return createToken(line.array, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Returns a token.
+	 *
+	 * @param line The segment from which to get the token's text.
+	 * @param beg The starting offset of the token's text in the segment.
+	 * @param end The ending offset of the token's text in the segment.
+	 * @param startOffset The offset in the document of the token.
+	 * @param type The type of token.
+	 * @return The token.
+	 */
+	public Token createToken(final char[] line, final int beg,
+					final int end, final int startOffset, final int type) {
+		Token token = tokenList[currentFreeToken];
+		token.set(line, beg,end, startOffset, type);
+		currentFreeToken++;
+		if (currentFreeToken==size)
+			augmentTokenList();
+		return token;	
+	}
+
+
+	/**
+	 * Resets the state of this token maker.  This method should be called
+	 * by the <code>TokenMaker</code> every time a token list is generated for
+	 * a new line so the tokens can be reused.
+	 */
+	public void resetAllTokens() {
+		currentFreeToken = 0;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java	(revision 25584)
@@ -0,0 +1,81 @@
+/*
+ * 12/14/2008 
+ *
+ * DefaultTokenMakerFactory.java - The default TokenMaker factory.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * The default implementation of <code>TokenMakerFactory</code>.  This factory
+ * can create {@link TokenMaker}s for all languages known to
+ * {@link RSyntaxTextArea}.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class DefaultTokenMakerFactory extends AbstractTokenMakerFactory
+								implements SyntaxConstants {
+
+
+	/**
+	 * Creates and returns a mapping from keys to the names of
+	 * {@link TokenMaker} implementation classes.  When
+	 * {@link #getTokenMaker(String)} is called with a key defined in this
+	 * map, a <code>TokenMaker</code> of the corresponding type is returned.
+	 *
+	 * @return The map.
+	 */
+	protected Map createTokenMakerKeyToClassNameMap() {
+
+		HashMap map = new HashMap();
+
+		String pkg = "org.fife.ui.rsyntaxtextarea.modes.";
+
+		map.put(SYNTAX_STYLE_NONE,				pkg + "PlainTextTokenMaker");
+		map.put(SYNTAX_STYLE_ACTIONSCRIPT,		pkg + "ActionScriptTokenMaker");
+		map.put(SYNTAX_STYLE_ASSEMBLER_X86,		pkg + "AssemblerX86TokenMaker");
+		map.put(SYNTAX_STYLE_BBCODE,			pkg + "BBCodeTokenMaker");
+		map.put(SYNTAX_STYLE_C,					pkg + "CTokenMaker");
+		map.put(SYNTAX_STYLE_CLOJURE,			pkg + "ClojureTokenMaker");
+		map.put(SYNTAX_STYLE_CPLUSPLUS,			pkg + "CPlusPlusTokenMaker");
+		map.put(SYNTAX_STYLE_CSHARP,			pkg + "CSharpTokenMaker");
+		map.put(SYNTAX_STYLE_CSS,				pkg + "CSSTokenMaker");
+		map.put(SYNTAX_STYLE_DELPHI,			pkg + "DelphiTokenMaker");
+		map.put(SYNTAX_STYLE_DTD,				pkg + "DtdTokenMaker");
+		map.put(SYNTAX_STYLE_FORTRAN,			pkg + "FortranTokenMaker");
+		map.put(SYNTAX_STYLE_GROOVY,			pkg + "GroovyTokenMaker");
+		map.put(SYNTAX_STYLE_HTML,				pkg + "HTMLTokenMaker");
+		map.put(SYNTAX_STYLE_JAVA,				pkg + "JavaTokenMaker");
+		map.put(SYNTAX_STYLE_JAVASCRIPT,		pkg + "JavaScriptTokenMaker");
+		map.put(SYNTAX_STYLE_JSP,				pkg + "JSPTokenMaker");
+		map.put(SYNTAX_STYLE_LATEX,				pkg + "LatexTokenMaker");
+		map.put(SYNTAX_STYLE_LISP,				pkg + "LispTokenMaker");
+		map.put(SYNTAX_STYLE_LUA,				pkg + "LuaTokenMaker");
+		map.put(SYNTAX_STYLE_MAKEFILE,			pkg + "MakefileTokenMaker");
+		map.put(SYNTAX_STYLE_MXML,				pkg + "MxmlTokenMaker");
+		map.put(SYNTAX_STYLE_PERL,				pkg + "PerlTokenMaker");
+		map.put(SYNTAX_STYLE_PHP,				pkg + "PHPTokenMaker");
+		map.put(SYNTAX_STYLE_PROPERTIES_FILE,	pkg + "PropertiesFileTokenMaker");
+		map.put(SYNTAX_STYLE_PYTHON,			pkg + "PythonTokenMaker");
+		map.put(SYNTAX_STYLE_RUBY,				pkg + "RubyTokenMaker");
+		map.put(SYNTAX_STYLE_SAS,				pkg + "SASTokenMaker");
+		map.put(SYNTAX_STYLE_SCALA,				pkg + "ScalaTokenMaker");
+		map.put(SYNTAX_STYLE_SQL,				pkg + "SQLTokenMaker");
+		map.put(SYNTAX_STYLE_TCL,				pkg + "TclTokenMaker");
+		map.put(SYNTAX_STYLE_UNIX_SHELL,		pkg + "UnixShellTokenMaker");
+		map.put(SYNTAX_STYLE_WINDOWS_BATCH,		pkg + "WindowsBatchTokenMaker");
+		map.put(SYNTAX_STYLE_XML,				pkg + "XMLTokenMaker");
+
+		return map;
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DocumentRange.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DocumentRange.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/DocumentRange.java	(revision 25584)
@@ -0,0 +1,39 @@
+/*
+ * 08/11/2009
+ *
+ * DocumentRange.java - A range of text in a document.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * A range of text in a document.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface DocumentRange {
+
+
+	/**
+	 * Gets the end offset of the range.
+	 *
+	 * @return The end offset.
+	 * @see #getStartOffset()
+	 */
+	public int getEndOffset();
+
+
+	/**
+	 * Gets the starting offset of the range.
+	 *
+	 * @return The starting offset.
+	 * @see #getEndOffset()
+	 */
+	public int getStartOffset();
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ErrorStrip.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ErrorStrip.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ErrorStrip.java	(revision 25584)
@@ -0,0 +1,766 @@
+/*
+ * 08/10/2009
+ *
+ * ErrorStrip.java - A component that can visually show Parser messages (syntax
+ * errors, etc.) in an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import javax.swing.JComponent;
+import javax.swing.ToolTipManager;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rsyntaxtextarea.parser.TaskTagParser.TaskNotice;
+
+
+/**
+ * A component to sit alongside an {@link RSyntaxTextArea} that displays
+ * colored markers for locations of interest (parser errors, marked
+ * occurrences, etc.).<p>
+ *
+ * <code>ErrorStrip</code>s display <code>ParserNotice</code>s from
+ * {@link Parser}s.  Currently, the only way to get lines flagged in this
+ * component is to register a <code>Parser</code> on an RSyntaxTextArea and
+ * return <code>ParserNotice</code>s for each line to display an icon for.
+ * The severity of each notice must be at least the threshold set by
+ * {@link #setLevelThreshold(int)} to be displayed in this error strip.  The
+ * default threshold is {@link ParserNotice#WARNING}.<p>
+ *   
+ * An <code>ErrorStrip</code> can be added to a UI like so:
+ * <pre>
+ * textArea = createTextArea();
+ * textArea.addParser(new MyParser(textArea)); // Identifies lines to display
+ * scrollPane = new RTextScrollPane(textArea, true);
+ * ErrorStrip es = new ErrorStrip(textArea);
+ * JPanel temp = new JPanel(new BorderLayout());
+ * temp.add(scrollPane);
+ * temp.add(es, BorderLayout.LINE_END);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+/*
+ * Possible improvements:
+ *    1. Handle marked occurrence changes separately from parser changes.
+ *       For each property change, call a method that removes the notices
+ *       being reloaded from the Markers (removing any Markers that are now
+ *       "empty").
+ *    2. When 1.4 support is dropped, replace new Integer(int) with
+ *       Integer.valueOf(int).
+ */
+public class ErrorStrip extends JComponent {
+
+	/**
+	 * The text area.
+	 */
+	private RSyntaxTextArea textArea;
+
+	/**
+	 * Listens for events in this component.
+	 */
+	private Listener listener;
+
+	/**
+	 * Whether "marked occurrences" in the text area should be shown in this
+	 * error strip.
+	 */
+	private boolean showMarkedOccurrences;
+
+	/**
+	 * Mapping of colors to brighter colors.  This is kept to prevent
+	 * unnecessary creation of the same Colors over and over.
+	 */
+	private Map brighterColors;
+
+	/**
+	 * Only notices of this severity (or worse) will be displayed in this
+	 * error strip.
+	 */
+	private int levelThreshold;
+
+	/**
+	 * Whether the caret marker's location should be rendered.
+	 */
+	private boolean followCaret;
+
+	/**
+	 * The color to use for the caret marker.
+	 */
+	private Color caretMarkerColor;
+
+	/**
+	 * Where we paint the caret marker.
+	 */
+	private int caretLineY;
+
+	/**
+	 * The last location of the caret marker.
+	 */
+	private int lastLineY;
+
+	/**
+	 * The preferred width of this component.
+	 */
+	private static final int PREFERRED_WIDTH = 14;
+
+	private static final String MSG = "org.fife.ui.rsyntaxtextarea.ErrorStrip";
+	private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area we are examining.
+	 */
+	public ErrorStrip(RSyntaxTextArea textArea) {
+		this.textArea = textArea;
+		listener = new Listener();
+		ToolTipManager.sharedInstance().registerComponent(this);
+		setLayout(null); // Manually layout Markers as they can overlap
+		addMouseListener(listener);
+		setShowMarkedOccurrences(true);
+		setLevelThreshold(ParserNotice.WARNING);
+		setFollowCaret(true);
+		setCaretMarkerColor(Color.BLACK);
+	}
+
+
+	/**
+	 * Overridden so we only start listening for parser notices when this
+	 * component (and presumably the text area) are visible.
+	 */
+	public void addNotify() {
+		super.addNotify();
+		textArea.addCaretListener(listener);
+		textArea.addPropertyChangeListener(
+				RSyntaxTextArea.PARSER_NOTICES_PROPERTY, listener);
+		textArea.addPropertyChangeListener(
+				RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY, listener);
+		textArea.addPropertyChangeListener(
+				RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY, listener);
+		refreshMarkers();
+	}
+
+
+	/**
+	 * Manually manages layout since this component uses no layout manager.
+	 */
+	public void doLayout() {
+		for (int i=0; i<getComponentCount(); i++) {
+			Marker m = (Marker)getComponent(i);
+			m.updateLocation();
+		}
+		listener.caretUpdate(null); // Force recalculation of caret line pos
+	}
+
+
+	/**
+	 * Returns a "brighter" color.
+	 *
+	 * @param c The color.
+	 * @return A brighter color.
+	 */
+	private Color getBrighterColor(Color c) {
+		if (brighterColors==null) {
+			brighterColors = new HashMap(5); // Usually small
+		}
+		Color brighter = (Color)brighterColors.get(c);
+		if (brighter==null) {
+			// Don't use c.brighter() as it doesn't work well for blue, and
+			// also doesn't return something brighter "enough."
+			int r = possiblyBrighter(c.getRed());
+			int g = possiblyBrighter(c.getGreen());
+			int b = possiblyBrighter(c.getBlue());
+			brighter = new Color(r, g, b);
+			brighterColors.put(c, brighter);
+		}
+		return brighter;
+	}
+
+
+	/**
+	 * returns the color to use when painting the caret marker.
+	 *
+	 * @return The caret marker color.
+	 * @see #setCaretMarkerColor(Color)
+	 */
+	public Color getCaretMarkerColor() {
+		return caretMarkerColor;
+	}
+
+
+	/**
+	 * Returns whether the caret's position should be drawn.
+	 *
+	 * @return Whether the caret's position should be drawn.
+	 * @see #setFollowCaret(boolean)
+	 */
+	public boolean getFollowCaret() {
+		return followCaret;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Dimension getPreferredSize() {
+		int height = textArea.getPreferredScrollableViewportSize().height;
+		return new Dimension(PREFERRED_WIDTH, height);
+	}
+
+
+	/**
+	 * Returns the minimum severity a parser notice must be for it to be
+	 * displayed in this error strip.  This will be one of the constants
+	 * defined in the <code>ParserNotice</code> class.
+	 *
+	 * @return The minimum severity.
+	 * @see #setLevelThreshold(int)
+	 */
+	public int getLevelThreshold() {
+		return levelThreshold;
+	}
+
+
+	/**
+	 * Returns whether marked occurrences are shown in this error strip.
+	 *
+	 * @return Whether marked occurrences are shown.
+	 * @see #setShowMarkedOccurrences(boolean)
+	 */
+	public boolean getShowMarkedOccurrences() {
+		return showMarkedOccurrences;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getToolTipText(MouseEvent e) {
+		String text = null;
+		int line = yToLine(e.getY());
+		if (line>-1) {
+			text = msg.getString("Line");
+			// TODO: 1.5: Use Integer.valueOf(line)
+			text = MessageFormat.format(text,
+						new Object[] { new Integer(line) });
+		}
+		return text;
+	}
+
+
+	/**
+	 * Returns the y-offset in this component corresponding to a line in the
+	 * text component.
+	 *
+	 * @param line The line.
+	 * @return The y-offset.
+	 * @see #yToLine(int)
+	 */
+	private int lineToY(int line) {
+		int h = textArea.getVisibleRect().height;
+		float lineCount = textArea.getLineCount();
+		return (int)((line/lineCount) * h) - 2;		
+	}
+
+
+	/**
+	 * Overridden to (possibly) draw the caret's position.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintComponent(Graphics g) {
+		super.paintComponent(g);
+		if (caretLineY>-1) {
+			g.setColor(getCaretMarkerColor());
+			g.fillRect(0, caretLineY, getWidth(), 2);
+		}
+	}
+
+
+	/**
+	 * Returns a possibly brighter component for a color.
+	 *
+	 * @param i An RGB component for a color (0-255).
+	 * @return A possibly brighter value for the component.
+	 */
+	private static final int possiblyBrighter(int i) {
+		if (i<255) {
+			i += (int)((255-i)*0.8f);
+		}
+		return i;
+	}
+
+
+	/**
+	 * Refreshes the markers displayed in this error strip.
+	 */
+	private void refreshMarkers() {
+
+		removeAll(); // listener is removed in Marker.removeNotify()
+		Map markerMap = new HashMap();
+
+		List notices = textArea.getParserNotices();
+		for (Iterator i=notices.iterator(); i.hasNext(); ) {
+			ParserNotice notice = (ParserNotice)i.next();
+			if (notice.getLevel()<=levelThreshold ||
+					(notice instanceof TaskNotice)) {
+				// 1.5: Use Integer.valueOf(notice.getLine())
+				Integer key = new Integer(notice.getLine());
+				Marker m = (Marker)markerMap.get(key);
+				if (m==null) {
+					m = new Marker(notice);
+					m.addMouseListener(listener);
+					markerMap.put(key, m);
+					add(m);
+				}
+				else {
+					m.addNotice(notice);
+				}
+			}
+		}
+
+		if (getShowMarkedOccurrences() && textArea.getMarkOccurrences()) {
+			List occurrences = textArea.getMarkedOccurrences();
+			for (Iterator i=occurrences.iterator(); i.hasNext(); ) {
+				DocumentRange range = (DocumentRange)i.next();
+				int line = 0;
+				try {
+					line = textArea.getLineOfOffset(range.getStartOffset());
+				} catch (BadLocationException ble) { // Never happens
+					continue;
+				}
+				ParserNotice notice = new MarkedOccurrenceNotice(range);
+				// 1.5: Use Integer.valueOf(notice.getLine())
+				Integer key = new Integer(line);
+				Marker m = (Marker)markerMap.get(key);
+				if (m==null) {
+					m = new Marker(notice);
+					m.addMouseListener(listener);
+					markerMap.put(key, m);
+					add(m);
+				}
+				else {
+					if (!m.containsMarkedOccurence()) {
+						m.addNotice(notice);
+					}
+				}
+			}
+		}
+
+		revalidate();
+		repaint();
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void removeNotify() {
+		super.removeNotify();
+		textArea.removeCaretListener(listener);
+		textArea.removePropertyChangeListener(
+				RSyntaxTextArea.PARSER_NOTICES_PROPERTY, listener);
+		textArea.removePropertyChangeListener(
+				RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY, listener);
+		textArea.removePropertyChangeListener(
+				RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY, listener);
+	}
+
+
+	/**
+	 * Sets the color to use when painting the caret marker.
+	 *
+	 * @param color The new caret marker color.
+	 * @see #getCaretMarkerColor()
+	 */
+	public void setCaretMarkerColor(Color color) {
+		if (color!=null) {
+			caretMarkerColor = color;
+			listener.caretUpdate(null); // Force repaint
+		}
+	}
+
+
+	/**
+	 * Toggles whether the caret's current location should be drawn.
+	 *
+	 * @param follow Whether the caret's current location should be followed.
+	 * @see #getFollowCaret()
+	 */
+	public void setFollowCaret(boolean follow) {
+		if (followCaret!=follow) {
+			if (followCaret) {
+				repaint(0,caretLineY, getWidth(),2); // Erase
+			}
+			caretLineY = -1;
+			lastLineY = -1;
+			followCaret = follow;
+			listener.caretUpdate(null); // Possibly repaint
+		}
+	}
+
+
+	/**
+	 * Sets the minimum severity a parser notice must be for it to be displayed
+	 * in this error strip.  This should be one of the constants defined in
+	 * the <code>ParserNotice</code> class.  The default value is
+	 * {@link ParserNotice#WARNING}.
+	 *
+	 * @param level The new severity threshold.
+	 * @see #getLevelThreshold()
+	 * @see ParserNotice
+	 */
+	public void setLevelThreshold(int level) {
+		levelThreshold = level;
+		if (isDisplayable()) {
+			refreshMarkers();
+		}
+	}
+
+
+	/**
+	 * Sets whether marked occurrences are shown in this error strip.
+	 *
+	 * @param show Whether to show marked occurrences.
+	 * @see #getShowMarkedOccurrences()
+	 */
+	public void setShowMarkedOccurrences(boolean show) {
+		if (show!=showMarkedOccurrences) {
+			showMarkedOccurrences = show;
+			if (isDisplayable()) { // Skip this when we're first created
+				refreshMarkers();
+			}
+		}
+	}
+
+
+	/**
+	 * Returns the line in the text area corresponding to a y-offset in this
+	 * component.
+	 *
+	 * @param y The y-offset.
+	 * @return The line.
+	 * @see #lineToY(int)
+	 */
+	private final int yToLine(int y) {
+		int line = -1;
+		int h = textArea.getVisibleRect().height;
+		if (y<h) {
+			float at = y/(float)h;
+			line = (int)(textArea.getLineCount()*at);
+		}
+		return line;
+	}
+
+
+	/**
+	 * Listens for events in the error strip and its markers.
+	 */
+	private class Listener extends MouseAdapter
+					implements PropertyChangeListener, CaretListener {
+
+		private Rectangle visibleRect = new Rectangle();
+
+		public void caretUpdate(CaretEvent e) {
+			if (getFollowCaret()) {
+				int line = textArea.getCaretLineNumber();
+				float percent = line / ((float)textArea.getLineCount());
+				textArea.computeVisibleRect(visibleRect);
+				caretLineY = (int)(visibleRect.height*percent);
+				if (caretLineY!=lastLineY) {
+					repaint(0,lastLineY, getWidth(), 2); // Erase old position
+					repaint(0,caretLineY, getWidth(), 2);
+					lastLineY = caretLineY;
+				}
+			}
+		}
+
+		public void mouseClicked(MouseEvent e) {
+
+			Component source = (Component)e.getSource();
+			if (source instanceof Marker) {
+				((Marker)source).mouseClicked(e);
+				return;
+			}
+
+			int line = yToLine(e.getY());
+			if (line>-1) {
+				try {
+					int offs = textArea.getLineStartOffset(line);
+					textArea.setCaretPosition(offs);
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				}
+			}
+
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+
+			String propName = e.getPropertyName();
+
+			// If they change whether marked occurrences are visible in editor
+			if (RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY.equals(propName)) {
+				if (getShowMarkedOccurrences()) {
+					refreshMarkers();
+				}
+			}
+
+			// If parser notices changed.
+			else if (RSyntaxTextArea.PARSER_NOTICES_PROPERTY.equals(propName)) {
+				refreshMarkers();
+			}
+
+			// If marked occurrences changed.
+			else if (RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY.
+					equals(propName)) {
+				if (getShowMarkedOccurrences()) {
+					refreshMarkers();
+				}
+			}
+
+		}
+
+	}
+
+
+private static final Color COLOR = new Color(220, 220, 220);
+	/**
+	 * A notice that wraps a "marked occurrence."
+	 */
+	private class MarkedOccurrenceNotice implements ParserNotice {
+
+		private DocumentRange range;
+
+		public MarkedOccurrenceNotice(DocumentRange range) {
+			this.range = range;
+		}
+
+		public int compareTo(Object o) {
+			return 0; // Value doesn't matter
+		}
+
+		public boolean containsPosition(int pos) {
+			return pos>=range.getStartOffset() && pos<range.getEndOffset();
+		}
+
+		public boolean equals(Object o) {
+			// FindBugs - Define equals() when defining compareTo()
+			return compareTo(o)==0;
+		}
+
+		public Color getColor() {
+			return COLOR;
+			//return textArea.getMarkOccurrencesColor();
+		}
+
+		public int getLength() {
+			return range.getEndOffset() - range.getStartOffset();
+		}
+
+		public int getLevel() {
+			return INFO; // Won't matter
+		}
+
+		public int getLine() {
+			try {
+				return textArea.getLineOfOffset(range.getStartOffset());
+			} catch (BadLocationException ble) {
+				return 0;
+			}
+		}
+
+		public String getMessage() {
+			String text = null;
+			try {
+				String word = textArea.getText(range.getStartOffset(),
+												getLength());
+				text = msg.getString("OccurrenceOf");
+				text = MessageFormat.format(text, new String[] { word });
+			} catch (BadLocationException ble) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			return text;
+		}
+
+		public int getOffset() {
+			return range.getStartOffset();
+		}
+
+		public Parser getParser() {
+			return null;
+		}
+
+		public boolean getShowInEditor() {
+			return false; // Value doesn't matter
+		}
+
+		public String getToolTipText() {
+			return null;
+		}
+
+		public int hashCode() { // FindBugs, since we override equals()
+			return 0; // Value doesn't matter for us.
+		}
+
+	}
+
+
+	/**
+	 * A "marker" in this error strip, representing one or more notices.
+	 */
+	private class Marker extends JComponent {
+
+		private List notices;
+
+		public Marker(ParserNotice notice) {
+			notices = new ArrayList(1); // Usually just 1
+			addNotice(notice);
+			setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+			setSize(getPreferredSize());
+			ToolTipManager.sharedInstance().registerComponent(this);
+		}
+
+		public void addNotice(ParserNotice notice) {
+			notices.add(notice);
+		}
+
+		public boolean containsMarkedOccurence() {
+			boolean result = false;
+			for (int i=0; i<notices.size(); i++) {
+				if (notices.get(i) instanceof MarkedOccurrenceNotice) {
+					result = true;
+					break;
+				}
+			}
+			return result;
+		}
+
+		public Color getColor() {
+			// Return the color for the highest-level parser.
+			Color c = null;
+			int lowestLevel = Integer.MAX_VALUE; // ERROR is 0
+			for (Iterator i=notices.iterator(); i.hasNext(); ) {
+				ParserNotice notice = (ParserNotice)i.next();
+				if (notice.getLevel()<lowestLevel) {
+					lowestLevel = notice.getLevel();
+					c = notice.getColor();
+				}
+			}
+			return c;
+		}
+
+		public Dimension getPreferredSize() {
+			int w = PREFERRED_WIDTH - 4; // 2-pixel empty border
+			return new Dimension(w, 5);
+		}
+
+		public String getToolTipText() {
+
+			String text = null;
+
+			if (notices.size()==1) {
+				text = ((ParserNotice)notices.get(0)).getMessage();
+			}
+			else { // > 1
+				StringBuffer sb = new StringBuffer("<html>");
+				sb.append(msg.getString("MultipleMarkers"));
+				sb.append("<br>");
+				for (int i=0; i<notices.size(); i++) {
+					ParserNotice pn = (ParserNotice)notices.get(i);
+					sb.append("&nbsp;&nbsp;&nbsp;- ");
+					sb.append(pn.getMessage());
+					sb.append("<br>");
+				}
+				text = sb.toString();
+			}
+
+			return text;
+
+		}
+
+		protected void mouseClicked(MouseEvent e) {
+			ParserNotice pn = (ParserNotice)notices.get(0);
+			int offs = pn.getOffset();
+			int len = pn.getLength();
+			if (offs>-1 && len>-1) { // These values are optional
+				textArea.setSelectionStart(offs);
+				textArea.setSelectionEnd(offs+len);
+			}
+			else {
+				int line = pn.getLine();
+				try {
+					offs = textArea.getLineStartOffset(line);
+					textArea.setCaretPosition(offs);
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				}
+			}
+		}
+
+		protected void paintComponent(Graphics g) {
+
+			// TODO: Give "priorities" and always pick color of a notice with
+			// highest priority (e.g. parsing errors will usually be red).
+
+			Color borderColor = getColor();
+			if (borderColor==null) {
+				borderColor = Color.DARK_GRAY;
+			}
+			Color fillColor = getBrighterColor(borderColor);
+
+			int w = getWidth();
+			int h = getHeight();
+
+			g.setColor(fillColor);
+			g.fillRect(0,0, w,h);
+
+			g.setColor(borderColor);
+			g.drawRect(0,0, w-1,h-1);
+
+		}
+
+		public void removeNotify() {
+			super.removeNotify();
+			ToolTipManager.sharedInstance().unregisterComponent(this);
+			removeMouseListener(listener);
+		}
+
+		public void updateLocation() {
+			int line = ((ParserNotice)notices.get(0)).getLine();
+			int y = lineToY(line);
+			setLocation(2, y);
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FileFileLocation.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FileFileLocation.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FileFileLocation.java	(revision 25584)
@@ -0,0 +1,114 @@
+/*
+ * 11/13/2008
+ *
+ * FileFileLocation.java - The location of a local file.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+
+/**
+ * The location of a local file.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class FileFileLocation extends FileLocation {
+
+	/**
+	 * The file.  This may or may not actually exist.
+	 */
+	private File file;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param file The local file.
+	 */
+	public FileFileLocation(File file) {
+		try {
+			// Useful on Windows and OS X.
+			this.file = file.getCanonicalFile();
+		} catch (IOException ioe) {
+			this.file = file;
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected long getActualLastModified() {
+		return file.lastModified();
+	}
+
+
+	/**
+	 * Returns the full path to the file.
+	 *
+	 * @return The full path to the file.
+	 * @see #getFileName()
+	 */
+	public String getFileFullPath() {
+		return file.getAbsolutePath();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getFileName() {
+		return file.getName();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected InputStream getInputStream() throws IOException {
+		return new FileInputStream(file);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected OutputStream getOutputStream() throws IOException {
+		return new FileOutputStream(file);
+	}
+
+
+	/**
+	 * Always returns <code>true</code>.
+	 *
+	 * @return <code>true</code> always.
+	 * @see #isLocalAndExists()
+	 */
+	public boolean isLocal() {
+		return true;
+	}
+
+
+	/**
+	 * Since file locations of this type are guaranteed to be local, this
+	 * method returns whether the file exists.
+	 *
+	 * @return Whether this local file actually exists.
+	 * @see #isLocal()
+	 */
+	public boolean isLocalAndExists() {
+		return file.exists();
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FileLocation.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FileLocation.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FileLocation.java	(revision 25584)
@@ -0,0 +1,141 @@
+/*
+ * 11/13/2008
+ *
+ * FileLocation.java - Holds the location of a local or remote file.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+
+
+/**
+ * Holds the location of a local or remote file.  This provides a common way
+ * to read, write, and check properties of both local and remote files.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class FileLocation {
+
+
+	/**
+	 * Creates a {@link FileLocation} instance for the specified local file.
+	 *
+	 * @param fileFullPath The full path to a local file.
+	 * @return The file's location.
+	 */
+	public static FileLocation create(String fileFullPath) {
+		return new FileFileLocation(new File(fileFullPath));
+	}
+
+
+	/**
+	 * Creates a {@link FileLocation} instance for the specified local file.
+	 *
+	 * @param file A local file.
+	 * @return The file's location.
+	 */
+	public static FileLocation create(File file) {
+		return new FileFileLocation(file);
+	}
+
+
+	/**
+	 * Creates a {@link FileLocation} instance for the specified file.
+	 *
+	 * @param url The URL of a file.
+	 * @return The file's location.
+	 */
+	public static FileLocation create(URL url) {
+		if ("file".equalsIgnoreCase(url.getProtocol())) {
+			return new FileFileLocation(new File(url.getPath()));
+		}
+		return new URLFileLocation(url);
+	}
+
+
+	/**
+	 * Returns the last time this file was modified, or
+	 * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be
+	 * computed (such as for a remote file).
+	 *
+	 * @return The last time this file was modified.
+	 */
+	protected abstract long getActualLastModified();
+
+
+	/**
+	 * Returns the full path to the file.  This will be stripped of
+	 * sensitive information such as passwords for remote files.
+	 *
+	 * @return The full path to the file.
+	 * @see #getFileName()
+	 */
+	public abstract String getFileFullPath();
+
+
+	/**
+	 * Returns the name of the file.
+	 *
+	 * @return The name of the file.
+	 * @see #getFileFullPath()
+	 */
+	public abstract String getFileName();
+
+
+	/**
+	 * Opens an input stream for reading from this file.
+	 *
+	 * @return The input stream.
+	 * @throws IOException If the file does not exist, or some other IO error
+	 *         occurs.
+	 */
+	protected abstract InputStream getInputStream() throws IOException;
+
+
+	/**
+	 * Opens an output stream for writing this file.
+	 *
+	 * @return An output stream.
+	 * @throws IOException If an IO error occurs.
+	 */
+	protected abstract OutputStream getOutputStream() throws IOException;
+
+
+	/**
+	 * Returns whether this file location is a local file.
+	 *
+	 * @return Whether this is a local file.
+	 * @see #isLocalAndExists()
+	 */
+	public abstract boolean isLocal();
+
+
+	/**
+	 * Returns whether this file location is a local file that already
+	 * exists.
+	 *
+	 * @return Whether this file is local and actually exists.
+	 * @see #isLocal()
+	 */
+	public abstract boolean isLocalAndExists();
+
+
+	/**
+	 * Returns whether this file location is a remote location.
+	 *
+	 * @return Whether this is a remote file location.
+	 */
+	public boolean isRemote() {
+		return !isLocal();
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java	(revision 25584)
@@ -0,0 +1,235 @@
+/*
+ * 03/07/2012
+ *
+ * FoldingAwareIconRowHeader - Icon row header that paints itself correctly
+ * even when code folding is enabled.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Point;
+import javax.swing.Icon;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.GutterIconInfo;
+import org.fife.ui.rtextarea.IconRowHeader;
+
+
+/**
+ * A row header component that takes code folding into account when painting
+ * itself.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldingAwareIconRowHeader extends IconRowHeader {
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public FoldingAwareIconRowHeader(RSyntaxTextArea textArea) {
+		super(textArea);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void paintComponent(Graphics g) {
+
+		// When line wrap is not enabled, take the faster code path.
+		if (textArea==null) {
+			return;
+		}
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		FoldManager fm = rsta.getFoldManager();
+		if (!fm.isCodeFoldingSupportedAndEnabled()) {
+			super.paintComponent(g);
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("IconRowHeader repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		g.setColor(getBackground());
+		g.fillRect(0,visibleRect.y, width,visibleRect.height);
+
+		if (textArea.getLineWrap()) {
+			paintComponentWrapped(g);
+			return;
+		}
+
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+
+		// Get the first line to paint.
+		int cellHeight = textArea.getLineHeight();
+		int topLine = (visibleRect.y-textAreaInsets.top)/cellHeight;
+		topLine += fm.getHiddenLineCountAbove(topLine, true);
+
+		// Get where to start painting (top of the row).
+		// We need to be "scrolled up" up just enough for the missing part of
+		// the first line.
+		int y = topLine*cellHeight + textAreaInsets.top;
+
+		// Paint the active line range.
+		if (activeLineRangeStart>-1 && activeLineRangeEnd>-1) {
+			Color activeLineRangeColor = getActiveLineRangeColor();
+			g.setColor(activeLineRangeColor);
+			try {
+
+				int y1 = rsta.yForLine(activeLineRangeStart);
+				if (y1>-1) { // Not in a collapsed fold...
+
+					int y2 = rsta.yForLine(activeLineRangeEnd);
+					if (y2==-1) { // In a collapsed fold
+						y2 = y1;
+					}
+					y2 += cellHeight - 1;
+
+					int j = y1;
+					while (j<=y2) {
+						int yEnd = Math.min(y2, j+getWidth());
+						int xEnd = yEnd-j;
+						g.drawLine(0,j, xEnd,yEnd);
+						j += 2;
+					}
+
+					int i = 2;
+					while (i<getWidth()) {
+						int yEnd = y1 + getWidth() - i;
+						g.drawLine(i,y1, getWidth(),yEnd);
+						i += 2;
+					}
+
+					if (y1>=y && y1<y+visibleRect.height) {
+						g.drawLine(0,y1, getWidth(),y1);
+					}
+					if (y2>=y && y2<y+visibleRect.height) {
+						g.drawLine(0,y2, getWidth(),y2);
+					}
+
+				}
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+
+		// Paint icons
+		if (trackingIcons!=null) {
+			int lastLine = textArea.getLineCount() - 1;
+			for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+				GutterIconInfo ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line<=lastLine && line>=topLine) {
+						try {
+							int lineY = rsta.yForLine(line);
+							if (lineY>=y && lineY<y+visibleRect.height) {
+								Icon icon = ti.getIcon();
+								if (icon!=null) {
+									int y2 = lineY + (cellHeight-icon.getIconHeight())/2;
+									ti.getIcon().paintIcon(this, g, 0, y2);
+									lastLine = line-1; // Paint only 1 icon per line
+								}
+							}
+						} catch (BadLocationException ble) {
+							ble.printStackTrace(); // Never happens
+						}
+					}
+					else if (line<topLine) {
+						break; // All other lines are above us, so quit now
+					}
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Paints icons when line wrapping is enabled.  Note that this does not
+	 * override the parent class's implementation to avoid this version being
+	 * called when line wrapping is disabled.
+	 */
+	private void paintComponentWrapped(Graphics g) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+//		boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+
+		int topY = visibleRect.y;
+		int bottomY = visibleRect.y + visibleRect.height;
+		int cellHeight = textArea.getLineHeight();
+
+		// Paint icons
+		if (trackingIcons!=null) {
+			int lastLine = textArea.getLineCount() - 1;
+			for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+				GutterIconInfo ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line<=lastLine && line>=topLine) {
+						try {
+							int lineY = rsta.yForLine(line);
+							if (lineY>=topY && lineY<bottomY) {
+								Icon icon = ti.getIcon();
+								if (icon!=null) {
+									int y2 = lineY + (cellHeight-icon.getIconHeight())/2;
+									ti.getIcon().paintIcon(this, g, 0, y2);
+									lastLine = line-1; // Paint only 1 icon per line
+								}
+							}
+						} catch (BadLocationException ble) {
+							ble.printStackTrace(); // Never happens
+						}
+					}
+					else if (line<topLine) {
+						break; // All other lines are above us, so quit now
+					}
+				}
+			}
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java	(revision 25584)
@@ -0,0 +1,141 @@
+/*
+ * 10/01/2009
+ *
+ * MarkOccurrencesHighlightPainter.java - Renders "marked occurrences."
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * Highlight painter that renders "mark occurrences."
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+/*
+ * NOTE: This implementation is a "hack" so typing at the "end" of the highlight
+ * does not extend it to include the newly-typed chars, which is the standard
+ * behavior of Swing Highlights.
+ */
+class MarkOccurrencesHighlightPainter extends ChangeableColorHighlightPainter {
+
+	private Color borderColor;
+	private boolean paintBorder;
+
+
+	/**
+	 * Creates a highlight painter that defaults to blue.
+	 */
+	public MarkOccurrencesHighlightPainter() {
+		super(Color.BLUE);
+	}
+
+
+	/**
+	 * Returns whether a border is painted around marked occurrences.
+	 *
+	 * @return Whether a border is painted.
+	 * @see #setPaintBorder(boolean)
+	 * @see #getColor()
+	 */
+	public boolean getPaintBorder() {
+		return paintBorder;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Shape paintLayer(Graphics g, int p0, int p1, Shape viewBounds,
+								JTextComponent c, View view) {
+
+		g.setColor(getColor());
+		p1++; // Workaround for Java Highlight issues.
+
+		// This special case isn't needed for most standard Swing Views (which
+		// always return a width of 1 for modelToView() calls), but it is
+		// needed for RSTA views, which actually return the width of chars for
+		// modelToView calls.  But this should be faster anyway, as we
+		// short-circuit and do only one modelToView() for one offset.
+		if (p0==p1) {
+			try {
+				Shape s = view.modelToView(p0, viewBounds,
+											Position.Bias.Forward);
+				Rectangle r = s.getBounds();
+				g.drawLine(r.x, r.y, r.x, r.y+r.height);
+				return r;
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+				return null;
+			}
+		}
+
+		if (p0 == view.getStartOffset() && p1 == view.getEndOffset()) {
+			// Contained in view, can just use bounds.
+			Rectangle alloc;
+			if (viewBounds instanceof Rectangle) {
+				alloc = (Rectangle) viewBounds;
+			} else {
+				alloc = viewBounds.getBounds();
+			}
+			g.fillRect(alloc.x, alloc.y, alloc.width, alloc.height);
+			return alloc;
+		}
+
+		// Should only render part of View.
+		Graphics2D g2d = (Graphics2D)g;
+		try {
+			// --- determine locations ---
+			Shape shape = view.modelToView(p0, Position.Bias.Forward, p1,
+					Position.Bias.Backward, viewBounds);
+			Rectangle r = (shape instanceof Rectangle) ? (Rectangle) shape
+												: shape.getBounds();
+			g2d.fillRect(r.x, r.y, r.width, r.height);
+			if (paintBorder) {
+				g2d.setColor(borderColor);
+				g2d.drawRect(r.x,r.y, r.width-1,r.height-1);
+			}
+			return r;
+		} catch (BadLocationException e) { // Never happens
+			e.printStackTrace();
+			return null;
+		}
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setColor(Color c) {
+		super.setColor(c);
+		borderColor = c.darker();
+	}
+
+
+	/**
+	 * Toggles whether a border is painted around highlights.
+	 *
+	 * @param paint Whether to paint a border.
+	 * @see #getPaintBorder()
+	 * @see #setColor(Color)
+	 */
+	public void setPaintBorder(boolean paint) {
+		this.paintBorder = paint;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java	(revision 25584)
@@ -0,0 +1,332 @@
+/*
+ * 01/06/2009
+ *
+ * MarkOccurrencesSupport.java - Handles marking all occurrences of the
+ * currently selected identifier in a text area.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Paint;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.Timer;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+
+
+
+/**
+ * Marks all occurrences of the token at the current caret position, if it is
+ * an identifier.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class MarkOccurrencesSupport implements CaretListener, ActionListener {
+
+	private RSyntaxTextArea textArea;
+	private Timer timer;
+	private MarkOccurrencesHighlightPainter p;
+	private List tags;
+
+	/**
+	 * The default color used to mark occurrences.
+	 */
+	public static final Color DEFAULT_COLOR = new Color(224, 224, 224);
+
+	/**
+	 * The default delay.
+	 */
+	private static final int DEFAULT_DELAY_MS = 1000;
+
+
+	/**
+	 * Constructor.  Creates a listener with a 1 second delay.
+	 */
+	public MarkOccurrencesSupport() {
+		this(DEFAULT_DELAY_MS);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param delay The delay between when the caret last moves and when the
+	 *        text should be scanned for matching occurrences.  This should
+	 *        be in milliseconds.
+	 */
+	public MarkOccurrencesSupport(int delay) {
+		this(delay, DEFAULT_COLOR);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param delay The delay between when the caret last moves and when the
+	 *        text should be scanned for matching occurrences.  This should
+	 *        be in milliseconds.
+	 * @param color The color to use to mark the occurrences.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public MarkOccurrencesSupport(int delay, Color color) {
+		timer = new Timer(delay, this);
+		timer.setRepeats(false);
+		p = new MarkOccurrencesHighlightPainter();
+		setColor(color);
+		tags = new ArrayList();
+	}
+
+
+	/**
+	 * Called after the caret has been moved and a fixed time delay has
+	 * elapsed.  This locates and highlights all occurrences of the identifier
+	 * at the caret position, if any.
+	 *
+	 * @param e The event.
+	 */
+	public void actionPerformed(ActionEvent e) {
+
+		// Don't do anything if they are selecting text.
+		Caret c = textArea.getCaret();
+		if (c.getDot()!=c.getMark()) {
+			return;
+		}
+
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+		//long time = System.currentTimeMillis();
+		doc.readLock();
+		try {
+
+			// Remove old highlights
+			removeHighlights();
+
+			// Get the token at the caret position.
+			int line = textArea.getCaretLineNumber();
+			Token tokenList = textArea.getTokenListForLine(line);
+			int dot = c.getDot();
+			Token t = RSyntaxUtilities.getTokenAtOffset(tokenList, dot);
+			if (t==null /* EOL */ || !isValidType(t) || isNonWordChar(t)) {
+				// Try to the "left" of the caret.
+				dot--;
+				try {
+					if (dot>=textArea.getLineStartOffset(line)) {
+						t = RSyntaxUtilities.getTokenAtOffset(tokenList, dot);
+					}
+				} catch (BadLocationException ble) {
+					ble.printStackTrace(); // Never happens
+				}
+			}
+
+			// Add new highlights if an identifier is selected.
+			if (t!=null && isValidType(t) && !isNonWordChar(t)) {
+				RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)textArea.
+															getHighlighter();
+				char[] lexeme = t.getLexeme().toCharArray();
+				int type = t.type;
+				for (int i=0; i<textArea.getLineCount(); i++) {
+					Token temp = textArea.getTokenListForLine(i);
+					while (temp!=null && temp.isPaintable()) {
+						if (temp.is(type, lexeme)) {
+							try {
+								int end = temp.offset + temp.textCount;
+Object tag = h.addMarkedOccurrenceHighlight(temp.offset, end, p);
+//								end--; // HACK to prevent typed chars from being added
+//								Object tag = h.addHighlight(temp.offset, end,p);
+								tags.add(tag);
+//								// HACK again, to ensure repaint of last char rendered.
+//								textArea.getUI().damageRange(textArea, end+1, end+1);
+							} catch (BadLocationException ble) {
+								ble.printStackTrace(); // Never happens
+							}
+						}
+						temp = temp.getNextToken();
+					}
+				}
+			}
+
+		} finally {
+			doc.readUnlock();
+			//time = System.currentTimeMillis() - time;
+			//System.out.println("Took: " + time + " ms");
+		}
+
+		textArea.fireMarkedOccurrencesChanged();
+
+	}
+
+
+	/**
+	 * Called when the caret moves in the text area.
+	 *
+	 * @param e The event.
+	 */
+	public void caretUpdate(CaretEvent e) {
+		timer.restart();
+	}
+
+
+	/**
+	 * Returns the color being used to mark occurrences.
+	 *
+	 * @return The color being used.
+	 * @see #setColor(Paint)
+	 */
+	public Color getColor() {
+		return p.getColor();
+	}
+
+
+	/**
+	 * Returns the delay, in milliseconds.
+	 *
+	 * @return The delay.
+	 * @see #setDelay(int)
+	 */
+	public int getDelay() {
+		return timer.getDelay();
+	}
+
+
+	/**
+	 * Returns whether a border is painted around marked occurrences.
+	 *
+	 * @return Whether a border is painted.
+	 * @see #setPaintBorder(boolean)
+	 * @see #getColor()
+	 */
+	public boolean getPaintBorder() {
+		return p.getPaintBorder();
+	}
+
+
+	/**
+	 * Installs this listener on a text area.  If it is already installed on
+	 * another text area, it is uninstalled first.
+	 *
+	 * @param textArea The text area to install on.
+	 */
+	public void install(RSyntaxTextArea textArea) {
+		if (this.textArea!=null) {
+			uninstall();
+		}
+		this.textArea = textArea;
+		textArea.addCaretListener(this);
+		if (textArea.getMarkOccurrencesColor()!=null) {
+			setColor(textArea.getMarkOccurrencesColor());
+		}
+	}
+
+
+	/**
+	 * Returns whether the specified token is a single non-word char (e.g. not
+	 * in <tt>[A-Za-z]</tt>.  This is a HACK to work around the fact that many
+	 * standard token makers return things like semicolons and periods as
+	 * {@link Token#IDENTIFIER}s just to make the syntax highlighting coloring
+	 * look a little better.
+	 * 
+	 * @param t The token to check.  This cannot be <tt>null</tt>.
+	 * @return Whether the token is a single non-word char.
+	 */
+	private static final boolean isNonWordChar(Token t) {
+		return t.textCount==1 &&
+				!RSyntaxUtilities.isLetter(t.text[t.textOffset]);
+	}
+
+
+	/**
+	 * Returns whether the specified token is a type that we can do a
+	 * "mark occurrences" on.
+	 *
+	 * @param t The token.
+	 * @return Whether we should mark all occurrences of this token.
+	 */
+	private boolean isValidType(Token t) {
+		return textArea.getMarkOccurrencesOfTokenType(t.type);
+	}
+
+
+	/**
+	 * Removes all highlights added to the text area by this listener.
+	 */
+	private void removeHighlights() {
+		if (textArea!=null) {
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+													textArea.getHighlighter();
+			for (int i=0; i<tags.size(); i++) {
+				h.removeMarkOccurrencesHighlight(tags.get(i));
+			}
+		}
+		tags.clear();
+	}
+
+
+	/**
+	 * Sets the color to use when marking occurrences.
+	 *
+	 * @param color The color to use.
+	 * @see #getColor()
+	 * @see #setPaintBorder(boolean)
+	 */
+	public void setColor(Color color) {
+		p.setColor(color);
+		if (textArea!=null) {
+			removeHighlights();
+			caretUpdate(null); // Force a highlight repaint.
+		}
+	}
+
+
+	/**
+	 * Sets the delay between the last caret position change and when the
+	 * text is scanned for matching identifiers.  A delay is needed to prevent
+	 * repeated scanning while the user is typing.
+	 *
+	 * @param delay The new delay.
+	 * @see #getDelay()
+	 */
+	public void setDelay(int delay) {
+		timer.setDelay(delay);
+	}
+
+
+	/**
+	 * Toggles whether a border is painted around marked highlights.
+	 *
+	 * @param paint Whether to paint a border.
+	 * @see #getPaintBorder()
+	 * @see #setColor(Color)
+	 */
+	public void setPaintBorder(boolean paint) {
+		if (paint!=p.getPaintBorder()) {
+			p.setPaintBorder(paint);
+			if (textArea!=null) {
+				textArea.repaint();
+			}
+		}
+	}
+
+
+	/**
+	 * Uninstalls this listener from the current text area.  Does nothing if
+	 * it not currently installed on any text area.
+	 *
+	 * @see #install(RSyntaxTextArea)
+	 */
+	public void uninstall() {
+		if (textArea!=null) {
+			removeHighlights();
+			textArea.removeCaretListener(this);
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ParserManager.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ParserManager.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/ParserManager.java	(revision 25584)
@@ -0,0 +1,707 @@
+/*
+ * 09/26/2005
+ *
+ * ParserManager.java - Manages the parsing of an RSyntaxTextArea's document,
+ * if necessary.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.net.URL;
+import java.security.AccessControlException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.Timer;
+import javax.swing.ToolTipManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+import org.fife.ui.rsyntaxtextarea.parser.ParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rsyntaxtextarea.parser.ToolTipInfo;
+
+
+
+/**
+ * Manages running a parser object for an <code>RSyntaxTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+class ParserManager implements DocumentListener, ActionListener,
+								HyperlinkListener {
+
+	private RSyntaxTextArea textArea;
+	private List parsers;
+	private Timer timer;
+	private boolean running;
+	private Parser parserForTip;
+	private Position firstOffsetModded;
+	private Position lastOffsetModded;
+
+	/**
+	 * Mapping of notices to their highlights in the editor.  Can't use a Map
+	 * since parsers could return two <code>ParserNotice</code>s that compare
+	 * equally via <code>equals()</code>.  Real-world example:  The Perl
+	 * compiler will return 2+ identical error messages if the same error is
+	 * committed in a single line more than once.
+	 */
+	private List noticeHighlightPairs;
+
+	/**
+	 * Painter used to underline errors.
+	 */
+	private SquiggleUnderlineHighlightPainter parserErrorHighlightPainter =
+						new SquiggleUnderlineHighlightPainter(Color.RED);
+
+	/**
+	 * If this system property is set to <code>true</code>, debug messages
+	 * will be printed to stdout to help diagnose parsing issues.
+	 */
+	private static final String PROPERTY_DEBUG_PARSING = "rsta.debugParsing";
+
+	/**
+	 * Whether to print debug messages while running parsers.
+	 */
+	private static final boolean DEBUG_PARSING;
+
+	/**
+	 * The default delay between the last key press and when the document
+	 * is parsed, in milliseconds.
+	 */
+	private static final int DEFAULT_DELAY_MS		= 1250;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area whose document the parser will be
+	 *        parsing.
+	 */
+	public ParserManager(RSyntaxTextArea textArea) {
+		this(DEFAULT_DELAY_MS, textArea);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param delay The delay between the last key press and when the document
+	 *        is parsed.
+	 * @param textArea The text area whose document the parser will be
+	 *        parsing.
+	 */
+	public ParserManager(int delay, RSyntaxTextArea textArea) {
+		this.textArea = textArea;
+		textArea.getDocument().addDocumentListener(this);
+		parsers = new ArrayList(1); // Usually small
+		timer = new Timer(delay, this);
+		timer.setRepeats(false);
+		running = true;
+	}
+
+
+	/**
+	 * Called when the timer fires (e.g. it's time to parse the document).
+	 * 
+	 * @param e The event.
+	 */
+	public void actionPerformed(ActionEvent e) {
+
+		// Sanity check - should have >1 parser if event is fired.
+		int parserCount = getParserCount();
+		if (parserCount==0) {
+			return;
+		}
+
+		long begin = 0;
+		if (DEBUG_PARSING) {
+			begin = System.currentTimeMillis();
+		}
+
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+		Element root = doc.getDefaultRootElement();
+		int firstLine = firstOffsetModded==null ? 0 : root.getElementIndex(firstOffsetModded.getOffset());
+		int lastLine = lastOffsetModded==null ? root.getElementCount()-1 : root.getElementIndex(lastOffsetModded.getOffset());
+		firstOffsetModded = lastOffsetModded = null;
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: Minimum lines to parse: " + firstLine + "-" + lastLine);
+		}
+
+		String style = textArea.getSyntaxEditingStyle();
+		doc.readLock();
+		try {
+			for (int i=0; i<parserCount; i++) {
+				Parser parser = getParser(i);
+				if (parser.isEnabled()) {
+					ParseResult res = parser.parse(doc, style);
+					addParserNoticeHighlights(res);
+				}
+				else {
+					clearParserNoticeHighlights(parser);
+				}
+			}
+			textArea.fireParserNoticesChange();
+		} finally {
+			doc.readUnlock();
+		}
+
+		if (DEBUG_PARSING) {
+			float time = (System.currentTimeMillis()-begin)/1000f;
+			System.out.println("Total parsing time: " + time + " seconds");
+		}
+
+	}
+
+
+	/**
+	 * Adds a parser for the text area.
+	 *
+	 * @param parser The new parser.  If this is <code>null</code>, nothing
+	 *        happens.
+	 * @see #getParser(int)
+	 * @see #removeParser(Parser)
+	 */
+	public void addParser(Parser parser) {
+		if (parser!=null && !parsers.contains(parser)) {
+			if (running) {
+				timer.stop();
+			}
+			parsers.add(parser);
+			if (parsers.size()==1) {
+				// Okay to call more than once.
+				ToolTipManager.sharedInstance().registerComponent(textArea);
+			}
+			if (running) {
+				timer.restart();
+			}
+		}
+	}
+
+
+	/**
+	 * Adds highlights for a list of parser notices.  Any current notices
+	 * from the same Parser, in the same parsed range, are removed.
+	 *
+	 * @param res The result of a parsing.
+	 * @see #clearParserNoticeHighlights()
+	 */
+	private void addParserNoticeHighlights(ParseResult res) {
+
+		// Parsers are supposed to return at least empty ParseResults, but
+		// we'll be defensive here.
+		if (res==null) {
+			return;
+		}
+
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: Adding parser notices from " +
+								res.getParser());
+		}
+
+		if (noticeHighlightPairs==null) {
+			noticeHighlightPairs = new ArrayList();
+		}
+
+		removeParserNotices(res);
+
+		List notices = res.getNotices();
+		if (notices.size()>0) { // Guaranteed non-null
+
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+													textArea.getHighlighter();
+
+			for (Iterator i=notices.iterator(); i.hasNext(); ) {
+				ParserNotice notice = (ParserNotice)i.next();
+				if (DEBUG_PARSING) {
+					System.out.println("[DEBUG]: ... adding: " + notice);
+				}
+				try {
+					Object highlight = null;
+					if (notice.getShowInEditor()) {
+						highlight = h.addParserHighlight(notice,
+											parserErrorHighlightPainter);
+					}
+					noticeHighlightPairs.add(new NoticeHighlightPair(notice, highlight));
+				} catch (BadLocationException ble) { // Never happens
+					ble.printStackTrace();
+				}
+			}
+
+		}
+
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: Done adding parser notices from " +
+								res.getParser());
+		}
+
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void changedUpdate(DocumentEvent e) {
+	}
+
+
+	private void clearParserNoticeHighlights() {
+		RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+											textArea.getHighlighter();
+		if (h!=null) {
+			h.clearParserHighlights();
+		}
+		if (noticeHighlightPairs!=null) {
+			noticeHighlightPairs.clear();
+		}
+	}
+
+
+	/**
+	 * Removes all parser notice highlights for a specific parser.
+	 *
+	 * @param parser The parser whose highlights to remove.
+	 */
+	private void clearParserNoticeHighlights(Parser parser) {
+		RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+											textArea.getHighlighter();
+		if (h!=null) {
+			h.clearParserHighlights(parser);
+		}
+		if (noticeHighlightPairs!=null) {
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				if (pair.notice.getParser()==parser) {
+					i.remove();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Removes all parsers and any highlights they have created.
+	 *
+	 * @see #addParser(Parser)
+	 */
+	public void clearParsers() {
+		timer.stop();
+		clearParserNoticeHighlights();
+		parsers.clear();
+		textArea.fireParserNoticesChange();
+	}
+
+
+	/**
+	 * Forces the given {@link Parser} to re-parse the content of this text
+	 * area.<p>
+	 * 
+	 * This method can be useful when a <code>Parser</code> can be configured
+	 * as to what notices it returns.  For example, if a Java language parser
+	 * can be configured to set whether no serialVersionUID is a warning,
+	 * error, or ignored, this method can be called after changing the expected
+	 * notice type to have the document re-parsed.
+	 *
+	 * @param parser The index of the <code>Parser</code> to re-run.
+	 * @see #getParser(int)
+	 */
+	public void forceReparsing(int parser) {
+		Parser p = getParser(parser);
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+		String style = textArea.getSyntaxEditingStyle();
+		doc.readLock();
+		try {
+			if (p.isEnabled()) {
+				ParseResult res = p.parse(doc, style);
+				addParserNoticeHighlights(res);
+			}
+			else {
+				clearParserNoticeHighlights(p);
+			}
+			textArea.fireParserNoticesChange();
+		} finally {
+			doc.readUnlock();
+		}
+	}
+
+
+	/**
+	 * Returns the delay between the last "concurrent" edit and when the
+	 * document is re-parsed.
+	 *
+	 * @return The delay, in milliseconds.
+	 * @see #setDelay(int)
+	 */
+	public int getDelay() {
+		return timer.getDelay();
+	}
+
+
+	/**
+	 * Returns the specified parser.
+	 *
+	 * @param index The index of the parser.
+	 * @return The parser.
+	 * @see #getParserCount()
+	 * @see #addParser(Parser)
+	 * @see #removeParser(Parser)
+	 */
+	public Parser getParser(int index) {
+		return (Parser)parsers.get(index);
+	}
+
+
+	/**
+	 * Returns the number of registered parsers.
+	 *
+	 * @return The number of registered parsers.
+	 */
+	public int getParserCount() {
+		return parsers.size();
+	}
+
+
+	/**
+	 * Returns a list of the current parser notices for this text area.
+	 * This method (like most Swing methods) should only be called on the
+	 * EDT.
+	 *
+	 * @return The list of notices.  This will be an empty list if there are
+	 *         none.
+	 */
+	public List getParserNotices() {
+		List notices = new ArrayList();
+		if (noticeHighlightPairs!=null) {
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				notices.add(pair.notice);
+			}
+		}
+		return notices;
+	}
+
+
+	/**
+	 * Returns the tool tip to display for a mouse event at the given
+	 * location.  This method is overridden to give a registered parser a
+	 * chance to display a tool tip (such as an error description when the
+	 * mouse is over an error highlight).
+	 *
+	 * @param e The mouse event.
+	 * @return The tool tip to display, and possibly a hyperlink event handler. 
+	 */
+	public ToolTipInfo getToolTipText(MouseEvent e) {
+
+		String tip = null;
+		HyperlinkListener listener = null;
+		parserForTip = null;
+
+//		try {
+			int pos = textArea.viewToModel(e.getPoint());
+			/*
+			Highlighter.Highlight[] highlights = textArea.getHighlighter().
+												getHighlights();
+			for (int i=0; i<highlights.length; i++) {
+				Highlighter.Highlight h = highlights[i];
+				//if (h instanceof ParserNoticeHighlight) {
+				//	ParserNoticeHighlight pnh = (ParserNoticeHighlight)h;
+					int start = h.getStartOffset();
+					int end = h.getEndOffset();
+					if (start<=pos && end>=pos) {
+						//return pnh.getMessage();
+						return textArea.getText(start, end-start);
+					}
+				//}
+			}
+			*/
+			if (noticeHighlightPairs!=null) {
+				for (int j=0; j<noticeHighlightPairs.size(); j++) {
+					NoticeHighlightPair pair =
+						(NoticeHighlightPair)noticeHighlightPairs.get(j);
+					ParserNotice notice = pair.notice;
+					if (notice.containsPosition(pos)) {
+						tip = notice.getToolTipText();
+						parserForTip = notice.getParser();
+						if (parserForTip instanceof HyperlinkListener) {
+							listener = (HyperlinkListener)parserForTip;
+						}
+						break;
+					}
+				}
+			}
+//		} catch (BadLocationException ble) {
+//			ble.printStackTrace();	// Should never happen.
+//		}
+
+		URL imageBase = parserForTip==null ? null : parserForTip.getImageBase();
+		return new ToolTipInfo(tip, listener, imageBase);
+
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void handleDocumentEvent(DocumentEvent e) {
+		if (running && parsers.size()>0) {
+			timer.restart();
+		}
+	}
+
+
+	/**
+	 * Called when the user clicks a hyperlink in a {@link FocusableTip}.
+	 *
+	 * @param e The event.
+	 */
+	public void hyperlinkUpdate(HyperlinkEvent e) {
+		if (parserForTip!=null && parserForTip.getHyperlinkListener()!=null) {
+			parserForTip.getHyperlinkListener().linkClicked(textArea, e);
+		}
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void insertUpdate(DocumentEvent e) {
+
+		// Keep track of the first and last offset modified.  Some parsers are
+		// smart and will only re-parse this section of the file.
+		try {
+			int offs = e.getOffset();
+			if (firstOffsetModded==null || offs<firstOffsetModded.getOffset()) {
+				firstOffsetModded = e.getDocument().createPosition(offs);
+			}
+			offs = e.getOffset() + e.getLength();
+			if (lastOffsetModded==null || offs>lastOffsetModded.getOffset()) {
+				lastOffsetModded = e.getDocument().createPosition(offs);
+			}
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Shouldn't happen
+		}
+
+		handleDocumentEvent(e);
+
+	}
+
+
+	/**
+	 * Removes a parser.
+	 *
+	 * @param parser The parser to remove.
+	 * @return Whether the parser was found.
+	 * @see #addParser(Parser)
+	 * @see #getParser(int)
+	 */
+	public boolean removeParser(Parser parser) {
+		removeParserNotices(parser);
+		boolean removed = parsers.remove(parser);
+		if (removed) {
+			textArea.fireParserNoticesChange();
+		}
+		return removed;
+	}
+
+
+	/**
+	 * Removes all parser notices (and clears highlights in the editor) from
+	 * a particular parser.
+	 *
+	 * @param parser The parser.
+	 */
+	private void removeParserNotices(Parser parser) {
+		if (noticeHighlightPairs!=null) {
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+												textArea.getHighlighter();
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				if (pair.notice.getParser()==parser && pair.highlight!=null) {
+					h.removeParserHighlight(pair.highlight);
+					i.remove();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Removes any currently stored notices (and the corresponding highlights
+	 * from the editor) from the same Parser, and in the given line range,
+	 * as in the results.
+	 *
+	 * @param res The results.
+	 */
+	private void removeParserNotices(ParseResult res) {
+		if (noticeHighlightPairs!=null) {
+			RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+												textArea.getHighlighter();
+			for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+				NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+				boolean removed = false;
+				if (shouldRemoveNotice(pair.notice, res)) {
+					if (pair.highlight!=null) {
+						h.removeParserHighlight(pair.highlight);
+					}
+					i.remove();
+					removed = true;
+				}
+				if (DEBUG_PARSING) {
+					String text = removed ? "[DEBUG]: ... notice removed: " :
+											"[DEBUG]: ... notice not removed: ";
+					System.out.println(text + pair.notice);
+				}
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * Called when the document is modified.
+	 *
+	 * @param e The document event.
+	 */
+	public void removeUpdate(DocumentEvent e) {
+
+		// Keep track of the first and last offset modified.  Some parsers are
+		// smart and will only re-parse this section of the file.  Note that
+		// for removals, only the line at the removal start needs to be
+		// re-parsed.
+		try {
+			int offs = e.getOffset();
+			if (firstOffsetModded==null || offs<firstOffsetModded.getOffset()) {
+				firstOffsetModded = e.getDocument().createPosition(offs);
+			}
+			if (lastOffsetModded==null || offs>lastOffsetModded.getOffset()) {
+				lastOffsetModded = e.getDocument().createPosition(offs);
+			}
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+		}
+
+		handleDocumentEvent(e);
+
+	}
+
+
+	/**
+	 * Restarts parsing the document.
+	 *
+	 * @see #stopParsing()
+	 */
+	public void restartParsing() {
+		timer.restart();
+		running = true;
+	}
+
+
+	/**
+	 * Sets the delay between the last "concurrent" edit and when the document
+	 * is re-parsed.
+	 *
+	 * @param millis The new delay, in milliseconds.  This must be greater
+	 *        than <code>0</code>.
+	 * @see #getDelay()
+	 */
+	public void setDelay(int millis) {
+		if (running) {
+			timer.stop();
+		}
+		timer.setDelay(millis);
+		if (running) {
+			timer.start();
+		}
+	}
+
+
+	/**
+	 * Returns whether a parser notice should be removed, based on a parse
+	 * result.
+	 *
+	 * @param notice The notice in question.
+	 * @param res The result.
+	 * @return Whether the notice should be removed.
+	 */
+	private final boolean shouldRemoveNotice(ParserNotice notice,
+											ParseResult res) {
+
+		if (DEBUG_PARSING) {
+			System.out.println("[DEBUG]: ... ... shouldRemoveNotice " +
+					notice + ": " + (notice.getParser()==res.getParser()));
+		}
+
+		// NOTE: We must currently remove all notices for the parser.  Parser
+		// implementors are required to parse the entire document each parsing
+		// request, as RSTA is not yet sophisticated enough to determine the
+		// minimum range of text to parse (and ParserNotices' locations aren't
+		// updated when the Document is mutated, which would be a requirement
+		// for this as well).
+		// return same_parser && (in_reparsed_range || in_deleted_end_of_doc)
+		return notice.getParser()==res.getParser();
+
+	}
+
+
+	/**
+	 * Stops parsing the document.
+	 *
+	 * @see #restartParsing()
+	 */
+	public void stopParsing() {
+		timer.stop();
+		running = false;
+	}
+
+
+	/**
+	 * Mapping of a parser notice to its highlight in the editor.
+	 */
+	private static class NoticeHighlightPair {
+
+		public ParserNotice notice;
+		public Object highlight;
+
+		public NoticeHighlightPair(ParserNotice notice, Object highlight) {
+			this.notice = notice;
+			this.highlight = highlight;
+		}
+
+	}
+
+
+	static {
+		boolean debugParsing = false;
+		try {
+			debugParsing = Boolean.getBoolean(PROPERTY_DEBUG_PARSING);
+		} catch (AccessControlException ace) {
+			// Likely an applet's security manager.
+			debugParsing = false; // FindBugs
+		}
+		DEBUG_PARSING = debugParsing;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java	(revision 25584)
@@ -0,0 +1,68 @@
+/*
+ * 01/11/2011
+ *
+ * PopupWindowDecorator.java - Hook allowing hosting applications to decorate
+ * JWindows created by the AutoComplete library.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.JWindow;
+
+
+/**
+ * A hook allowing hosting applications to decorate JWindows created by the
+ * AutoComplete library.  For example, you could use the
+ * <a href="http://jgoodies.com/">JGoodies</a> library to add drop shadows
+ * to the windows. 
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class PopupWindowDecorator {
+
+	/**
+	 * The singleton instance of this class.
+	 */
+	private static PopupWindowDecorator decorator;
+
+
+	/**
+	 * Callback called whenever an appropriate JWindow is created by the
+	 * AutoComplete library.  Implementations can decorate the window however
+	 * they see fit.
+	 *
+	 * @param window The newly-created window.
+	 */
+	public abstract void decorate(JWindow window);
+
+
+	/**
+	 * Returns the singleton instance of this class.  This should only be
+	 * called on the EDT.
+	 *
+	 * @return The singleton instance of this class, or <code>null</code>
+	 *         for none.
+	 * @see #set(PopupWindowDecorator)
+	 */
+	public static PopupWindowDecorator get() {
+		return decorator;
+	}
+
+
+	/**
+	 * Sets the singleton instance of this class.  This should only be called
+	 * on the EDT.
+	 *
+	 * @param decorator The new instance of this class.  This may be
+	 *        <code>null</code>.
+	 * @see #get()
+	 */
+	public static void set(PopupWindowDecorator decorator) {
+		PopupWindowDecorator.decorator = decorator;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSTAView.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSTAView.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSTAView.java	(revision 25584)
@@ -0,0 +1,62 @@
+/*
+ * 02/10/2009
+ *
+ * RSTAView.java - An <code>RSyntaxTextArea</code> view.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Rectangle;
+
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * Utility methods for RSyntaxTextArea's views.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+interface RSTAView {
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.<p>
+	 *
+	 * This method is quicker than using traditional
+	 * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+	 * computed.
+	 *
+	 * @param alloc The area the text area can render into.
+	 * @param line The line number.
+	 * @return The y-coordinate of the top of the line, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>line</code> isn't a valid line
+	 *         number for this document.
+	 */
+	public int yForLine(Rectangle alloc, int line) throws BadLocationException;
+
+
+	/**
+	 * Returns the y-coordinate of the line containing a specified offset.<p>
+	 *
+	 * This method is quicker than using traditional
+	 * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+	 * computed.
+	 *
+	 * @param alloc The area the text area can render into.
+	 * @param offs The offset info the document.
+	 * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>offs</code> isn't a valid offset
+	 *         into the document.
+	 */
+	public int yForLineContaining(Rectangle alloc, int offs)
+											throws BadLocationException;
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java	(revision 25584)
@@ -0,0 +1,643 @@
+/*
+ * 10/16/2004
+ *
+ * RSyntaxDocument.java - A document capable of syntax highlighting, used by
+ * RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import javax.swing.Action;
+import javax.swing.event.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.modes.AbstractMarkupTokenMaker;
+import org.fife.util.DynamicIntArray;
+
+
+/**
+ * The document used by {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea}.
+ * This document is like <code>javax.swing.text.PlainDocument</code> except that
+ * it also keeps track of syntax highlighting in the document.  It has a "style"
+ * attribute associated with it that determines how syntax highlighting is done
+ * (i.e., what language is being highlighted).<p>
+ *
+ * Instances of <code>RSyntaxTextArea</code> will only accept instances of
+ * <code>RSyntaxDocument</code>, since it is this document that keeps
+ * track of syntax highlighting.  All others will cause an exception to be
+ * thrown.<p>
+ *
+ * To change the language being syntax highlighted at any time, you merely have
+ * to call {@link #setSyntaxStyle}.  Other than that, this document can be
+ * treated like any other save one caveat:  all <code>DocumentEvent</code>s of
+ * type <code>CHANGE</code> use their offset and length values to represent the
+ * first and last lines, respectively, that have had their syntax coloring
+ * change.  This is really a hack to increase the speed of the painting code
+ * and should really be corrected, but oh well. 
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RSyntaxDocument extends PlainDocument implements SyntaxConstants {
+
+	/**
+	 * Creates a {@link TokenMaker} appropriate for a given programming
+	 * language.
+	 */
+	private transient TokenMakerFactory tokenMakerFactory;
+
+	/**
+	 * Splits text into tokens for the current programming language.
+	 */
+	private transient TokenMaker tokenMaker;
+
+	/**
+	 * The current syntax style.  Only cached to keep this class serializable.
+	 */
+	private String syntaxStyle;
+
+	/**
+	 * Array of values representing the "last token type" on each line.  This
+	 * is used in cases such as multiline comments:  if the previous line
+	 * ended with an (unclosed) multiline comment, we can use this knowledge
+	 * and start the current line's syntax highlighting in multiline comment
+	 * state.
+	 */
+	protected transient DynamicIntArray lastTokensOnLines;
+
+	private transient Segment s;
+
+
+	/**
+	 * Constructs a plain text document.  A default root element is created,
+	 * and the tab size set to 5.
+	 *
+	 * @param syntaxStyle The syntax highlighting scheme to use.
+	 */
+	public RSyntaxDocument(String syntaxStyle) {
+		this(null, syntaxStyle);
+	}
+
+
+	/**
+	 * Constructs a plain text document.  A default root element is created,
+	 * and the tab size set to 5.
+	 *
+	 * @param tmf The <code>TokenMakerFactory</code> for this document.  If
+	 *        this is <code>null</code>, a default factory is used.
+	 * @param syntaxStyle The syntax highlighting scheme to use.
+	 */
+	public RSyntaxDocument(TokenMakerFactory tmf, String syntaxStyle) {
+		super(new RGapContent());
+		putProperty(tabSizeAttribute, new Integer(5));
+		lastTokensOnLines = new DynamicIntArray(400);
+		lastTokensOnLines.add(Token.NULL); // Initial (empty) line.
+		s = new Segment();
+		setTokenMakerFactory(tmf);
+		setSyntaxStyle(syntaxStyle);
+	}
+
+
+	/**
+	 * Returns the character in the document at the specified offset.
+	 *
+	 * @param offset The offset of the character.
+	 * @return The character.
+	 * @throws BadLocationException If the offset is invalid.
+	 */
+	public char charAt(int offset) throws BadLocationException {
+		return ((RGapContent)getContent()).charAt(offset);
+	}
+
+
+	/**
+	 * Alerts all listeners to this document of an insertion.  This is
+	 * overridden so we can update our syntax highlighting stuff.<p>
+	 * The syntax highlighting stuff has to be here instead of in
+	 * <code>insertUpdate</code> because <code>insertUpdate</code> is not
+	 * called by the undo/redo actions, but this method is.
+	 *
+	 * @param e The change.
+	 */
+	protected void fireInsertUpdate(DocumentEvent e) {
+
+		/*
+		 * Now that the text is actually inserted into the content and
+		 * element structure, we can update our token elements and "last
+		 * tokens on lines" structure.
+		 */
+
+		Element lineMap = getDefaultRootElement();
+		DocumentEvent.ElementChange change = e.getChange(lineMap);
+		Element[] added = change==null ? null : change.getChildrenAdded();
+
+		int numLines = lineMap.getElementCount();
+		int line = lineMap.getElementIndex(e.getOffset());
+		int previousLine = line - 1;
+		int previousTokenType = (previousLine>-1 ?
+					lastTokensOnLines.get(previousLine) : Token.NULL);
+
+		// If entire lines were added...
+		if (added!=null && added.length>0) {
+
+			Element[] removed = change.getChildrenRemoved();
+			int numRemoved = removed!=null ? removed.length : 0;
+
+			int endBefore = line + added.length - numRemoved;
+			//System.err.println("... adding lines: " + line + " - " + (endBefore-1));
+			//System.err.println("... ... added: " + added.length + ", removed:" + numRemoved);
+			for (int i=line; i<endBefore; i++) {
+
+				setSharedSegment(i); // Loads line i's text into s.
+
+				int tokenType = tokenMaker.getLastTokenTypeOnLine(s, previousTokenType);
+				lastTokensOnLines.add(i, tokenType);
+				//System.err.println("--------- lastTokensOnLines.size() == " + lastTokensOnLines.getSize());
+
+				previousTokenType = tokenType;
+
+			} // End of for (int i=line; i<endBefore; i++).
+
+			// Update last tokens for lines below until they stop changing.
+			updateLastTokensBelow(endBefore, numLines, previousTokenType);
+
+		} // End of if (added!=null && added.length>0).
+
+		// Otherwise, text was inserted on a single line...
+		else {
+
+			// Update last tokens for lines below until they stop changing.
+			updateLastTokensBelow(line, numLines, previousTokenType);
+
+		} // End of else.
+
+		// Let all listeners know about the insertion.
+		super.fireInsertUpdate(e);
+
+	}
+
+
+	/**
+	 * This method is called AFTER the content has been inserted into the
+	 * document and the element structure has been updated.<p>
+	 * The syntax-highlighting updates need to be done here (as opposed to
+	 * an override of <code>postRemoveUpdate</code>) as this method is called
+	 * in response to undo/redo events, whereas <code>postRemoveUpdate</code>
+	 * is not.<p>
+	 * Now that the text is actually inserted into the content and element
+	 * structure, we can update our token elements and "last tokens on
+	 * lines" structure.
+	 *
+	 * @param chng The change that occurred.
+	 * @see #removeUpdate
+	 */
+	protected void fireRemoveUpdate(DocumentEvent chng) {
+
+		Element lineMap = getDefaultRootElement();
+		int numLines = lineMap.getElementCount();
+
+		DocumentEvent.ElementChange change = chng.getChange(lineMap);
+		Element[] removed = change==null ? null : change.getChildrenRemoved();
+
+		// If entire lines were removed...
+		if (removed!=null && removed.length>0) {
+
+			int line = change.getIndex();	// First line entirely removed.
+			int previousLine = line - 1;	// Line before that.
+			int previousTokenType = (previousLine>-1 ?
+					lastTokensOnLines.get(previousLine) : Token.NULL);
+
+			Element[] added = change.getChildrenAdded();
+			int numAdded = added==null ? 0 : added.length;
+
+			// Remove the cached last-token values for the removed lines.
+			int endBefore = line + removed.length - numAdded;
+			//System.err.println("... removing lines: " + line + " - " + (endBefore-1));
+			//System.err.println("... added: " + numAdded + ", removed: " + removed.length);
+
+			lastTokensOnLines.removeRange(line, endBefore); // Removing values for lines [line-(endBefore-1)].
+			//System.err.println("--------- lastTokensOnLines.size() == " + lastTokensOnLines.getSize());
+
+			// Update last tokens for lines below until they've stopped changing.
+			updateLastTokensBelow(line, numLines, previousTokenType);
+
+		} // End of if (removed!=null && removed.size()>0).
+
+		// Otherwise, text was removed from just one line...
+		else {
+
+			int line = lineMap.getElementIndex(chng.getOffset());
+			if (line>=lastTokensOnLines.getSize())
+				return;	// If we're editing the last line in a document...
+
+			int previousLine = line - 1;
+			int previousTokenType = (previousLine>-1 ?
+					lastTokensOnLines.get(previousLine) : Token.NULL);
+			//System.err.println("previousTokenType for line : " + previousLine + " is " + previousTokenType);
+			// Update last tokens for lines below until they've stopped changing.
+			updateLastTokensBelow(line, numLines, previousTokenType);
+
+		}
+
+		// Let all of our listeners know about the removal.
+		super.fireRemoveUpdate(chng);
+
+	}
+
+
+	/**
+	 * Returns whether closing markup tags should be automatically completed.
+	 * This method only returns <code>true</code> if
+	 * {@link #getLanguageIsMarkup()} also returns <code>true</code>.
+	 *
+	 * @return Whether markup closing tags should be automatically completed.
+	 * @see #getLanguageIsMarkup()
+	 */
+	public boolean getCompleteMarkupCloseTags() {
+		// TODO: Remove terrible dependency on AbstractMarkupTokenMaker
+		return getLanguageIsMarkup() &&
+				((AbstractMarkupTokenMaker)tokenMaker).getCompleteCloseTags();
+	}
+
+
+	/**
+	 * Returns whether the current programming language uses curly braces
+	 * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.
+	 *
+	 * @return Whether curly braces denote code blocks.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return tokenMaker.getCurlyBracesDenoteCodeBlocks();
+	}
+
+
+	/**
+	 * Returns whether the current language is a markup language, such as
+	 * HTML, XML or PHP.
+	 *
+	 * @return Whether the current language is a markup language.
+	 */
+	public boolean getLanguageIsMarkup() {
+		return tokenMaker.isMarkupLanguage();
+	}
+
+
+	/**
+	 * Returns the token type of the last token on the given line.
+	 *
+	 * @param line The line to inspect.
+	 * @return The token type of the last token on the specified line.  If
+	 *         the line is invalid, an exception is thrown.
+	 */
+	public int getLastTokenTypeOnLine(int line) {
+		return lastTokensOnLines.get(line);
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in the current programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.  A <code>null</code> value for either means there
+	 *         is no string to add for that part.  A value of
+	 *         <code>null</code> for the array means this language
+	 *         does not support commenting/uncommenting lines.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return tokenMaker.getLineCommentStartAndEnd();
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	boolean getMarkOccurrencesOfTokenType(int type) {
+		return tokenMaker.getMarkOccurrencesOfTokenType(type);
+	}
+
+
+	/**
+	 * This method returns whether auto indentation should be done if Enter
+	 * is pressed at the end of the specified line.
+	 *
+	 * @param line The line to check.
+	 * @return Whether an extra indentation should be done.
+	 */
+	public boolean getShouldIndentNextLine(int line) {
+		Token t = getTokenListForLine(line);
+		t = t.getLastNonCommentNonWhitespaceToken();
+		return tokenMaker.getShouldIndentNextLineAfter(t);
+	}
+
+
+	/**
+	 * Returns a token list for the specified segment of text representing
+	 * the specified line number.  This method is basically a wrapper for
+	 * <code>tokenMaker.getTokenList</code> that takes into account the last
+	 * token on the previous line to assure token accuracy.
+	 *
+	 * @param line The line number of <code>text</code> in the document, >= 0.
+	 * @return A token list representing the specified line.
+	 */
+	public final Token getTokenListForLine(int line) {
+		Element map = getDefaultRootElement();
+		Element elem = map.getElement(line);
+		int startOffset = elem.getStartOffset();
+		//int endOffset = (line==map.getElementCount()-1 ? elem.getEndOffset() - 1:
+		//									elem.getEndOffset() - 1);
+		int endOffset = elem.getEndOffset() - 1; // Why always "-1"?
+		try {
+			getText(startOffset,endOffset-startOffset, s);
+		} catch (BadLocationException ble) {
+			ble.printStackTrace();
+			return null;
+		}
+		int initialTokenType = line==0 ? Token.NULL :
+								getLastTokenTypeOnLine(line-1);
+		return tokenMaker.getTokenList(s, initialTokenType, startOffset);
+	}
+
+
+	boolean insertBreakSpecialHandling(ActionEvent e) {
+		Action a = tokenMaker.getInsertBreakAction();
+		if (a!=null) {
+			a.actionPerformed(e);
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether whitespace is visible.
+	 *
+	 * @return Whether whitespace is visible.
+	 * @see #setWhitespaceVisible(boolean)
+	 */
+	public boolean isWhitespaceVisible() {
+		return tokenMaker==null ? false : tokenMaker.isWhitespaceVisible();
+	}
+
+
+	/**
+	 * Deserializes a document.
+	 *
+	 * @param in The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream in)
+						throws ClassNotFoundException, IOException {
+
+		in.defaultReadObject();
+
+		// Install default TokenMakerFactory.  To support custom TokenMakers,
+		// both JVM's should install default TokenMakerFactories that support
+		// the language they want to use beforehand.
+		setTokenMakerFactory(null);
+
+		// Handle other transient stuff
+		this.s = new Segment();
+		int lineCount = getDefaultRootElement().getElementCount();
+		lastTokensOnLines = new DynamicIntArray(lineCount);
+		setSyntaxStyle(syntaxStyle); // Actually install (transient) TokenMaker
+		setWhitespaceVisible(in.readBoolean()); // Do after setSyntaxStyle()
+
+	}
+
+
+	/**
+	 * Makes our private <code>Segment s</code> point to the text in our
+	 * document referenced by the specified element.  Note that
+	 * <code>line</code> MUST be a valid line number in the document.
+	 *
+	 * @param line The line number you want to get.
+	 */
+	private final void setSharedSegment(int line) {
+
+		Element map = getDefaultRootElement();
+		//int numLines = map.getElementCount();
+
+		Element element = map.getElement(line);
+		if (element==null)
+			throw new InternalError("Invalid line number: " + line);
+		int startOffset = element.getStartOffset();
+		//int endOffset = (line==numLines-1 ?
+		//			element.getEndOffset()-1 : element.getEndOffset() - 1);
+		int endOffset = element.getEndOffset()-1; // Why always "-1"?
+		try {
+			getText(startOffset, endOffset-startOffset, s);
+		} catch (BadLocationException ble) {
+			throw new InternalError("Text range not in document: " +
+								startOffset + "-" + endOffset);
+		}
+
+	}
+
+
+	/**
+	 * Sets the syntax style being used for syntax highlighting in this
+	 * document.  What styles are supported by a document is determined by its
+	 * {@link TokenMakerFactory}.  By default, all <code>RSyntaxDocument</code>s
+	 * support all languages built into <code>RSyntaxTextArea</code>. 
+	 *
+	 * @param styleKey The new style to use, such as
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.  If this style is not
+	 *        known or supported by this document, then
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_NONE} is used.
+	 */
+	public void setSyntaxStyle(String styleKey) {
+		boolean wsVisible = isWhitespaceVisible();
+		tokenMaker = tokenMakerFactory.getTokenMaker(styleKey);
+		tokenMaker.setWhitespaceVisible(wsVisible);
+		updateSyntaxHighlightingInformation();
+		this.syntaxStyle = styleKey;
+	}
+
+
+	/**
+	 * Sets the syntax style being used for syntax highlighting in this
+	 * document.  You should call this method if you've created a custom token
+	 * maker for a language not normally supported by
+	 * <code>RSyntaxTextArea</code>.
+	 *
+	 * @param tokenMaker The new token maker to use.
+	 */
+	public void setSyntaxStyle(TokenMaker tokenMaker) {
+		tokenMaker.setWhitespaceVisible(isWhitespaceVisible());
+		this.tokenMaker = tokenMaker;
+		updateSyntaxHighlightingInformation();
+	}
+
+
+	/**
+	 * Sets the token maker factory used by this document.
+	 *
+	 * @param tmf The <code>TokenMakerFactory</code> for this document.  If
+	 *        this is <code>null</code>, a default factory is used.
+	 */
+	public void setTokenMakerFactory(TokenMakerFactory tmf) {
+		tokenMakerFactory = tmf!=null ? tmf :
+			TokenMakerFactory.getDefaultInstance();
+	}
+
+
+	/**
+	 * Sets whether whitespace is visible.  This property is actually setting
+	 * whether the tokens generated from this document "paint" something when
+	 * they represent whitespace.
+	 *
+	 * @param visible Whether whitespace should be visible.
+	 * @see #isWhitespaceVisible()
+	 */
+	public void setWhitespaceVisible(boolean visible) {
+		tokenMaker.setWhitespaceVisible(visible);
+	}
+
+
+	/**
+	 * Loops through the last-tokens-on-lines array from a specified point
+	 * onward, updating last-token values until they stop changing.  This
+	 * should be called when lines are updated/inserted/removed, as doing
+	 * so may cause lines below to change color.
+	 *
+	 * @param line The first line to check for a change in last-token value.
+	 * @param numLines The number of lines in the document.
+	 * @param previousTokenType The last-token value of the line just before
+	 *        <code>line</code>.
+	 * @return The last line that needs repainting.
+	 */
+	private int updateLastTokensBelow(int line, int numLines, int previousTokenType) {
+
+		int firstLine = line;
+
+		// Loop through all lines past our starting point.  Update even the last
+		// line's info, even though there aren't any lines after it that depend
+		// on it changing for them to be changed, as its state may be used
+		// elsewhere in the library.
+		int end = numLines;
+		//System.err.println("--- end==" + end + " (numLines==" + numLines + ")");
+		while (line<end) {
+
+			setSharedSegment(line); // Sets s's text to that of line 'line' in the document.
+
+			int oldTokenType = lastTokensOnLines.get(line);
+			int newTokenType = tokenMaker.getLastTokenTypeOnLine(s, previousTokenType);
+			//System.err.println("---------------- line " + line + "; oldTokenType==" + oldTokenType + ", newTokenType==" + newTokenType + ", s=='" + s + "'");
+
+			// If this line's end-token value didn't change, stop here.  Note
+			// that we're saying this line needs repainting; this is because
+			// the beginning of this line did indeed change color, but the
+			// end didn't.
+			if (oldTokenType==newTokenType) {
+				//System.err.println("... ... ... repainting lines " + firstLine + "-" + line);
+				fireChangedUpdate(new DefaultDocumentEvent(firstLine, line, DocumentEvent.EventType.CHANGE));
+				return line;
+			}
+
+			// If the line's end-token value did change, update it and
+			// keep going.
+			// NOTE: "setUnsafe" is okay here as the bounds checking was
+			// already done in lastTokensOnLines.get(line) above.
+			lastTokensOnLines.setUnsafe(line, newTokenType);
+			previousTokenType = newTokenType;
+			line++;
+
+		} // End of while (line<numLines).
+
+		// If any lines had their token types changed, fire a changed update
+		// for them.  The view will repaint the area covered by the lines.
+		// FIXME:  We currently cheat and send the line range that needs to be
+		// repainted as the "offset and length" of the change, since this is
+		// what the view needs.  We really should send the actual offset and
+		// length.
+		if (line>firstLine) {
+			//System.err.println("... ... ... repainting lines " + firstLine + "-" + line);
+			fireChangedUpdate(new DefaultDocumentEvent(firstLine, line,
+								DocumentEvent.EventType.CHANGE));
+		}
+
+		return line;
+
+	}
+
+
+	/**
+	 * Updates internal state information; e.g. the "last tokens on lines"
+	 * data.  After this, a changed update is fired to let listeners know that
+	 * the document's structure has changed.<p>
+	 *
+	 * This is called internally whenever the syntax style changes.
+	 */
+	protected void updateSyntaxHighlightingInformation() {
+
+		// Reinitialize the "last token on each line" array.  Note that since
+		// the actual text in the document isn't changing, the number of lines
+		// is the same.
+		Element map = getDefaultRootElement();
+		int numLines = map.getElementCount();
+		int lastTokenType = Token.NULL;
+		for (int i=0; i<numLines; i++) {
+			setSharedSegment(i);
+			lastTokenType = tokenMaker.getLastTokenTypeOnLine(s, lastTokenType);
+			lastTokensOnLines.set(i, lastTokenType);
+		}
+
+		// Let everybody know that syntax styles have (probably) changed.
+		fireChangedUpdate(new DefaultDocumentEvent(
+						0, numLines-1, DocumentEvent.EventType.CHANGE));
+
+	}
+
+
+	/**
+	 * Overridden for custom serialization purposes.
+	 *
+	 * @param out The stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void writeObject(ObjectOutputStream out)throws IOException {
+		out.defaultWriteObject();
+		out.writeBoolean(isWhitespaceVisible());
+	}
+
+
+	/**
+	 * Document content that provides fast access to individual characters.
+	 *
+	 * @author Robert Futrell
+	 * @version 1.0
+	 */
+	private static class RGapContent extends GapContent {
+
+		public RGapContent() {
+		}
+
+		public char charAt(int offset) throws BadLocationException {
+			if (offset<0 || offset>=length()) {
+				throw new BadLocationException("Invalid offset", offset);
+			}
+			int g0 = getGapStart();
+			char[] array = (char[]) getArray();
+			if (offset<g0) { // below gap
+				return array[offset];
+			}
+			return array[getGapEnd() + offset - g0]; // above gap
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java	(revision 25584)
@@ -0,0 +1,2617 @@
+/*
+ * 01/27/2004
+ *
+ * RSyntaxTextArea.java - An extension of RTextArea that adds
+ * the ability to syntax highlight certain programming languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+import javax.swing.Timer;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.EventListenerList;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ToolTipInfo;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaUI;
+import org.fife.ui.rtextarea.RTextScrollPane;
+import org.fife.ui.rtextarea.RecordableTextAction;
+
+
+
+/**
+ * An extension of <code>RTextArea</code> that adds syntax highlighting
+ * of certain programming languages to its list of features.  Languages
+ * currently supported include:
+ *
+ * <table>
+ *  <tr>
+ *   <td style="vertical-align: top">
+ *    <ul>
+ *       <li>ActionScript
+ *       <li>Assembler (X86)
+ *       <li>BBCode
+ *       <li>C
+ *       <li>C++
+ *       <li>CSS
+ *       <li>C#
+ *       <li>Clojure
+ *       <li>Delphi
+ *       <li>DTD
+ *       <li>Fortran
+ *       <li>Groovy
+ *       <li>HTML
+ *       <li>Java
+ *       <li>JavaScript
+ *       <li>JSP
+ *    </ul>
+ *   </td>
+ *   <td style="vertical-align: top">
+ *    <ul>
+ *       <li>LaTeX
+ *       <li>Lisp
+ *       <li>Lua
+ *       <li>Make
+ *       <li>MXML
+ *       <li>Perl
+ *       <li>PHP
+ *       <li>Ruby
+ *       <li>SAS
+ *       <li>Scala
+ *       <li>SQL
+ *       <li>Tcl
+ *       <li>UNIX shell scripts
+ *       <li>Windows batch
+ *       <li>XML files
+ *    </ul>
+ *   </td>
+ *  </tr>
+ * </table>
+ *
+ * Other added features include:
+ * <ul style="columns: 2 12em; column-gap: 1em">
+ *    <li>Code folding
+ *    <li>Bracket matching
+ *    <li>Auto-indentation
+ *    <li>Copy as RTF
+ *    <li>Clickable hyperlinks (if the language scanner being used supports it)
+ *    <li>A pluggable "parser" system that can be used to implement syntax
+ *        validation, spell checking, etc.
+ * </ul>
+ *
+ * It is recommended that you use an instance of
+ * {@link org.fife.ui.rtextarea.RTextScrollPane} instead of a regular
+ * <code>JScrollPane</code> as this class allows you to add line numbers and
+ * bookmarks easily to your text area.
+ *
+ * @author Robert Futrell
+ * @version 2.0.3
+ * @see TextEditorPane
+ */
+public class RSyntaxTextArea extends RTextArea implements SyntaxConstants {
+
+	public static final String ANIMATE_BRACKET_MATCHING_PROPERTY	= "RSTA.animateBracketMatching";
+	public static final String ANTIALIAS_PROPERTY					= "RSTA.antiAlias";
+	public static final String AUTO_INDENT_PROPERTY					= "RSTA.autoIndent";
+	public static final String BRACKET_MATCHING_PROPERTY			= "RSTA.bracketMatching";
+	public static final String CLEAR_WHITESPACE_LINES_PROPERTY		= "RSTA.clearWhitespaceLines";
+	public static final String CLOSE_CURLY_BRACES_PROPERTY			= "RSTA.closeCurlyBraces";
+	public static final String CLOSE_MARKUP_TAGS_PROPERTY			= "RSTA.closeMarkupTags";
+	public static final String CODE_FOLDING_PROPERTY				= "RSTA.codeFolding";
+	public static final String EOL_VISIBLE_PROPERTY					= "RSTA.eolMarkersVisible";
+	public static final String FOCUSABLE_TIPS_PROPERTY				= "RSTA.focusableTips";
+	public static final String FRACTIONAL_FONTMETRICS_PROPERTY		= "RSTA.fractionalFontMetrics";
+	public static final String HYPERLINKS_ENABLED_PROPERTY			= "RSTA.hyperlinksEnabled";
+	public static final String MARK_OCCURRENCES_PROPERTY			= "RSTA.markOccurrences";
+	public static final String MARKED_OCCURRENCES_CHANGED_PROPERTY	= "RSTA.markedOccurrencesChanged";
+	public static final String PARSER_NOTICES_PROPERTY				= "RSTA.parserNotices";
+	public static final String SYNTAX_SCHEME_PROPERTY				= "RSTA.syntaxScheme";
+	public static final String SYNTAX_STYLE_PROPERTY				= "RSTA.syntaxStyle";
+	public static final String TAB_LINE_COLOR_PROPERTY				= "RSTA.tabLineColor";
+	public static final String TAB_LINES_PROPERTY					= "RSTA.tabLines";
+	public static final String VISIBLE_WHITESPACE_PROPERTY			= "RSTA.visibleWhitespace";
+
+	private static final Color DEFAULT_BRACKET_MATCH_BG_COLOR		= new Color(234,234,255);
+	private static final Color DEFAULT_BRACKET_MATCH_BORDER_COLOR	= new Color(0,0,128);
+	private static final Color DEFAULT_SELECTION_COLOR			= new Color(200,200,255);
+
+	private static final String MSG	= "org.fife.ui.rsyntaxtextarea.RSyntaxTextArea";
+
+	private JMenu foldingMenu;
+	private static RecordableTextAction toggleCurrentFoldAction;
+	private static RecordableTextAction collapseAllCommentFoldsAction;
+	private static RecordableTextAction collapseAllFoldsAction;
+	private static RecordableTextAction expandAllFoldsAction;
+
+	/** The key for the syntax style to be highlighting. */
+	private String syntaxStyleKey;
+
+	/** The colors used for syntax highlighting. */
+	private SyntaxScheme syntaxScheme;
+
+	/** Handles code templates. */
+	private static CodeTemplateManager codeTemplateManager;
+
+	/** Whether or not templates are enabled. */
+	private static boolean templatesEnabled;
+
+	/**
+	 * The rectangle surrounding the "matched bracket" if bracket matching
+	 * is enabled.
+	 */
+Rectangle match;
+
+	/**
+	 * Colors used for the "matched bracket" if bracket matching is enabled.
+	 */
+	private Color matchedBracketBGColor;
+	private Color matchedBracketBorderColor;
+
+	/** The location of the last matched bracket. */
+	private int lastBracketMatchPos;
+
+	/** Whether or not bracket matching is enabled. */
+	private boolean bracketMatchingEnabled;
+
+	/** Whether or not bracket matching is animated. */
+	private boolean animateBracketMatching;
+
+	private BracketMatchingTimer bracketRepaintTimer;
+
+	/**
+	 * Whether or not auto-indent is on.
+	 */
+	private boolean autoIndentEnabled;
+
+	/**
+	 * Whether curly braces should be closed on Enter key presses, (if the
+	 * current language supports it).
+	 */
+	private boolean closeCurlyBraces;
+
+	/**
+	 * Whether closing markup tags should be automatically completed when
+	 * "<code>&lt;/</code>" is typed (if the current language is a markup
+	 * language).
+	 */
+	private boolean closeMarkupTags;
+
+	/**
+	 * Whether or not lines with nothing but whitespace are "made empty."
+	 */
+	private boolean clearWhitespaceLines;
+
+	/** Whether we are displaying visible whitespace (spaces and tabs). */
+	private boolean whitespaceVisible;
+
+	/** Whether EOL markers should be visible at the end of each line. */
+	private boolean eolMarkersVisible;
+
+	/** Whether tab lines are enabled. */
+	private boolean paintTabLines;
+
+	/** The color to use when painting tab lines. */
+	private Color tabLineColor;
+
+	/**
+	 * Whether hyperlinks are enabled (must be supported by the syntax
+	 * scheme being used).
+	 */
+	private boolean hyperlinksEnabled;
+
+	/** The color to use when painting hyperlinks. */
+	private Color hyperlinkFG;
+
+	/**
+	 * Mask used to determine if the correct key is being held down to scan
+	 * for hyperlinks (ctrl, meta, etc.).
+	 */
+	private int linkScanningMask;
+
+	/** Used during "Copy as RTF" operations. */
+	private RtfGenerator rtfGenerator;
+
+	/** Handles "mark occurrences" support. */
+	private MarkOccurrencesSupport markOccurrencesSupport;
+
+	/** The color used to render "marked occurrences." */
+	private Color markOccurrencesColor;
+
+	/** Whether a border should be painted around marked occurrences. */
+	private boolean paintMarkOccurrencesBorder;
+
+	/** Metrics of the text area's font. */
+	private FontMetrics defaultFontMetrics;
+
+	/** Manages running the parser. */
+	private ParserManager parserManager;
+
+	/**
+	 * Whether the editor is currently scanning for hyperlinks on mouse
+	 * movement.
+	 */
+	private boolean isScanningForLinks;
+
+	private int hoveredOverLinkOffset;
+
+	private FoldManager foldManager;
+
+	/** Whether "focusable" tool tips are used instead of standard ones. */
+	private boolean useFocusableTips;
+
+	/** The last focusable tip displayed. */
+	private FocusableTip focusableTip;
+
+	/** Cached desktop anti-aliasing hints, if anti-aliasing is enabled. */
+	private Map aaHints;
+
+private int lineHeight;		// Height of a line of text; same for default, bold & italic.
+private int maxAscent;
+private boolean fractionalFontMetricsEnabled;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextArea() {
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param doc The document for the editor.
+	 */
+	public RSyntaxTextArea(RSyntaxDocument doc) {
+		super(doc);
+		init();
+	}
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param text The initial text to display.
+	 */
+	public RSyntaxTextArea(String text) {
+		super(text);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RSyntaxTextArea(int rows, int cols) {
+		super(rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RSyntaxTextArea(String text, int rows, int cols) {
+		super(text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param doc The document for the editor.
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RSyntaxTextArea(RSyntaxDocument doc, String text,int rows,int cols) {
+		super(doc, text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Creates a new <code>RSyntaxTextArea</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 */
+	public RSyntaxTextArea(int textMode) {
+		super(textMode);
+		init();
+	}
+
+
+	/**
+	 * Adds an "active line range" listener to this text area.
+	 *
+	 * @param l The listener to add.
+	 * @see #removeActiveLineRangeListener(ActiveLineRangeListener)
+	 */
+	public void addActiveLineRangeListener(ActiveLineRangeListener l) {
+		listenerList.add(ActiveLineRangeListener.class, l);
+	}
+
+
+	/**
+	 * Adds a hyperlink listener to this text area.
+	 *
+	 * @param l The listener to add.
+	 * @see #removeHyperlinkListener(HyperlinkListener)
+	 */
+	public void addHyperlinkListener(HyperlinkListener l) {
+		listenerList.add(HyperlinkListener.class, l);
+	}
+
+
+	/**
+	 * Updates the font metrics the first time we're displayed.
+	 */
+	public void addNotify() {
+
+		super.addNotify();
+
+		// We know we've just been connected to a screen resource (by
+		// definition), so initialize our font metrics objects.
+		refreshFontMetrics(getGraphics2D(getGraphics()));
+
+		// Re-start parsing if we were removed from one container and added
+		// to another
+		if (parserManager!=null) {
+			parserManager.restartParsing();
+		}
+
+	}
+
+
+	/**
+	 * Adds the parser to "validate" the source code in this text area.  This
+	 * can be anything from a spell checker to a "compiler" that verifies
+	 * source code.
+	 *
+	 * @param parser The new parser.  A value of <code>null</code> will
+	 *        do nothing.
+	 * @see #getParser(int)
+	 * @see #getParserCount()
+	 * @see #removeParser(Parser)
+	 */
+	public void addParser(Parser parser) {
+		if (parserManager==null) {
+			parserManager = new ParserManager(this);
+		}
+		parserManager.addParser(parser);
+	}
+
+
+	/**
+	 * Recalculates the height of a line in this text area and the
+	 * maximum ascent of all fonts displayed.
+	 */
+	private void calculateLineHeight() {
+
+		lineHeight = maxAscent = 0;
+
+		// Each token style.
+		for (int i=0; i<syntaxScheme.getStyleCount(); i++) {
+			Style ss = syntaxScheme.getStyle(i);
+			if (ss!=null && ss.font!=null) {
+				FontMetrics fm = getFontMetrics(ss.font);
+				int height = fm.getHeight();
+				if (height>lineHeight)
+					lineHeight = height;
+				int ascent = fm.getMaxAscent();
+				if (ascent>maxAscent)
+					maxAscent = ascent;
+			}
+		}
+
+		// The text area's (default) font).
+		Font temp = getFont();
+		FontMetrics fm = getFontMetrics(temp);
+		int height = fm.getHeight();
+		if (height>lineHeight) {
+			lineHeight = height;
+		}
+		int ascent = fm.getMaxAscent();
+		if (ascent>maxAscent) {
+			maxAscent = ascent;
+		}
+
+	}
+
+
+	/**
+	 * Removes all parsers from this text area.
+	 *
+	 * @see #removeParser(Parser)
+	 */
+	public void clearParsers() {
+		if (parserManager!=null) {
+			parserManager.clearParsers();
+		}
+	}
+
+
+	/**
+	 * Clones a token list.  This is necessary as tokens are reused in
+	 * {@link RSyntaxDocument}, so we can't simply use the ones we
+	 * are handed from it.
+	 *
+	 * @param t The token list to clone.
+	 * @return The clone of the token list.
+	 */
+	private Token cloneTokenList(Token t) {
+
+		if (t==null) {
+			return null;
+		}
+
+		Token clone = new DefaultToken();
+		clone.copyFrom(t);
+		Token cloneEnd = clone;
+
+		while ((t=t.getNextToken())!=null) {
+			Token temp = new DefaultToken();
+			temp.copyFrom(t);
+			cloneEnd.setNextToken(temp);
+			cloneEnd = temp;
+		}
+
+		return clone;
+
+	}
+
+
+	/**
+	 * Overridden to toggle the enabled state of various
+	 * RSyntaxTextArea-specific menu items.
+	 * 
+	 * If you set the popup menu via {@link #setPopupMenu(JPopupMenu)}, you
+	 * will want to override this method, especially if you removed any of the
+	 * menu items in the default popup menu.
+	 *
+	 * @param popupMenu The popup menu.  This will never be <code>null</code>.
+	 * @see #createPopupMenu()
+	 * @see #setPopupMenu(JPopupMenu)
+	 */
+	protected void configurePopupMenu(JPopupMenu popupMenu) {
+
+		super.configurePopupMenu(popupMenu); // Currently does nothing
+
+		// Be nice and let them set the popup to null without overriding
+		// this method
+		if (popupMenu!=null && popupMenu.getComponentCount()>0) {
+			Component c = popupMenu.getComponent(popupMenu.getComponentCount()-1);
+			if (c instanceof JMenu) { // Assume it's the folding menu
+				JMenu foldingMenu = (JMenu)c;
+				foldingMenu.setEnabled(foldManager.
+						isCodeFoldingSupportedAndEnabled());
+			}
+		}
+	}
+
+
+	/**
+	 * Copies the currently selected text to the system clipboard, with
+	 * any necessary style information (font, foreground color and background
+	 * color).  Does nothing for <code>null</code> selections.
+	 */
+	public void copyAsRtf() {
+
+		int selStart = getSelectionStart();
+		int selEnd = getSelectionEnd();
+		if (selStart==selEnd) {
+			return;
+		}
+
+		// Make sure there is a system clipboard, and that we can write
+		// to it.
+		SecurityManager sm = System.getSecurityManager();
+		if (sm!=null) {
+			try {
+				sm.checkSystemClipboardAccess();
+			} catch (SecurityException se) {
+				UIManager.getLookAndFeel().provideErrorFeedback(null);
+				return;
+			}
+		}
+		Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
+
+		// Create the RTF selection.
+		RtfGenerator gen = getRTFGenerator();
+		Token tokenList = getTokenListFor(selStart, selEnd);
+		for (Token t=tokenList; t!=null; t=t.getNextToken()) {
+			if (t.isPaintable()) {
+				if (t.textCount==1 && t.text[t.textOffset]=='\n') {
+					gen.appendNewline();
+				}
+				else {
+					Font font = getFontForTokenType(t.type);
+					Color bg = getBackgroundForTokenType(t.type);
+					boolean underline = getUnderlineForToken(t);
+					// Small optimization - don't print fg color if this
+					// is a whitespace color.  Saves on RTF size.
+					if (t.isWhitespace()) {
+						gen.appendToDocNoFG(t.getLexeme(), font, bg, underline);
+					}
+					else {
+						Color fg = getForegroundForToken(t);
+						gen.appendToDoc(t.getLexeme(), font, fg, bg, underline);
+					}
+				}
+			}
+		}
+
+		// Set the system clipboard contents to the RTF selection.
+		RtfTransferable contents = new RtfTransferable(gen.getRtf().getBytes());
+		//System.out.println("*** " + new String(gen.getRtf().getBytes()));
+		try {
+			cb.setContents(contents, null);
+		} catch (IllegalStateException ise) {
+			UIManager.getLookAndFeel().provideErrorFeedback(null);
+			return;
+		}
+
+	}
+
+
+	/**
+	 * Returns the document to use for an <code>RSyntaxTextArea</code>
+	 *
+	 * @return The document.
+	 */
+	protected Document createDefaultModel() {
+		return new RSyntaxDocument(SYNTAX_STYLE_NONE);
+	}
+
+
+	/**
+	 * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+	 *
+	 * @return The caret event/mouse listener.
+	 */
+	protected RTAMouseListener createMouseListener() {
+		return new RSyntaxTextAreaMutableCaretEvent(this);
+	}
+
+
+	/**
+	 * Overridden to add menu items related to cold folding.
+	 *
+	 * @return The popup menu.
+	 */
+	protected JPopupMenu createPopupMenu() {
+
+		JPopupMenu popup = super.createPopupMenu();
+		popup.addSeparator();
+
+		ResourceBundle bundle = ResourceBundle.getBundle(MSG);
+		foldingMenu = new JMenu(bundle.getString("ContextMenu.Folding"));
+		foldingMenu.add(createPopupMenuItem(toggleCurrentFoldAction));
+		foldingMenu.add(createPopupMenuItem(collapseAllCommentFoldsAction));
+		foldingMenu.add(createPopupMenuItem(collapseAllFoldsAction));
+		foldingMenu.add(createPopupMenuItem(expandAllFoldsAction));
+		popup.add(foldingMenu);
+
+		return popup;
+
+	}
+
+
+	/**
+	 * See createPopupMenuActions() in RTextArea.
+	 * TODO: Remove these horrible hacks and move localizing of actions into
+	 * the editor kits, where it should be!  The context menu should contain
+	 * actions from the editor kits.
+	 */
+	private static void createRstaPopupMenuActions() {
+
+		ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+		toggleCurrentFoldAction = new RSyntaxTextAreaEditorKit.
+				ToggleCurrentFoldAction();
+		toggleCurrentFoldAction.setProperties(msg, "Action.ToggleCurrentFold");
+
+		collapseAllCommentFoldsAction = new RSyntaxTextAreaEditorKit.
+				CollapseAllCommentFoldsAction();
+		collapseAllCommentFoldsAction.setProperties(msg, "Action.CollapseCommentFolds");
+
+		collapseAllFoldsAction = new RSyntaxTextAreaEditorKit.CollapseAllFoldsAction(true);
+		expandAllFoldsAction = new RSyntaxTextAreaEditorKit.ExpandAllFoldsAction(true);
+
+	}
+
+
+	/**
+	 * Returns the a real UI to install on this text area.
+	 *
+	 * @return The UI.
+	 */
+	protected RTextAreaUI createRTextAreaUI() {
+		return new RSyntaxTextAreaUI(this);
+	}
+
+
+	/**
+	 * If the caret is on a bracket, this method finds the matching bracket,
+	 * and if it exists, highlights it.
+	 */
+	protected final void doBracketMatching() {
+
+		// We always need to repaint the "matched bracket" highlight if it
+		// exists.
+		if (match!=null) {
+			repaint(match);
+		}
+
+		// If a matching bracket is found, get its bounds and paint it!
+		int pos = RSyntaxUtilities.getMatchingBracketPosition(this);
+		if (pos>-1 && pos!=lastBracketMatchPos) {
+			try {
+				match = modelToView(pos);
+				if (match!=null) { // Happens if we're not yet visible
+					if (getAnimateBracketMatching()) {
+						bracketRepaintTimer.restart();
+					}
+					repaint(match);
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Shouldn't happen.
+			}
+		}
+		else if (pos==-1) {
+			// Set match to null so the old value isn't still repainted.
+			match = null;
+			bracketRepaintTimer.stop();
+		}
+		lastBracketMatchPos = pos;
+
+	}
+
+
+	/**
+	 * Notifies all listeners that a caret change has occurred.
+	 *
+	 * @param e The caret event.
+	 */
+	protected void fireCaretUpdate(CaretEvent e) {
+		super.fireCaretUpdate(e);
+		if (isBracketMatchingEnabled()) {
+			doBracketMatching();
+		}
+	}
+
+
+	/**
+	 * Notifies all listeners that the active line range has changed.
+	 *
+	 * @param min The minimum "active" line, or <code>-1</code>.
+	 * @param max The maximum "active" line, or <code>-1</code>.
+	 */
+	private void fireActiveLineRangeEvent(int min, int max) {
+		ActiveLineRangeEvent e = null; // Lazily created
+		// Guaranteed to return a non-null array
+		Object[] listeners = listenerList.getListenerList();
+		// Process the listeners last to first, notifying
+		// those that are interested in this event
+		for (int i = listeners.length-2; i>=0; i-=2) {
+			if (listeners[i]==ActiveLineRangeListener.class) {
+				if (e==null) {
+					e = new ActiveLineRangeEvent(this, min, max);
+				}
+				((ActiveLineRangeListener)listeners[i+1]).activeLineRangeChanged(e);
+			}
+		}
+	}
+
+
+	/**
+	 * Notifies all listeners that have registered interest for notification
+	 * on this event type.  The listener list is processed last to first.
+	 *
+	 * @param e The event to fire.
+	 * @see EventListenerList
+	 */
+	private void fireHyperlinkUpdate(HyperlinkEvent e) {
+		// Guaranteed to return a non-null array
+		Object[] listeners = listenerList.getListenerList();
+		// Process the listeners last to first, notifying
+		// those that are interested in this event
+		for (int i = listeners.length-2; i>=0; i-=2) {
+			if (listeners[i]==HyperlinkListener.class) {
+				((HyperlinkListener)listeners[i+1]).hyperlinkUpdate(e);
+			}          
+		}
+	}
+
+
+	/**
+	 * Notifies listeners that the marked occurrences for this text area
+	 * have changed.
+	 */
+	void fireMarkedOccurrencesChanged() {
+		firePropertyChange(RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY,
+							null, null);
+	}
+
+
+	/**
+	 * Fires a notification that the parser notices for this text area have
+	 * changed.
+	 */
+	void fireParserNoticesChange() {
+		firePropertyChange(PARSER_NOTICES_PROPERTY, null, null);
+	}
+
+
+	/**
+	 * Called whenever a fold is collapsed or expanded.  This causes the
+	 * text editor to revalidate.  This method is here because of poor design
+	 * and should be removed.
+	 *
+	 * @param fold The fold that was collapsed or expanded.
+	 */
+	public void foldToggled(Fold fold) {
+		match = null; // TODO: Update the bracket rect rather than hide it
+		possiblyUpdateCurrentLineHighlightLocation();
+		revalidate();
+		repaint();
+	}
+
+
+	/**
+	 * Forces the given {@link Parser} to re-parse the content of this text
+	 * area.<p>
+	 * 
+	 * This method can be useful when a <code>Parser</code> can be configured
+	 * as to what notices it returns.  For example, if a Java language parser
+	 * can be configured to set whether no serialVersionUID is a warning,
+	 * error, or ignored, this method can be called after changing the expected
+	 * notice type to have the document re-parsed.
+	 *
+	 * @param parser The index of the <code>Parser</code> to re-run.
+	 * @see #getParser(int)
+	 */
+	public void forceReparsing(int parser) {
+		parserManager.forceReparsing(parser);
+	}
+
+
+	/**
+	 * Forces re-parsing with a specific parser.  Note that if this parser is
+	 * not installed on this text area, nothing will happen.
+	 *
+	 * @param parser The parser that should re-parse this text area's contents.
+	 *        This should be installed on this text area.
+	 * @return Whether the parser was installed on this text area.
+	 * @see #forceReparsing(int)
+	 */
+	public boolean forceReparsing(Parser parser) {
+		for (int i=0; i<getParserCount(); i++) {
+			if (getParser(i)==parser) {
+				forceReparsing(i);
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether bracket matching should be animated.
+	 *
+	 * @return Whether bracket matching should be animated.
+	 * @see #setAnimateBracketMatching(boolean)
+	 */
+	public boolean getAnimateBracketMatching() {
+		return animateBracketMatching;
+	}
+
+
+	/**
+	 * Returns whether anti-aliasing is enabled in this editor.
+	 *
+	 * @return Whether anti-aliasing is enabled in this editor.
+	 * @see #setAntiAliasingEnabled(boolean)
+	 * @see #getFractionalFontMetricsEnabled()
+	 */
+	public boolean getAntiAliasingEnabled() {
+		return aaHints!=null;
+	}
+
+
+	/**
+	 * Returns the background color for tokens of the specified type.
+	 *
+	 * @param type The type of token.
+	 * @return The background color to use for that token type.  If
+	 *         this value is <code>null</code> then this token type
+	 *         has no special background color.
+	 * @see #getForegroundForToken(Token)
+	 */
+	public Color getBackgroundForTokenType(int type) {
+		// Don't default to this.getBackground(), as Tokens simply don't
+		// paint a background if they get a null Color.
+		return syntaxScheme.getStyle(type).background;
+	}
+
+
+	/**
+	 * Returns whether curly braces should be automatically closed when a
+	 * newline is entered after an opening curly brace.  Note that this
+	 * property is only honored for languages that use curly braces to denote
+	 * code blocks.
+	 *
+	 * @return Whether curly braces should be automatically closed.
+	 * @see #setCloseCurlyBraces(boolean)
+	 */
+	public boolean getCloseCurlyBraces() {
+		return closeCurlyBraces;
+	}
+
+
+	/**
+	 * Returns whether closing markup tags should be automatically completed
+	 * when "<code>&lt;/</code>" is typed.  Note that this property is only
+	 * honored for markup languages, such as HTML, XML and PHP.
+	 *
+	 * @return Whether closing markup tags should be automatically completed.
+	 * @see #setCloseMarkupTags(boolean)
+	 */
+	public boolean getCloseMarkupTags() {
+		return closeMarkupTags;
+	}
+
+
+	/**
+	 * Returns the code template manager for all instances of
+	 * <code>RSyntaxTextArea</code>.  The manager is lazily created.
+	 *
+	 * @return The code template manager.
+	 * @see #setTemplatesEnabled(boolean)
+	 */
+	public static synchronized CodeTemplateManager getCodeTemplateManager() {
+		if (codeTemplateManager==null) {
+			codeTemplateManager = new CodeTemplateManager();
+		}
+		return codeTemplateManager;
+	}
+
+
+	/**
+	 * Returns the default bracket-match background color.
+	 *
+	 * @return The color.
+	 * @see #getDefaultBracketMatchBorderColor
+	 */
+	public static final Color getDefaultBracketMatchBGColor() {
+		return DEFAULT_BRACKET_MATCH_BG_COLOR;
+	}
+
+
+	/**
+	 * Returns the default bracket-match border color.
+	 *
+	 * @return The color.
+	 * @see #getDefaultBracketMatchBGColor
+	 */
+	public static final Color getDefaultBracketMatchBorderColor() {
+		return DEFAULT_BRACKET_MATCH_BORDER_COLOR;
+	}
+
+
+	/**
+	 * Returns the default selection color for this text area.  This
+	 * color was chosen because it's light and <code>RSyntaxTextArea</code>
+	 * does not change text color between selected/unselected text for
+	 * contrast like regular <code>JTextArea</code>s do.
+	 *
+	 * @return The default selection color.
+	 */
+	public static Color getDefaultSelectionColor() {
+		return DEFAULT_SELECTION_COLOR;
+	}
+
+
+	/**
+	 * Returns the "default" syntax highlighting color scheme.  The colors
+	 * used are somewhat standard among syntax highlighting text editors.
+	 *
+	 * @return The default syntax highlighting color scheme.
+	 * @see #restoreDefaultSyntaxScheme()
+	 * @see #getSyntaxScheme()
+	 * @see #setSyntaxScheme(SyntaxScheme)
+	 */
+	public SyntaxScheme getDefaultSyntaxScheme() {
+		return new SyntaxScheme(getFont());
+	}
+
+
+	/**
+	 * Returns whether an EOL marker should be drawn at the end of each line.
+	 *
+	 * @return Whether EOL markers should be visible.
+	 * @see #setEOLMarkersVisible(boolean)
+	 * @see #isWhitespaceVisible()
+	 */
+	public boolean getEOLMarkersVisible() {
+		return eolMarkersVisible;
+	}
+
+
+	/**
+	 * Returns the fold manager for this text area.
+	 *
+	 * @return The fold manager.
+	 */
+	public FoldManager getFoldManager() {
+		return foldManager;
+	}
+
+
+	/**
+	 * Returns the font for tokens of the specified type.
+	 *
+	 * @param type The type of token.
+	 * @return The font to use for that token type.
+	 * @see #getFontMetricsForTokenType(int)
+	 */
+	public Font getFontForTokenType(int type) {
+		Font f = syntaxScheme.getStyle(type).font;
+		return f!=null ? f : getFont();
+	}
+
+
+	/**
+	 * Returns the font metrics for tokens of the specified type.
+	 *
+	 * @param type The type of token.
+	 * @return The font metrics to use for that token type.
+	 * @see #getFontForTokenType(int)
+	 */
+	public FontMetrics getFontMetricsForTokenType(int type) {
+		FontMetrics fm = syntaxScheme.getStyle(type).fontMetrics;
+		return fm!=null ? fm : defaultFontMetrics;
+	}
+
+
+	/**
+	 * Returns the foreground color to use when painting a token.
+	 *
+	 * @param t The token.
+	 * @return The foreground color to use for that token.  This
+	 *         value is never <code>null</code>.
+	 * @see #getBackgroundForTokenType(int)
+	 */
+	public Color getForegroundForToken(Token t) {
+		if (getHyperlinksEnabled() && t.isHyperlink() &&
+				hoveredOverLinkOffset==t.offset) {
+			return hyperlinkFG;
+		}
+		return getForegroundForTokenType(t.type);
+	}
+
+
+	/**
+	 * Returns the foreground color to use when painting a token.  This does
+	 * not take into account whether the token is a hyperlink.
+	 *
+	 * @param type The token type.
+	 * @return The foreground color to use for that token.  This
+	 *         value is never <code>null</code>.
+	 * @see #getForegroundForToken(Token)
+	 */
+	public Color getForegroundForTokenType(int type) {
+		Color fg = syntaxScheme.getStyle(type).foreground;
+		return fg!=null ? fg : getForeground();
+	}
+
+
+	/**
+	 * Returns whether fractional font metrics are enabled for this text area.
+	 *
+	 * @return Whether fractional font metrics are enabled.
+	 * @see #setFractionalFontMetricsEnabled
+	 * @see #getAntiAliasingEnabled()
+	 */
+	public boolean getFractionalFontMetricsEnabled() {
+		return fractionalFontMetricsEnabled;
+	}
+
+
+	/**
+	 * Returns a <code>Graphics2D</code> version of the specified graphics
+	 * that has been initialized with the proper rendering hints.
+	 *
+	 * @param g The graphics context for which to get a
+	 *        <code>Graphics2D</code>.
+	 * @return The <code>Graphics2D</code>.
+	 */
+	private final Graphics2D getGraphics2D(Graphics g) {
+		Graphics2D g2d = (Graphics2D)g;
+		if (aaHints!=null) {
+			g2d.addRenderingHints(aaHints);
+		}
+		if (fractionalFontMetricsEnabled) {
+			g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
+							RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+		}
+		return g2d;
+	}
+
+
+	/**
+	 * Returns the color to use when painting hyperlinks.
+	 *
+	 * @return The color to use when painting hyperlinks.
+	 * @see #setHyperlinkForeground(Color)
+	 * @see #getHyperlinksEnabled()
+	 */
+	public Color getHyperlinkForeground() {
+		return hyperlinkFG;
+	}
+
+
+	/**
+	 * Returns whether hyperlinks are enabled for this text area.
+	 *
+	 * @return Whether hyperlinks are enabled for this text area.
+	 * @see #setHyperlinksEnabled(boolean)
+	 */
+	public boolean getHyperlinksEnabled() {
+		return hyperlinksEnabled;
+	}
+
+
+	/**
+	 * Returns the last visible offset in this text area.  This may not be the
+	 * length of the document if code folding is enabled.
+	 *
+	 * @return The last visible offset in this text area.
+	 */
+	public int getLastVisibleOffset() {
+		if (isCodeFoldingEnabled()) {
+			int lastVisibleLine = foldManager.getLastVisibleLine();
+			if (lastVisibleLine<getLineCount()-1) { // Not the last line
+				try {
+					return getLineEndOffset(lastVisibleLine) - 1;
+				} catch (BadLocationException ble) { // Never happens
+					ble.printStackTrace();
+				}
+			}
+		}
+		return getDocument().getLength();
+	}
+
+
+	/**
+	 * Returns the height to use for a line of text in this text area.
+	 *
+	 * @return The height of a line of text in this text area.
+	 */
+	public int getLineHeight() {
+		//System.err.println("... getLineHeight() returning " + lineHeight);
+		return lineHeight;
+	}
+
+
+	/**
+	 * Returns a list of "marked occurrences" in the text area.  If there are
+	 * no marked occurrences, this will be an empty list.
+	 *
+	 * @return The list of marked occurrences.
+	 */
+	public List getMarkedOccurrences() {
+		return ((RSyntaxTextAreaHighlighter)getHighlighter()).
+											getMarkedOccurrences();
+	}
+
+
+	/**
+	 * Returns whether "Mark Occurrences" is enabled.
+	 *
+	 * @return Whether "Mark Occurrences" is enabled.
+	 * @see #setMarkOccurrences(boolean)
+	 */
+	public boolean getMarkOccurrences() {
+		return markOccurrencesSupport!=null;
+	}
+
+
+	/**
+	 * Returns the color used to "mark occurrences."
+	 *
+	 * @return The mark occurrences color.
+	 * @see #setMarkOccurrencesColor(Color)
+	 */
+	public Color getMarkOccurrencesColor() {
+		return markOccurrencesColor;
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	boolean getMarkOccurrencesOfTokenType(int type) {
+		RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+		return doc.getMarkOccurrencesOfTokenType(type);
+	}
+
+
+	/**
+	 * Gets the color used as the background for a matched bracket.
+	 *
+	 * @return The color used.  If this is <code>null</code>, no special
+	 *         background is painted behind a matched bracket.
+	 * @see #setMatchedBracketBGColor
+	 * @see #getMatchedBracketBorderColor
+	 */
+	public Color getMatchedBracketBGColor() {
+		return matchedBracketBGColor;
+	}
+
+
+	/**
+	 * Gets the color used as the border for a matched bracket.
+	 *
+	 * @return The color used.
+	 * @see #setMatchedBracketBorderColor
+	 * @see #getMatchedBracketBGColor
+	 */
+	public Color getMatchedBracketBorderColor() {
+		return matchedBracketBorderColor;
+	}
+
+
+	/**
+	 * Returns the matched bracket's rectangle, or <code>null</code> if there
+	 * is currently no matched bracket.  Note that this shouldn't ever be
+	 * called by the user.
+	 *
+	 * @return The rectangle surrounding the matched bracket.
+	 */
+	public final Rectangle getMatchRectangle() {
+		return match;
+	}
+
+
+	/**
+	 * Overridden to return the max ascent for any font used in the editor.
+	 *
+	 * @return The max ascent value.
+	 */
+	public int getMaxAscent() {
+		return maxAscent;
+	}
+
+
+	/**
+	 * Returns whether tab lines are painted.
+	 *
+	 * @return Whether tab lines are painted.
+	 * @see #setPaintTabLines(boolean)
+	 * @see #getTabLineColor()
+	 */
+	public boolean getPaintTabLines() {
+		return paintTabLines;
+	}
+
+
+	/**
+	 * Returns the specified parser.
+	 *
+	 * @param index The {@link Parser} to retrieve.
+	 * @return The <code>Parser</code>.
+	 * @see #getParserCount()
+	 * @see #addParser(Parser)
+	 */
+	public Parser getParser(int index) {
+		return parserManager.getParser(index);
+	}
+
+
+	/**
+	 * Returns the number of parsers operating on this text area.
+	 *
+	 * @return The parser count.
+	 * @see #addParser(Parser)
+	 */
+	public int getParserCount() {
+		return parserManager==null ? 0 : parserManager.getParserCount();
+	}
+
+
+	/**
+	 * Returns a list of the current parser notices for this text area.
+	 * This method (like most Swing methods) should only be called on the
+	 * EDT.
+	 *
+	 * @return The list of notices.  This will be an empty list if there are
+	 *         none.
+	 */
+	public List getParserNotices() {
+		return parserManager==null ? Collections.EMPTY_LIST :
+									parserManager.getParserNotices();
+	}
+
+
+	/**
+	 * Returns the RTF generator for this text area, lazily creating it
+	 * if necessary.
+	 *
+	 * @return The RTF generator.
+	 */
+	private RtfGenerator getRTFGenerator() {
+		if (rtfGenerator==null) {
+			rtfGenerator = new RtfGenerator();
+		}
+		else {
+			rtfGenerator.reset();
+		}
+		return rtfGenerator;
+	}
+
+
+	/**
+	 * If auto-indent is enabled, this method returns whether a new line after
+	 * this one should be indented (based on the standard indentation rules for
+	 * the current programming language). For example, in Java, for a line
+	 * containing:
+	 * 
+	 * <pre>
+	 * for (int i=0; i<10; i++) {
+	 * </pre>
+	 * 
+	 * the following line should be indented.
+	 *
+	 * @param line The line to check.
+	 * @return Whether a line inserted after this one should be auto-indented.
+	 *         If auto-indentation is disabled, this will always return
+	 *         <code>false</code>.
+	 * @see #isAutoIndentEnabled()
+	 */
+	public boolean getShouldIndentNextLine(int line) {
+		if (isAutoIndentEnabled()) {
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			return doc.getShouldIndentNextLine(line);
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns what type of syntax highlighting this editor is doing.
+	 *
+	 * @return The style being used, such as
+	 *         {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+	 * @see #setSyntaxEditingStyle(String)
+	 * @see SyntaxConstants
+	 */
+	public String getSyntaxEditingStyle() {
+		return syntaxStyleKey;
+	}
+
+
+	/**
+	 * Returns all of the colors currently being used in syntax highlighting
+	 * by this text component.
+	 *
+	 * @return An instance of <code>SyntaxScheme</code> that represents
+	 *         the colors currently being used for syntax highlighting.
+	 * @see #setSyntaxScheme(SyntaxScheme)
+	 */
+	public SyntaxScheme getSyntaxScheme() {
+		return syntaxScheme;
+	}
+
+
+	/**
+	 * Returns the color used to paint tab lines.
+	 *
+	 * @return The color used to paint tab lines.
+	 * @see #setTabLineColor(Color)
+	 * @see #getPaintTabLines()
+	 * @see #setPaintTabLines(boolean)
+	 */
+	public Color getTabLineColor() {
+		return tabLineColor;
+	}
+
+
+	/**
+	 * Returns whether a border is painted around marked occurrences.
+	 *
+	 * @return Whether a border is painted.
+	 * @see #setPaintMarkOccurrencesBorder(boolean)
+	 * @see #getMarkOccurrencesColor()
+	 * @see #getMarkOccurrences()
+	 */
+	public boolean getPaintMarkOccurrencesBorder() {
+		return paintMarkOccurrencesBorder;
+	}
+
+
+	/**
+	 * Returns whether or not templates are enabled for all instances
+	 * of <code>RSyntaxTextArea</code>.
+	 *
+	 * @return Whether templates are enabled.
+	 * @see #saveTemplates()
+	 * @see #setTemplateDirectory(String)
+	 * @see #setTemplatesEnabled(boolean)
+	 */
+	public static synchronized boolean getTemplatesEnabled() {
+		return templatesEnabled;
+	}
+
+
+	/**
+	 * Returns a token list for the given range in the document.
+	 *
+	 * @param startOffs The starting offset in the document.
+	 * @param endOffs The end offset in the document.
+	 * @return The first token in the token list.
+	 */
+	private Token getTokenListFor(int startOffs, int endOffs) {
+
+		Token tokenList = null;
+		Token lastToken = null;
+
+		Element map = getDocument().getDefaultRootElement();
+		int startLine = map.getElementIndex(startOffs);
+		int endLine = map.getElementIndex(endOffs);
+
+		for (int line=startLine; line<=endLine; line++) {
+			Token t = getTokenListForLine(line);
+			t = cloneTokenList(t);
+			if (tokenList==null) {
+				tokenList = t;
+				lastToken = tokenList;
+			}
+			else {
+				lastToken.setNextToken(t);
+			}
+			while (lastToken.getNextToken()!=null &&
+					lastToken.getNextToken().isPaintable()) {
+				lastToken = lastToken.getNextToken();
+			}
+			if (line<endLine) {
+				// Document offset MUST be correct to prevent exceptions
+				// in getTokenListFor()
+				int docOffs = map.getElement(line).getEndOffset()-1;
+				t = new DefaultToken(new char[] { '\n' }, 0,0, docOffs,
+								Token.WHITESPACE);
+				lastToken.setNextToken(t);
+				lastToken = t;
+			}
+		}
+
+		// Trim the beginning and end of the token list so that it starts
+		// at startOffs and ends at endOffs.
+
+		// Be careful and check that startOffs is actually in the list.
+		// startOffs can be < the token list's start if the end "newline"
+		// character of a line is the first character selected (the token
+		// list returned for that line will be null, so the first token in
+		// the final token list will be from the next line and have a
+		// starting offset > startOffs?).
+		if (startOffs>=tokenList.offset) {
+			while (!tokenList.containsPosition(startOffs)) {
+				tokenList = tokenList.getNextToken();
+			}
+			tokenList.makeStartAt(startOffs);
+		}
+
+		Token temp = tokenList;
+		// Be careful to check temp for null here.  It is possible that no
+		// token contains endOffs, if endOffs is at the end of a line.
+		while (temp!=null && !temp.containsPosition(endOffs)) {
+			temp = temp.getNextToken();
+		}
+		if (temp!=null) {
+			temp.textCount = endOffs - temp.offset;
+			temp.setNextToken(null);
+		}
+
+		return tokenList;
+
+	}
+
+
+	/**
+	 * Returns a list of tokens representing the given line.
+	 *
+	 * @param line The line number to get tokens for.
+	 * @return A linked list of tokens representing the line's text.
+	 */
+	public Token getTokenListForLine(int line) {
+		return ((RSyntaxDocument)getDocument()).getTokenListForLine(line);
+	}
+
+
+	/**
+	 * Returns the tool tip to display for a mouse event at the given
+	 * location.  This method is overridden to give a registered parser a
+	 * chance to display a tool tip (such as an error description when the
+	 * mouse is over an error highlight).
+	 *
+	 * @param e The mouse event.
+	 */
+	public String getToolTipText(MouseEvent e) {
+
+		// Check parsers for tool tips first.
+		String text = null;
+		URL imageBase = null;
+		if (parserManager!=null) {
+			ToolTipInfo info = parserManager.getToolTipText(e);
+			if (info!=null) { // Should always be true
+				text = info.getToolTipText(); // May be null
+				imageBase = info.getImageBase(); // May be null
+			}
+		}
+		if (text==null) {
+			text = super.getToolTipText(e);
+		}
+
+		// Do we want to use "focusable" tips?
+		if (getUseFocusableTips()) {
+			if (text!=null) {
+				if (focusableTip==null) {
+					focusableTip = new FocusableTip(this, parserManager);
+				}
+				focusableTip.setImageBase(imageBase);
+				focusableTip.toolTipRequested(e, text);
+			}
+			// No tool tip text at new location - hide tip window if one is
+			// currently visible
+			else if (focusableTip!=null) {
+				focusableTip.possiblyDisposeOfTipWindow();
+			}
+			return null;
+		}
+
+		return text; // Standard tool tips
+
+	}
+
+
+	/**
+	 * Returns whether the specified token should be underlined.
+	 * A token is underlined if its syntax style includes underlining,
+	 * or if it is a hyperlink and hyperlinks are enabled.
+	 *
+	 * @param t The token.
+	 * @return Whether the specified token should be underlined.
+	 */
+	public boolean getUnderlineForToken(Token t) {
+		return (t.isHyperlink() && getHyperlinksEnabled()) ||
+				syntaxScheme.getStyle(t.type).underline;
+	}
+
+
+	/**
+	 * Returns whether "focusable" tool tips are used instead of standard
+	 * ones.  Focusable tool tips are tool tips that the user can click on,
+	 * resize, copy from, and click links in.
+	 *
+	 * @return Whether to use focusable tool tips.
+	 * @see #setUseFocusableTips(boolean)
+	 * @see FocusableTip
+	 */
+	public boolean getUseFocusableTips() {
+		return useFocusableTips;
+	}
+
+
+	/**
+	 * Called by constructors to initialize common properties of the text
+	 * editor.
+	 */
+	protected void init() {
+
+		// NOTE: Our actions are created here instead of in a static block
+		// so they are only created when the first RTextArea is instantiated,
+		// not before.  There have been reports of users calling static getters
+		// (e.g. RSyntaxTextArea.getDefaultBracketMatchBGColor()) which would
+		// cause these actions to be created and (possibly) incorrectly
+		// localized, if they were in a static block.
+		if (toggleCurrentFoldAction==null) {
+			createRstaPopupMenuActions();
+		}
+
+		// Set some RSyntaxTextArea default values.
+		syntaxStyleKey = SYNTAX_STYLE_NONE;
+		setMatchedBracketBGColor(getDefaultBracketMatchBGColor());
+		setMatchedBracketBorderColor(getDefaultBracketMatchBorderColor());
+		setBracketMatchingEnabled(true);
+		setAnimateBracketMatching(true);
+		lastBracketMatchPos = -1;
+		setSelectionColor(getDefaultSelectionColor());
+		setTabLineColor(null);
+		setMarkOccurrencesColor(MarkOccurrencesSupport.DEFAULT_COLOR);
+
+		foldManager = new FoldManager(this);
+
+		// Set auto-indent related stuff.
+		setAutoIndentEnabled(true);
+		setCloseCurlyBraces(true);
+		setCloseMarkupTags(true);
+		setClearWhitespaceLinesEnabled(true);
+
+		setHyperlinksEnabled(true);
+		setLinkScanningMask(InputEvent.CTRL_DOWN_MASK);
+		setHyperlinkForeground(Color.BLUE);
+		isScanningForLinks = false;
+		setUseFocusableTips(true);
+
+		setAntiAliasingEnabled(true);
+		restoreDefaultSyntaxScheme();
+
+	}
+
+
+	/**
+	 * Returns whether or not auto-indent is enabled.
+	 *
+	 * @return Whether or not auto-indent is enabled.
+	 * @see #setAutoIndentEnabled(boolean)
+	 */
+	public boolean isAutoIndentEnabled() {
+		return autoIndentEnabled;
+	}
+
+
+	/**
+	 * Returns whether or not bracket matching is enabled.
+	 *
+	 * @return <code>true</code> iff bracket matching is enabled.
+	 * @see #setBracketMatchingEnabled
+	 */
+	public final boolean isBracketMatchingEnabled() {
+		return bracketMatchingEnabled;
+	}
+
+
+	/**
+	 * Returns whether or not lines containing nothing but whitespace are made
+	 * into blank lines when Enter is pressed in them.
+	 *
+	 * @return Whether or not whitespace-only lines are cleared when
+	 *         the user presses Enter on them.
+	 * @see #setClearWhitespaceLinesEnabled(boolean)
+	 */
+	public boolean isClearWhitespaceLinesEnabled() {
+		return clearWhitespaceLines;
+	}
+
+
+	/**
+	 * Returns whether code folding is enabled.  Note that only certain
+	 * languages support code folding; those that do not will ignore this
+	 * property.
+	 *
+	 * @return Whether code folding is enabled.
+	 * @see #setCodeFoldingEnabled(boolean)
+	 */
+	public boolean isCodeFoldingEnabled() {
+		return foldManager.isCodeFoldingEnabled();
+	}
+
+
+	/**
+	 * Returns whether whitespace (spaces and tabs) is visible.
+	 *
+	 * @return Whether whitespace is visible.
+	 * @see #setWhitespaceVisible(boolean)
+	 * @see #getEOLMarkersVisible()
+	 */
+	public boolean isWhitespaceVisible() {
+		return whitespaceVisible;
+	}
+
+
+	/**
+	 * Returns the token at the specified position in the model.
+	 *
+	 * @param offs The position in the model.
+	 * @return The token, or <code>null</code> if no token is at that
+	 *         position.
+	 * @see #viewToToken(Point)
+	 */
+	private Token modelToToken(int offs) {
+		if (offs>=0) {
+			try {
+				int line = getLineOfOffset(offs);
+				Token t = getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+					if (t.containsPosition(offs)) {
+						return t;
+					}
+					t = t.getNextToken();
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+		return null;
+	}
+
+
+	/**
+	 * The <code>paintComponent</code> method is overridden so we
+	 * apply any necessary rendering hints to the Graphics object.
+	 */
+	protected void paintComponent(Graphics g) {
+		super.paintComponent(getGraphics2D(g));
+	}
+
+
+	private void refreshFontMetrics(Graphics2D g2d) {
+		// It is assumed that any rendering hints are already applied to g2d.
+		defaultFontMetrics = g2d.getFontMetrics(getFont());
+		syntaxScheme.refreshFontMetrics(g2d);
+		if (getLineWrap()==false) {
+			// HORRIBLE HACK!  The un-wrapped view needs to refresh its cached
+			// longest line information.
+			SyntaxView sv = (SyntaxView)getUI().getRootView(this).getView(0);
+			sv.calculateLongestLine();
+		}
+	}
+
+
+	/**
+	 * Removes an "active line range" listener from this text area.
+	 *
+	 * @param l The listener to remove.
+	 * @see #removeActiveLineRangeListener(ActiveLineRangeListener)
+	 */
+	public void removeActiveLineRangeListener(ActiveLineRangeListener l) {
+		listenerList.remove(ActiveLineRangeListener.class, l);
+	}
+
+
+	/**
+	 * Removes a hyperlink listener from this text area.
+	 *
+	 * @param l The listener to remove.
+	 * @see #addHyperlinkListener(HyperlinkListener)
+	 */
+	public void removeHyperlinkListener(HyperlinkListener l) {
+		listenerList.remove(HyperlinkListener.class, l);
+	}
+
+
+	/**
+	 * Overridden so we stop this text area's parsers, if any.
+	 */
+	public void removeNotify() {
+		if (parserManager!=null) {
+			parserManager.stopParsing();
+		}
+		super.removeNotify();
+	}
+
+
+	/**
+	 * Removes a parser from this text area.
+	 *
+	 * @param parser The {@link Parser} to remove.
+	 * @return Whether the parser was found and removed.
+	 * @see #clearParsers()
+	 * @see #addParser(Parser)
+	 * @see #getParser(int)
+	 */
+	public boolean removeParser(Parser parser) {
+		boolean removed = false;
+		if (parserManager!=null) {
+			removed = parserManager.removeParser(parser);
+		}
+		return removed;
+	}
+
+
+	/**
+	 * Sets the colors used for syntax highlighting to their defaults.
+	 *
+	 * @see #setSyntaxScheme(SyntaxScheme)
+	 * @see #getSyntaxScheme()
+	 * @see #getDefaultSyntaxScheme()
+	 */
+	public void restoreDefaultSyntaxScheme() {
+		setSyntaxScheme(getDefaultSyntaxScheme());
+	}
+
+
+	/**
+	 * Attempts to save all currently-known templates to the current template
+	 * directory, as set by <code>setTemplateDirectory</code>.  Templates
+	 * will be saved as XML files with names equal to their abbreviations; for
+	 * example, a template that expands on the word "forb" will be saved as
+	 * <code>forb.xml</code>.
+	 *
+	 * @return Whether or not the save was successful.  The save will
+	 *         be unsuccessful if the template directory does not exist or
+	 *         if it has not been set (i.e., you have not yet called
+	 *         <code>setTemplateDirectory</code>).
+	 * @see #getTemplatesEnabled
+	 * @see #setTemplateDirectory
+	 * @see #setTemplatesEnabled
+	 */
+	public static synchronized boolean saveTemplates() {
+		if (!getTemplatesEnabled()) {
+			return false;
+		}
+		return getCodeTemplateManager().saveTemplates();
+	}
+
+
+	/**
+	 * Sets the "active line range."  Note that this
+	 * <code>RSyntaxTextArea</code> itself does nothing with this information,
+	 * but if it is contained inside an {@link RTextScrollPane}, the active
+	 * line range may be displayed in the icon area of the {@link Gutter}.<p>
+	 * 
+	 * Note that basic users of <code>RSyntaxTextArea</code> will not call this
+	 * method directly; rather, it is usually called by instances of
+	 * <code>LanguageSupport</code> in the <code>RSTALangaugeSupport</code>
+	 * library.  See <a href="http://fifesoft.com">http://fifesoft.com</a>
+	 * for more information about this library.
+	 *
+	 * @param min The "minimum" line in the active line range, or
+	 *        <code>-1</code> if the range is being cleared.
+	 * @param max The "maximum" line in the active line range, or
+	 *        <code>-1</code> if the range is being cleared.
+	 * @see #addActiveLineRangeListener(ActiveLineRangeListener)
+	 */
+	public void setActiveLineRange(int min, int max) {
+		if (min==-1) {
+			max = -1; // Force max to be -1 if min is.
+		}
+		fireActiveLineRangeEvent(min, max);
+	}
+
+
+	/**
+	 * Sets whether bracket matching should be animated.  This fires a property
+	 * change event of type {@link #ANIMATE_BRACKET_MATCHING_PROPERTY}.
+	 *
+	 * @param animate Whether to animate bracket matching.
+	 * @see #getAnimateBracketMatching()
+	 */
+	public void setAnimateBracketMatching(boolean animate) {
+		if (animate!=animateBracketMatching) {
+			animateBracketMatching = animate;
+			if (animate && bracketRepaintTimer==null) {
+				bracketRepaintTimer = new BracketMatchingTimer();
+			}
+			firePropertyChange(ANIMATE_BRACKET_MATCHING_PROPERTY,
+								!animate, animate);
+		}
+	}
+
+
+	/**
+	 * Sets whether anti-aliasing is enabled in this editor.  This method
+	 * fires a property change event of type {@link #ANTIALIAS_PROPERTY}.
+	 *
+	 * @param enabled Whether anti-aliasing is enabled.
+	 * @see #getAntiAliasingEnabled()
+	 */
+	public void setAntiAliasingEnabled(boolean enabled) {
+
+		boolean currentlyEnabled = aaHints!=null;
+
+		if (enabled!=currentlyEnabled) {
+
+			if (enabled) {
+				aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+				// If the desktop query method comes up empty, use the standard
+				// Java2D greyscale method.  Note this will likely NOT be as
+				// nice as what would be used if the getDesktopAntiAliasHints()
+				// call worked.
+				if (aaHints==null) {
+					aaHints = new HashMap();
+					aaHints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+							RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+				}
+			}
+			else {
+				aaHints = null;
+			}
+
+			// We must be connected to a screen resource for our graphics
+			// to be non-null.
+			if (isDisplayable()) {
+				refreshFontMetrics(getGraphics2D(getGraphics()));
+			}
+			firePropertyChange(ANTIALIAS_PROPERTY, !enabled, enabled);
+			repaint();
+
+		}
+
+	}
+
+
+	/**
+	 * Sets whether or not auto-indent is enabled.  This fires a property
+	 * change event of type {@link #AUTO_INDENT_PROPERTY}.
+	 *
+	 * @param enabled Whether or not auto-indent is enabled.
+	 * @see #isAutoIndentEnabled()
+	 */
+	public void setAutoIndentEnabled(boolean enabled) {
+		if (autoIndentEnabled!=enabled) {
+			autoIndentEnabled = enabled;
+			firePropertyChange(AUTO_INDENT_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets whether bracket matching is enabled.  This fires a property change
+	 * event of type {@link #BRACKET_MATCHING_PROPERTY}.
+	 *
+	 * @param enabled Whether or not bracket matching should be enabled.
+	 * @see #isBracketMatchingEnabled()
+	 */
+	public void setBracketMatchingEnabled(boolean enabled) {
+		if (enabled!=bracketMatchingEnabled) {
+			bracketMatchingEnabled = enabled;
+			repaint();
+			firePropertyChange(BRACKET_MATCHING_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets whether or not lines containing nothing but whitespace are made
+	 * into blank lines when Enter is pressed in them.  This method fires
+	 * a property change event of type {@link #CLEAR_WHITESPACE_LINES_PROPERTY}.
+	 *
+	 * @param enabled Whether or not whitespace-only lines are cleared when
+	 *        the user presses Enter on them.
+	 * @see #isClearWhitespaceLinesEnabled()
+	 */
+	public void setClearWhitespaceLinesEnabled(boolean enabled) {
+		if (enabled!=clearWhitespaceLines) {
+			clearWhitespaceLines = enabled;
+			firePropertyChange(CLEAR_WHITESPACE_LINES_PROPERTY,
+							!enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Toggles whether curly braces should be automatically closed when a
+	 * newline is entered after an opening curly brace.  Note that this
+	 * property is only honored for languages that use curly braces to denote
+	 * code blocks.<p>
+	 *
+	 * This method fires a property change event of type
+	 * {@link #CLOSE_CURLY_BRACES_PROPERTY}.
+	 *
+	 * @param close Whether curly braces should be automatically closed.
+	 * @see #getCloseCurlyBraces()
+	 */
+	public void setCloseCurlyBraces(boolean close) {
+		if (close!=closeCurlyBraces) {
+			closeCurlyBraces = close;
+			firePropertyChange(CLOSE_CURLY_BRACES_PROPERTY, !close, close);
+		}
+	}
+
+
+	/**
+	 * Sets whether closing markup tags should be automatically completed
+	 * when "<code>&lt;/</code>" is typed.  Note that this property is only
+	 * honored for markup languages, such as HTML, XML and PHP.<p>
+	 *
+	 * This method fires a property change event of type
+	 * {@link #CLOSE_MARKUP_TAGS_PROPERTY}.
+	 *
+	 * @param close Whether closing markup tags should be automatically
+	 *        completed.
+	 * @see #getCloseMarkupTags()
+	 */
+	public void setCloseMarkupTags(boolean close) {
+		if (close!=closeMarkupTags) {
+			closeMarkupTags = close;
+			firePropertyChange(CLOSE_MARKUP_TAGS_PROPERTY, !close, close);
+		}
+	}
+
+
+	/**
+	 * Sets whether code folding is enabled.  Note that only certain
+	 * languages will support code folding out of the box.  Those languages
+	 * which do not support folding will ignore this property.<p>
+	 * This method fires a property change event of type
+	 * {@link #CODE_FOLDING_PROPERTY}.
+	 *
+	 * @param enabled Whether code folding should be enabled.
+	 * @see #isCodeFoldingEnabled()
+	 */
+	public void setCodeFoldingEnabled(boolean enabled) {
+		if (enabled!=foldManager.isCodeFoldingEnabled()) {
+			foldManager.setCodeFoldingEnabled(enabled);
+			firePropertyChange(CODE_FOLDING_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets the document used by this text area.  This is overridden so that
+	 * only instances of {@link RSyntaxDocument} are accepted; for all
+	 * others, an exception will be thrown.
+	 *
+	 * @param document The new document for this text area.
+	 * @throws IllegalArgumentException If the document is not an
+	 *         <code>RSyntaxDocument</code>.
+	 */
+	public void setDocument(Document document) {
+		if (!(document instanceof RSyntaxDocument))
+			throw new IllegalArgumentException("Documents for " +
+					"RSyntaxTextArea must be instances of " +
+					"RSyntaxDocument!");
+		super.setDocument(document);
+	}
+
+
+	/**
+	 * Sets whether EOL markers are visible at the end of each line.  This
+	 * method fires a property change of type {@link #EOL_VISIBLE_PROPERTY}.
+	 *
+	 * @param visible Whether EOL markers are visible.
+	 * @see #getEOLMarkersVisible()
+	 * @see #setWhitespaceVisible(boolean)
+	 */
+	public void setEOLMarkersVisible(boolean visible) {
+		if (visible!=eolMarkersVisible) {
+			eolMarkersVisible = visible;
+			repaint();
+			firePropertyChange(EOL_VISIBLE_PROPERTY, !visible, visible);
+		}
+	}
+
+
+	/**
+	 * Sets the font used by this text area.  Note that this method does not
+	 * alter the appearance of an <code>RSyntaxTextArea</code> since it uses
+	 * different fonts for each token type.
+	 *
+	 * @param font The font.
+	 */
+	public void setFont(Font font) {
+
+		Font old = super.getFont();
+		super.setFont(font); // Do this first.
+
+		// Usually programmers keep a single font for all token types, but
+		// may use bold or italic for styling some.
+		SyntaxScheme scheme = getSyntaxScheme();
+		if (scheme!=null && old!=null) {
+			scheme.changeBaseFont(old, font);
+			calculateLineHeight();
+		}
+
+		// We must be connected to a screen resource for our
+		// graphics to be non-null.
+		if (isDisplayable()) {
+			refreshFontMetrics(getGraphics2D(getGraphics()));
+			// Updates the margin line.
+			updateMarginLineX();
+			// Force the current line highlight to be repainted, even
+			// though the caret's location hasn't changed.
+			forceCurrentLineHighlightRepaint();
+			// Get line number border in text area to repaint again
+			// since line heights have updated.
+			firePropertyChange("font", old, font);
+			// So parent JScrollPane will have its scrollbars updated.
+			revalidate();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether fractional font metrics are enabled.  This method fires
+	 * a property change event of type {@link #FRACTIONAL_FONTMETRICS_PROPERTY}.
+	 *
+	 * @param enabled Whether fractional font metrics are enabled.
+	 * @see #getFractionalFontMetricsEnabled()
+	 */
+	public void setFractionalFontMetricsEnabled(boolean enabled) {
+		if (fractionalFontMetricsEnabled!=enabled) {
+			fractionalFontMetricsEnabled = enabled;
+			// We must be connected to a screen resource for our graphics to be
+			// non-null.
+			if (isDisplayable()) {
+				refreshFontMetrics(getGraphics2D(getGraphics()));
+			}
+			firePropertyChange(FRACTIONAL_FONTMETRICS_PROPERTY,
+											!enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets the highlighter used by this text area.
+	 *
+	 * @param h The highlighter.
+	 * @throws IllegalArgumentException If <code>h</code> is not an instance
+	 *         of {@link RSyntaxTextAreaHighlighter}.
+	 */
+	public void setHighlighter(Highlighter h) {
+		if (!(h instanceof RSyntaxTextAreaHighlighter)) {
+			throw new IllegalArgumentException("RSyntaxTextArea requires " +
+				"an RSyntaxTextAreaHighlighter for its Highlighter");
+		}
+		super.setHighlighter(h);
+	}
+
+
+	/**
+	 * Sets the color to use when painting hyperlinks.
+	 *
+	 * @param fg The color to use when painting hyperlinks.
+	 * @throws NullPointerException If <code>fg</code> is <code>null</code>.
+	 * @see #getHyperlinkForeground()
+	 * @see #setHyperlinksEnabled(boolean)
+	 */
+	public void setHyperlinkForeground(Color fg) {
+		if (fg==null) {
+			throw new NullPointerException("fg cannot be null");
+		}
+		hyperlinkFG = fg;
+	}
+
+
+	/**
+	 * Sets whether hyperlinks are enabled for this text area.  This method
+	 * fires a property change event of type
+	 * {@link #HYPERLINKS_ENABLED_PROPERTY}.
+	 *
+	 * @param enabled Whether hyperlinks are enabled.
+	 * @see #getHyperlinksEnabled()
+	 */
+	public void setHyperlinksEnabled(boolean enabled) {
+		if (this.hyperlinksEnabled!=enabled) {
+			this.hyperlinksEnabled = enabled;
+			repaint();
+			firePropertyChange(HYPERLINKS_ENABLED_PROPERTY, !enabled, enabled);
+		}
+	}
+
+
+	/**
+	 * Sets the mask for the key used to toggle whether we are scanning for
+	 * hyperlinks with mouse hovering.
+	 *
+	 * @param mask The mask to use.  This should be a value such as
+	 *        {@link InputEvent#CTRL_DOWN_MASK} or
+	 *        {@link InputEvent#META_DOWN_MASK}.
+	 *        For invalid values, behavior is undefined.
+	 * @see InputEvent
+	 */
+	public void setLinkScanningMask(int mask) {
+		if (mask==InputEvent.CTRL_DOWN_MASK ||
+				mask==InputEvent.META_DOWN_MASK ||
+				mask==InputEvent.ALT_DOWN_MASK ||
+				mask==InputEvent.SHIFT_DOWN_MASK) {
+			linkScanningMask = mask;
+		}
+	}
+
+
+	/**
+	 * Toggles whether "mark occurrences" is enabled.  This method fires a
+	 * property change event of type {@link #MARK_OCCURRENCES_PROPERTY}.
+	 *
+	 * @param markOccurrences Whether "Mark Occurrences" should be enabled.
+	 * @see #getMarkOccurrences()
+	 * @see #setMarkOccurrencesColor(Color)
+	 */
+	public void setMarkOccurrences(boolean markOccurrences) {
+		if (markOccurrences) {
+			if (markOccurrencesSupport==null) {
+				markOccurrencesSupport = new MarkOccurrencesSupport();
+				markOccurrencesSupport.install(this);
+				firePropertyChange(MARK_OCCURRENCES_PROPERTY, false, true);
+			}
+		}
+		else {
+			if (markOccurrencesSupport!=null) {
+				markOccurrencesSupport.uninstall();
+				markOccurrencesSupport = null;
+				firePropertyChange(MARK_OCCURRENCES_PROPERTY, true, false);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets the "mark occurrences" color.
+	 *
+	 * @param color The new color.  This cannot be <code>null</code>.
+	 * @see #getMarkOccurrencesColor()
+	 * @see #setMarkOccurrences(boolean)
+	 */
+	public void setMarkOccurrencesColor(Color color) {
+		markOccurrencesColor = color;
+		if (markOccurrencesSupport!=null) {
+			markOccurrencesSupport.setColor(color);
+		}
+	}
+
+
+	/**
+	 * Sets the color used as the background for a matched bracket.
+	 *
+	 * @param color The color to use.  If this is <code>null</code>, then no
+	 *        special background is painted behind a matched bracket.
+	 * @see #getMatchedBracketBGColor
+	 * @see #setMatchedBracketBorderColor
+	 * @see #setPaintMarkOccurrencesBorder(boolean)
+	 */
+	public void setMatchedBracketBGColor(Color color) {
+		matchedBracketBGColor = color;
+		if (match!=null)
+			repaint();
+	}
+
+
+	/**
+	 * Sets the color used as the border for a matched bracket.
+	 *
+	 * @param color The color to use.
+	 * @see #getMatchedBracketBorderColor
+	 * @see #setMatchedBracketBGColor
+	 */
+	public void setMatchedBracketBorderColor(Color color) {
+		matchedBracketBorderColor = color;
+		if (match!=null)
+			repaint();
+	}
+
+
+	/**
+	 * Toggles whether a border should be painted around marked occurrences.
+	 *
+	 * @param paintBorder Whether to paint a border.
+	 * @see #getPaintMarkOccurrencesBorder()
+	 * @see #setMarkOccurrencesColor(Color)
+	 * @see #setMarkOccurrences(boolean)
+	 */
+	public void setPaintMarkOccurrencesBorder(boolean paintBorder) {
+		paintMarkOccurrencesBorder = paintBorder;
+		if (markOccurrencesSupport!=null) {
+			markOccurrencesSupport.setPaintBorder(paintBorder);
+		}
+	}
+
+
+	/**
+	 * Toggles whether tab lines are painted.  This method fires a property
+	 * change event of type {@link #TAB_LINES_PROPERTY}.
+	 *
+	 * @param paint Whether tab lines are painted.
+	 * @see #getPaintTabLines()
+	 * @see #setTabLineColor(Color)
+	 */
+	public void setPaintTabLines(boolean paint) {
+		if (paint!=paintTabLines) {
+			paintTabLines = paint;
+			repaint();
+			firePropertyChange(TAB_LINES_PROPERTY, !paint, paint);
+		}
+	}
+
+
+	/**
+	 * Sets what type of syntax highlighting this editor is doing.  This method
+	 * fires a property change of type {@link #SYNTAX_STYLE_PROPERTY}.
+	 *
+	 * @param styleKey The syntax editing style to use, for example,
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_NONE} or
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+	 * @see #getSyntaxEditingStyle()
+	 * @see SyntaxConstants
+	 */
+	public void setSyntaxEditingStyle(String styleKey) {
+		if (styleKey==null) {
+			styleKey = SYNTAX_STYLE_NONE;
+		}
+		if (!styleKey.equals(syntaxStyleKey)) {
+			String oldStyle = syntaxStyleKey;
+			syntaxStyleKey = styleKey;
+			((RSyntaxDocument)getDocument()).setSyntaxStyle(styleKey);
+			firePropertyChange(SYNTAX_STYLE_PROPERTY, oldStyle, styleKey);
+			setActiveLineRange(-1, -1);
+		}
+
+	}
+
+
+	/**
+	 * Sets all of the colors used in syntax highlighting to the colors
+	 * specified.  This uses a shallow copy of the color scheme so that
+	 * multiple text areas can share the same color scheme and have their
+	 * properties changed simultaneously.<p>
+	 *
+	 * This method fires a property change event of type
+	 * {@link #SYNTAX_SCHEME_PROPERTY}.
+	 *
+	 * @param scheme The instance of <code>SyntaxScheme</code> to use.
+	 * @see #getSyntaxScheme()
+	 */
+	public void setSyntaxScheme(SyntaxScheme scheme) {
+
+		// NOTE:  We don't check whether colorScheme is the same as the
+		// current scheme because DecreaseFontSizeAction and
+		// IncreaseFontSizeAction need it this way.
+		// FIXME:  Find a way around this.
+
+		SyntaxScheme old = this.syntaxScheme;
+		this.syntaxScheme = scheme;
+
+		// Recalculate the line height.  We do this here instead of in
+		// refreshFontMetrics() as this method is called less often and we
+		// don't need the rendering hints to get the font's height.
+		calculateLineHeight();
+
+		if (isDisplayable()) {
+			refreshFontMetrics(getGraphics2D(getGraphics()));
+		}
+
+		// Updates the margin line.
+		updateMarginLineX();
+
+		// Force the current line highlight to be repainted, even though
+		// the caret's location hasn't changed.
+		forceCurrentLineHighlightRepaint();
+
+		// So encompassing JScrollPane will have its scrollbars updated.
+		revalidate();
+
+		firePropertyChange(SYNTAX_SCHEME_PROPERTY, old, this.syntaxScheme);
+
+	}
+
+
+	/**
+	 * If templates are enabled, all currently-known templates are forgotten
+	 * and all templates are loaded from all files in the specified directory
+	 * ending in "*.xml".  If templates aren't enabled, nothing happens.
+	 *
+	 * @param dir The directory containing files ending in extension
+	 *        <code>.xml</code> that contain templates to load.
+	 * @return <code>true</code> if the load was successful;
+	 *         <code>false</code> if either templates aren't currently
+	 *         enabled or the load failed somehow (most likely, the
+	 *         directory doesn't exist).	 
+	 * @see #getTemplatesEnabled
+	 * @see #setTemplatesEnabled
+	 * @see #saveTemplates
+	 */
+	public static synchronized boolean setTemplateDirectory(String dir) {
+		if (getTemplatesEnabled() && dir!=null) {
+			File directory = new File(dir);
+			if (directory.isDirectory()) {
+				return getCodeTemplateManager().
+						setTemplateDirectory(directory)>-1;
+			}
+			boolean created = directory.mkdir();
+			if (created) {
+				return getCodeTemplateManager().
+					setTemplateDirectory(directory)>-1;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Enables or disables templates.<p>
+	 *
+	 * Templates are a set of "shorthand identifiers" that you can configure
+	 * so that you only have to type a short identifier (such as "forb") to
+	 * insert a larger amount of code into the document (such as:<p>
+	 *
+	 * <pre>
+	 *   for (&lt;caret&gt;) {
+	 *
+	 *   }
+	 * </pre>
+	 *
+	 * Templates are a shared resource among all instances of
+	 * <code>RSyntaxTextArea</code>; that is, templates can only be
+	 * enabled/disabled for all text areas globally, not individually, and
+	 * all text areas have access of the same templates.  This should not
+	 * be an issue; rather, it should be beneficial as it promotes
+	 * uniformity among all text areas in an application.
+	 *
+	 * @param enabled Whether or not templates should be enabled.
+	 * @see #getTemplatesEnabled()
+	 */
+	public static synchronized void setTemplatesEnabled(boolean enabled) {
+		templatesEnabled = enabled;
+	}
+
+
+	/**
+	 * Sets the color use to paint tab lines.  This method fires a property
+	 * change event of type {@link #TAB_LINE_COLOR_PROPERTY}.
+	 *
+	 * @param c The color.  If this value is <code>null</code>, the default
+	 *        (gray) is used.
+	 * @see #getTabLineColor()
+	 * @see #setPaintTabLines(boolean)
+	 * @see #getPaintTabLines()
+	 */
+	public void setTabLineColor(Color c) {
+
+		if (c==null) {
+			c = Color.gray;
+		}
+
+		if (!c.equals(tabLineColor)) {
+			Color old = tabLineColor;
+			tabLineColor = c;
+			if (getPaintTabLines()) {
+				repaint();
+			}
+			firePropertyChange(TAB_LINE_COLOR_PROPERTY, old, tabLineColor);
+		}
+
+	}
+
+
+	/**
+	 * Sets whether "focusable" tool tips are used instead of standard ones.
+	 * Focusable tool tips are tool tips that the user can click on,
+	 * resize, copy from, and clink links in.  This method fires a property
+	 * change event of type {@link #FOCUSABLE_TIPS_PROPERTY}.
+	 *
+	 * @param use Whether to use focusable tool tips.
+	 * @see #getUseFocusableTips()
+	 * @see FocusableTip
+	 */
+	public void setUseFocusableTips(boolean use) {
+		if (use!=useFocusableTips) {
+			useFocusableTips = use;
+			firePropertyChange(FOCUSABLE_TIPS_PROPERTY, !use, use);
+		}
+	}
+
+
+	/**
+	 * Sets whether whitespace is visible.  This method fires a property change
+	 * of type {@link #VISIBLE_WHITESPACE_PROPERTY}.
+	 *
+	 * @param visible Whether whitespace should be visible.
+	 * @see #isWhitespaceVisible
+	 */
+	public void setWhitespaceVisible(boolean visible) {
+		if (whitespaceVisible!=visible) {
+			whitespaceVisible = visible;
+			((RSyntaxDocument)getDocument()).setWhitespaceVisible(visible);
+			repaint();
+			firePropertyChange(VISIBLE_WHITESPACE_PROPERTY, !visible, visible);
+		}
+	}
+
+
+	/**
+	 * Resets the editor state after the user clicks on a hyperlink or releases
+	 * the hyperlink modifier.
+	 */
+	private void stopScanningForLinks() {
+		if (isScanningForLinks) {
+			Cursor c = getCursor();
+			isScanningForLinks = false;
+			hoveredOverLinkOffset = -1;
+			if (c!=null && c.getType()==Cursor.HAND_CURSOR) {
+				setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
+				repaint(); // TODO: Repaint just the affected line.
+			}
+		}
+	}
+
+
+	/**
+	 * Returns the token at the specified position in the view.
+	 *
+	 * @param p The position in the view.
+	 * @return The token, or <code>null</code> if no token is at that
+	 *         position.
+	 * @see #modelToToken(int)
+	 */
+	/*
+	 * TODO: This is a little inefficient.  This should convert view
+	 * coordinates to the underlying token (if any).  The way things currently
+	 * are, we're calling getTokenListForLine() twice (once in viewToModel()
+	 * and once here).
+	 */
+	private Token viewToToken(Point p) {
+		return modelToToken(viewToModel(p));
+	}
+
+
+	/**
+	 * A timer that animates the "bracket matching" animation.
+	 */
+	private class BracketMatchingTimer extends Timer implements ActionListener {
+
+		private int pulseCount;
+
+		public BracketMatchingTimer() {
+			super(20, null);
+			addActionListener(this);
+			setCoalesce(false);
+		}
+
+		public void actionPerformed(ActionEvent e) {
+			if (isBracketMatchingEnabled()) {
+				if (match!=null) {
+					if (pulseCount<5) {
+						pulseCount++;
+						match.x--;
+						match.y--;
+						match.width += 2;
+						match.height += 2;
+						repaint(match.x,match.y, match.width,match.height);
+					}
+					else if (pulseCount<7) {
+						pulseCount++;
+						match.x++;
+						match.y++;
+						match.width -= 2;
+						match.height -= 2;
+						repaint(match.x-2,match.y-2, match.width+5,match.height+5);
+					}
+					else {
+						stop();
+						pulseCount = 0;
+					}
+				}
+			}
+		}
+
+		public void start() {
+			match.x += 3;
+			match.y += 3;
+			match.width -= 6;
+			match.height -= 6; // So animation can "grow" match
+			pulseCount = 0;
+			super.start();
+		}
+
+	}
+
+
+	/**
+	 * Handles hyperlinks.
+	 */
+	private class RSyntaxTextAreaMutableCaretEvent
+					extends RTextAreaMutableCaretEvent {
+
+		protected RSyntaxTextAreaMutableCaretEvent(RTextArea textArea) {
+			super(textArea);
+		}
+
+		public void mouseClicked(MouseEvent e) {
+			if (getHyperlinksEnabled() && isScanningForLinks &&
+					hoveredOverLinkOffset>-1) {
+				Token t = modelToToken(hoveredOverLinkOffset);
+				URL url = null;
+				String desc = null;
+				try {
+					String temp = t.getLexeme();
+					// URI's need "http://" prefix for web URL's to work.
+					if (temp.startsWith("www.")) {
+						temp = "http://" + temp;
+					}
+					url = new URL(temp);
+				} catch (MalformedURLException mue) {
+					desc = mue.getMessage();
+				}
+				HyperlinkEvent he = new HyperlinkEvent(this,
+						HyperlinkEvent.EventType.ACTIVATED,
+						url, desc);
+				fireHyperlinkUpdate(he);
+				stopScanningForLinks();
+			}
+		}
+
+		public void mouseMoved(MouseEvent e) {
+			super.mouseMoved(e);
+			if (getHyperlinksEnabled()) {
+				if ((e.getModifiersEx()&linkScanningMask)!=0) {
+					isScanningForLinks = true;
+					Token t = viewToToken(e.getPoint());
+					Cursor c2 = null;
+					if (t!=null && t.isHyperlink()) {
+						hoveredOverLinkOffset = t.offset;
+						c2 = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
+					}
+					else {
+						c2 = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
+						hoveredOverLinkOffset = -1;
+					}
+					if (getCursor()!=c2) {
+						setCursor(c2);
+						// TODO: Repaint just the affected line(s).
+						repaint(); // Link either left or went into.
+					}
+				}
+				else {
+					if (isScanningForLinks) {
+						stopScanningForLinks();
+					}
+				}
+			}
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java	(revision 25584)
@@ -0,0 +1,64 @@
+/*
+ * 10/27/2004
+ *
+ * RSyntaxTextAreaDefaultInputMap.java - The default input map for
+ * RSyntaxTextAreas.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.KeyStroke;
+
+import org.fife.ui.rtextarea.RTADefaultInputMap;
+
+
+/**
+ * The default input map for an <code>RSyntaxTextArea</code>.
+ * Currently, the new key bindings include:
+ * <ul>
+ *   <li>Shift+Tab indents the current line or currently selected lines
+ *       to the left.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RSyntaxTextAreaDefaultInputMap extends RTADefaultInputMap {
+
+	/**
+	 * Constructs the default input map for an <code>RSyntaxTextArea</code>.
+	 */
+	public RSyntaxTextAreaDefaultInputMap() {
+
+		int defaultMod = getDefaultModifier();
+		//int ctrl = InputEvent.CTRL_MASK;
+		int shift = InputEvent.SHIFT_MASK;
+		//int alt = InputEvent.ALT_MASK;
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,   shift),				RSyntaxTextAreaEditorKit.rstaDecreaseIndentAction);
+		put(KeyStroke.getKeyStroke('}'),									RSyntaxTextAreaEditorKit.rstaCloseCurlyBraceAction);
+		put(KeyStroke.getKeyStroke('/'), 									RSyntaxTextAreaEditorKit.rstaCloseMarkupTagAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, defaultMod),			RSyntaxTextAreaEditorKit.rstaToggleCommentAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, defaultMod),	RSyntaxTextAreaEditorKit.rstaGoToMatchingBracketAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, defaultMod),		RSyntaxTextAreaEditorKit.rstaCollapseFoldAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, defaultMod),			RSyntaxTextAreaEditorKit.rstaExpandFoldAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DIVIDE, defaultMod),			RSyntaxTextAreaEditorKit.rstaCollapseAllFoldsAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_MULTIPLY, defaultMod),		RSyntaxTextAreaEditorKit.rstaExpandAllFoldsAction);
+
+		// FIXME:  The keystroke associated with this action should be dynamic and
+		// configurable and synchronized with the "trigger" defined in RSyntaxTextArea's
+		// CodeTemplateManager.
+		// NOTE:  no modifiers => mapped to keyTyped.  If we had "0" as a second
+		// second parameter, we'd get the template action (keyPressed) AND the
+		// default space action (keyTyped).
+		//put(KeyStroke.getKeyStroke(' '),			RSyntaxTextAreaEditorKit.rstaPossiblyInsertTemplateAction);
+		put(CodeTemplateManager.TEMPLATE_KEYSTROKE,	RSyntaxTextAreaEditorKit.rstaPossiblyInsertTemplateAction);
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java	(revision 25584)
@@ -0,0 +1,1902 @@
+/*
+ * 08/29/2004
+ *
+ * RSyntaxTextAreaEditorKit.java - The editor kit used by RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.ResourceBundle;
+import java.util.Stack;
+import javax.swing.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldCollapser;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rsyntaxtextarea.templates.CodeTemplate;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.IconRowHeader;
+import org.fife.ui.rtextarea.RecordableTextAction;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaEditorKit;
+
+
+/**
+ * An extension of <code>RTextAreaEditorKit</code> that adds functionality for
+ * programming-specific stuff.  There are currently subclasses to handle:
+ *
+ * <ul>
+ *   <li>Toggling code folds.</li>
+ *   <li>Aligning "closing" curly braces with their matches, if the current
+ *       programming language uses curly braces to identify code blocks.</li>
+ *   <li>Copying the current selection as RTF.</li>
+ *   <li>Block indentation (increasing the indent of one or multiple lines)</li>
+ *   <li>Block un-indentation (decreasing the indent of one or multiple lines)
+ *       </li>
+ *   <li>Inserting a "code template" when a configurable key (e.g. a space) is
+ *       pressed</li>
+ *   <li>Decreasing the point size of all fonts in the text area</li>
+ *   <li>Increasing the point size of all fonts in the text area</li>
+ *   <li>Moving the caret to the "matching bracket" of the one at the current
+ *       caret position</li>
+ *   <li>Toggling whether the currently selected lines are commented out.</li>
+ *   <li>Better selection of "words" on mouse double-clicks for programming
+ *       languages.</li>
+ *   <li>Better keyboard navigation via Ctrl+arrow keys for programming
+ *       languages.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class RSyntaxTextAreaEditorKit extends RTextAreaEditorKit {
+
+	private static final long serialVersionUID = 1L;
+
+	public static final String rstaCloseCurlyBraceAction	= "RSTA.CloseCurlyBraceAction";
+	public static final String rstaCloseMarkupTagAction		= "RSTA.CloseMarkupTagAction";
+	public static final String rstaCollapseAllFoldsAction	= "RSTA.CollapseAllFoldsAction";
+	public static final String rstaCollapseAllCommentFoldsAction = "RSTA.CollapseAllCommentFoldsAction";
+	public static final String rstaCollapseFoldAction		= "RSTA.CollapseFoldAction";
+	public static final String rstaCopyAsRtfAction			= "RSTA.CopyAsRtfAction";
+	public static final String rstaDecreaseIndentAction		= "RSTA.DecreaseIndentAction";
+	public static final String rstaExpandAllFoldsAction		= "RSTA.ExpandAllFoldsAction";
+	public static final String rstaExpandFoldAction			= "RSTA.ExpandFoldAction";
+	public static final String rstaGoToMatchingBracketAction	= "RSTA.GoToMatchingBracketAction";
+	public static final String rstaPossiblyInsertTemplateAction = "RSTA.TemplateAction";
+	public static final String rstaToggleCommentAction 		= "RSTA.ToggleCommentAction";
+	public static final String rstaToggleCurrentFoldAction	= "RSTA.ToggleCurrentFoldAction";
+
+	private static final String MSG	= "org.fife.ui.rsyntaxtextarea.RSyntaxTextArea";
+	private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+	/**
+	 * The actions that <code>RSyntaxTextAreaEditorKit</code> adds to those of
+	 * <code>RTextAreaEditorKit</code>.
+	 */
+	private static final Action[] defaultActions = {
+		new CloseCurlyBraceAction(),
+		new CloseMarkupTagAction(),
+		new BeginWordAction(beginWordAction, false),
+		new BeginWordAction(selectionBeginWordAction, true),
+		new ChangeFoldStateAction(rstaCollapseFoldAction, true),
+		new ChangeFoldStateAction(rstaExpandFoldAction, false),
+		new CollapseAllFoldsAction(),
+		new CopyAsRtfAction(),
+		//new DecreaseFontSizeAction(),
+		new DecreaseIndentAction(),
+		new DeletePrevWordAction(),
+		new EndAction(endAction, false),
+		new EndAction(selectionEndAction, true),
+		new EndWordAction(endWordAction, false),
+		new EndWordAction(endWordAction, true),
+		new ExpandAllFoldsAction(),
+		new GoToMatchingBracketAction(),
+		new InsertBreakAction(),
+		//new IncreaseFontSizeAction(),
+		new InsertTabAction(),
+		new NextWordAction(nextWordAction, false),
+		new NextWordAction(selectionNextWordAction, true),
+		new PossiblyInsertTemplateAction(),
+		new PreviousWordAction(previousWordAction, false),  
+		new PreviousWordAction(selectionPreviousWordAction, true),
+		new SelectWordAction(),
+		new ToggleCommentAction(),
+	};
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextAreaEditorKit() {
+	}
+
+
+	/**
+	 * Returns the default document used by <code>RSyntaxTextArea</code>s.
+	 *
+	 * @return The document.
+	 */
+	public Document createDefaultDocument() {
+		return new RSyntaxDocument(SyntaxConstants.SYNTAX_STYLE_NONE);
+	}
+
+
+	/**
+	 * Overridden to return a row header that is aware of folding.
+	 *
+	 * @param textArea The text area.
+	 * @return The icon row header.
+	 */
+	public IconRowHeader createIconRowHeader(RTextArea textArea) {
+		return new FoldingAwareIconRowHeader((RSyntaxTextArea)textArea);
+	}
+
+
+	/**
+	 * Fetches the set of commands that can be used
+	 * on a text component that is using a model and
+	 * view produced by this kit.
+	 *
+	 * @return the command list
+	 */ 
+	public Action[] getActions() {
+		return TextAction.augmentList(super.getActions(),
+							RSyntaxTextAreaEditorKit.defaultActions);
+	}
+
+
+	/**
+	 * Returns localized text for an action.  There's definitely a better place
+	 * for this functionality.
+	 *
+	 * @param key The key into the action resource bundle.
+	 * @return The localized text.
+	 */
+	public static String getString(String key) {
+		return msg.getString(key);
+	}
+
+
+	/**
+	 * Positions the caret at the beginning of the word.  This class is here
+	 * to better handle finding the "beginning of the word" for programming
+	 * languages.
+	 */
+	protected static class BeginWordAction
+							extends RTextAreaEditorKit.BeginWordAction {
+
+		private Segment seg;
+
+		protected BeginWordAction(String name, boolean select) {
+			super(name, select);
+			seg = new Segment();
+		}
+
+		protected int getWordStart(RTextArea textArea, int offs)
+										throws BadLocationException {
+
+			if (offs==0) {
+				return offs;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			int line = textArea.getLineOfOffset(offs);
+			int start = textArea.getLineStartOffset(line);
+			if (offs==start) {
+				return start;
+			}
+			int end = textArea.getLineEndOffset(line);
+			if (line!=textArea.getLineCount()-1) {
+				end--;
+			}
+			doc.getText(start, end-start, seg);
+
+			// Determine the "type" of char at offs - lower case, upper case,
+			// whitespace or other.  We take special care here as we're starting
+			// in the middle of the Segment to check whether we're already at
+			// the "beginning" of a word.
+			int firstIndex = seg.getBeginIndex() + (offs-start) - 1;
+			seg.setIndex(firstIndex);
+			char ch = seg.current();
+			char nextCh = offs==end ? 0 : seg.array[seg.getIndex() + 1];
+
+			// The "word" is a group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				if (offs!=end && !Character.isLetterOrDigit(nextCh)) {
+					return offs;
+				}
+				do {
+					ch = seg.previous();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// The "word" is whitespace
+			else if (Character.isWhitespace(ch)) {
+				if (offs!=end && !Character.isWhitespace(nextCh)) {
+					return offs;
+				}
+				do {
+					ch = seg.previous();
+				} while (Character.isWhitespace(ch));
+			}
+
+			// Otherwise, the "word" a single "something else" char (operator,
+			// etc.).
+
+			offs -= firstIndex - seg.getIndex() + 1;//seg.getEndIndex() - seg.getIndex();
+			if (ch!=Segment.DONE && nextCh!='\n') {
+				offs++;
+			}
+
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Expands or collapses the nearest fold.
+	 */
+	public static class ChangeFoldStateAction extends FoldRelatedAction {
+
+		private boolean collapse;
+
+		public ChangeFoldStateAction(String name, boolean collapse) {
+			super(name);
+			this.collapse = collapse;
+		}
+
+		public ChangeFoldStateAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				Fold fold = getClosestFold(rsta);
+				if (fold!=null) {
+					fold.setCollapsed(collapse);
+				}
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that (optionally) aligns a closing curly brace with the line
+	 * containing its matching opening curly brace.
+	 */
+	public static class CloseCurlyBraceAction extends RecordableTextAction {
+		
+		private static final long serialVersionUID = 1L;
+
+		private Segment seg;
+
+		public CloseCurlyBraceAction() {
+			super(rstaCloseCurlyBraceAction);
+			seg = new Segment();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+			boolean alignCurlyBraces = rsta.isAutoIndentEnabled() &&
+										doc.getCurlyBracesDenoteCodeBlocks();
+
+			if (alignCurlyBraces) {
+				textArea.beginAtomicEdit();
+			}
+
+			try {
+
+				textArea.replaceSelection("}");
+
+				// If the user wants to align curly braces...
+				if (alignCurlyBraces) {
+
+					Element root = doc.getDefaultRootElement();
+					int dot = rsta.getCaretPosition() - 1; // Start before '{'
+					int line = root.getElementIndex(dot);
+					Element elem = root.getElement(line);
+					int start = elem.getStartOffset();
+
+					// Get the current line's text up to the '}' entered.
+					try {
+						doc.getText(start, dot-start, seg);
+					} catch (BadLocationException ble) { // Never happens
+						ble.printStackTrace();
+						return;
+					}
+
+					// Only attempt to align if there's only whitespace up to
+					// the '}' entered.
+					for (int i=0; i<seg.count; i++) {
+						char ch = seg.array[seg.offset+i];
+						if (!Character.isWhitespace(ch)) {
+							return;
+						}
+					}
+
+					// Locate the matching '{' bracket, and replace the leading
+					// whitespace for the '}' to match that of the '{' char's line.
+					int match = RSyntaxUtilities.getMatchingBracketPosition(rsta);
+					if (match>-1) {
+						elem = root.getElement(root.getElementIndex(match));
+						int start2 = elem.getStartOffset();
+						int end = elem.getEndOffset() - 1;
+						String text = null;
+						try {
+							text = doc.getText(start2, end-start2);
+						} catch (BadLocationException ble) { // Never happens
+							ble.printStackTrace();
+							return;
+						}
+						String ws = RSyntaxUtilities.getLeadingWhitespace(text);
+						rsta.replaceRange(ws, start, dot);
+					}
+
+				}
+
+			} finally {
+				if (alignCurlyBraces) {
+					textArea.endAtomicEdit();
+				}
+			}
+
+		}
+
+		public final String getMacroID() {
+			return rstaCloseCurlyBraceAction;
+		}
+
+	}
+
+
+	/**
+	 * (Optionally) completes a closing markup tag.
+	 */
+	public static class CloseMarkupTagAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public CloseMarkupTagAction() {
+			super(rstaCloseMarkupTagAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+
+			Caret c = rsta.getCaret();
+			boolean selection = c.getDot()!=c.getMark();
+			rsta.replaceSelection("/");
+
+			// Don't automatically complete a tag if there was a selection
+			int dot = c.getDot();
+
+			if (doc.getLanguageIsMarkup() && 
+					doc.getCompleteMarkupCloseTags() &&
+					!selection && rsta.getCloseMarkupTags() && dot>1) {
+
+				try {
+
+					// Check actual char before token type, since it's quicker
+					char ch = doc.charAt(dot-2);
+					if (ch=='<' || ch=='[') {
+
+						Token t = doc.getTokenListForLine(
+											rsta.getCaretLineNumber());
+						t = RSyntaxUtilities.getTokenAtOffset(t, dot-1);
+						if (t!=null && t.type==Token.MARKUP_TAG_DELIMITER) {
+							//System.out.println("Huzzah - closing tag!");
+							String tagName = discoverTagName(doc, dot);
+							if (tagName!=null) {
+								rsta.replaceSelection(tagName + (char)(ch+2));
+							}
+						}
+
+					}
+
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+					ble.printStackTrace();
+				}
+
+			}
+
+		}
+
+		/**
+		 * Discovers the name of the tag being closed.  Assumes standard
+		 * SGML-style markup tags.
+		 *
+		 * @param doc The document to parse.
+		 * @param dot The location of the caret.  This should be right after
+		 *        the start of a closing tag token (e.g. "<code>&lt;/</code>"
+		 *        or "<code>[</code>" in the case of BBCode).
+		 * @return The name of the tag to close, or <code>null</code> if it
+		 *         could not be determined.
+		 */
+		private String discoverTagName(RSyntaxDocument doc, int dot) {
+
+			Stack stack = new Stack();
+
+			Element root = doc.getDefaultRootElement();
+			int curLine = root.getElementIndex(dot);
+
+			for (int i=0; i<=curLine; i++) {
+
+				Token t = doc.getTokenListForLine(i);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.type==Token.MARKUP_TAG_DELIMITER) {
+						if (t.isSingleChar('<') || t.isSingleChar('[')) {
+							t = t.getNextToken();
+							while (t!=null && t.isPaintable()) {
+								if (t.type==Token.MARKUP_TAG_NAME ||
+										// Being lenient here and also checking
+										// for attributes, in case they
+										// (incorrectly) have whitespace between
+										// the '<' char and the element name.
+										t.type==Token.MARKUP_TAG_ATTRIBUTE) {
+									stack.push(t.getLexeme());
+									break;
+								}
+								t = t.getNextToken();
+							}
+						}
+						else if (t.textCount==2 && t.text[t.textOffset]=='/' &&
+								(t.text[t.textOffset+1]=='>' ||
+										t.text[t.textOffset+1]==']')) {
+							if (!stack.isEmpty()) { // Always true for valid XML
+								stack.pop();
+							}
+						}
+						else if (t.textCount==2 && 
+								(t.text[t.textOffset]=='<' || t.text[t.textOffset]=='[') &&
+								t.text[t.textOffset+1]=='/') {
+							String tagName = null;
+							if (!stack.isEmpty()) { // Always true for valid XML
+								tagName = (String)stack.pop();
+							}
+							if (t.offset+t.textCount>=dot) {
+								return tagName;
+							}
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+			return null; // Should never happen
+
+		}
+
+		public String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Collapses all comment folds.
+	 */
+	public static class CollapseAllCommentFoldsAction extends FoldRelatedAction{
+
+		private static final long serialVersionUID = 1L;
+
+		public CollapseAllCommentFoldsAction() {
+			super(rstaCollapseAllCommentFoldsAction);
+			setProperties(msg, "Action.CollapseCommentFolds");
+		}
+
+		public CollapseAllCommentFoldsAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				FoldCollapser collapser = new FoldCollapser();
+				collapser.collapseFolds(rsta.getFoldManager());
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaCollapseAllCommentFoldsAction;
+		}
+
+	}
+
+
+	/**
+	 * Collapses all folds.
+	 */
+	public static class CollapseAllFoldsAction extends FoldRelatedAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public CollapseAllFoldsAction() {
+			this(false);
+		}
+
+		public CollapseAllFoldsAction(boolean localizedName) {
+			super(rstaCollapseAllFoldsAction);
+			if (localizedName) {
+				setProperties(msg, "Action.CollapseAllFolds");
+			}
+		}
+
+		public CollapseAllFoldsAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				FoldCollapser collapser = new FoldCollapser() {
+					public boolean getShouldCollapse(Fold fold) {
+						return true;
+					}
+				};
+				collapser.collapseFolds(rsta.getFoldManager());
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaCollapseAllFoldsAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for copying text as RTF.
+	 */
+	public static class CopyAsRtfAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public CopyAsRtfAction() {
+			super(rstaCopyAsRtfAction);
+		}
+
+		public CopyAsRtfAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			((RSyntaxTextArea)textArea).copyAsRtf();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action for decreasing the font size of all fonts in the text area.
+	 */
+	public static class DecreaseFontSizeAction
+					extends RTextAreaEditorKit.DecreaseFontSizeAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public DecreaseFontSizeAction() {
+			super();
+		}
+
+		public DecreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			SyntaxScheme scheme = rsta.getSyntaxScheme();
+
+			// All we need to do is update all of the fonts in syntax
+			// schemes, then call setSyntaxHighlightingColorScheme with the
+			// same scheme already being used.  This relies on the fact that
+			// that method does not check whether the new scheme is different
+			// from the old scheme before updating.
+
+			boolean changed = false;
+			int count = scheme.getStyleCount();
+			for (int i=0; i<count; i++) {
+				Style ss = scheme.getStyle(i);
+				if (ss!=null) {
+					Font font = ss.font;
+					if (font!=null) {
+						float oldSize = font.getSize2D();
+						float newSize = oldSize - decreaseAmount;
+						if (newSize>=MINIMUM_SIZE) {
+							// Shrink by decreaseAmount.
+							ss.font = font.deriveFont(newSize);
+							changed = true;
+						}
+						else if (oldSize>MINIMUM_SIZE) {
+							// Can't shrink by full decreaseAmount, but
+							// can shrink a little bit.
+							ss.font = font.deriveFont(MINIMUM_SIZE);
+							changed = true;
+						}
+					}
+				}
+			}
+
+			// Do the text area's font also.
+			Font font = rsta.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize - decreaseAmount;
+			if (newSize>=MINIMUM_SIZE) {
+				// Shrink by decreaseAmount.
+				rsta.setFont(font.deriveFont(newSize));
+				changed = true;
+			}
+			else if (oldSize>MINIMUM_SIZE) {
+				// Can't shrink by full decreaseAmount, but
+				// can shrink a little bit.
+				rsta.setFont(font.deriveFont(MINIMUM_SIZE));
+				changed = true;
+			}
+
+			// If we updated at least one font, update the screen.  If
+			// all of the fonts were already the minimum size, beep.
+			if (changed) {
+				rsta.setSyntaxScheme(scheme);
+				// NOTE:  This is a hack to get an encompassing
+				// RTextScrollPane to repaint its line numbers to account
+				// for a change in line height due to a font change.  I'm
+				// not sure why we need to do this here but not when we
+				// change the syntax highlighting color scheme via the
+				// Options dialog... setSyntaxHighlightingColorScheme()
+				// calls revalidate() which won't repaint the scroll pane
+				// if scrollbars don't change, which is why we need this.
+				Component parent = rsta.getParent();
+				if (parent instanceof javax.swing.JViewport) {
+					parent = parent.getParent();
+					if (parent instanceof JScrollPane) {
+						parent.repaint();
+					}
+				}
+			}
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+
+		}
+
+	}
+
+
+	/**
+	 * Action for when un-indenting lines (either the current line if there is
+	 * selection, or all selected lines if there is one).
+	 */
+	public static class DecreaseIndentAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+	
+		private Segment s;
+
+		public DecreaseIndentAction() {
+			this(rstaDecreaseIndentAction);
+		}
+
+		public DecreaseIndentAction(String name) {
+			super(name);
+			s = new Segment();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			Document document = textArea.getDocument();
+			Element map = document.getDefaultRootElement();
+			Caret c = textArea.getCaret();
+			int dot = c.getDot();
+			int mark = c.getMark();
+			int line1 = map.getElementIndex(dot);
+			int tabSize = textArea.getTabSize();
+
+			// If there is a selection, indent all lines in the selection.
+			// Otherwise, indent the line the caret is on.
+			if (dot!=mark) {
+				// Note that we cheaply reuse variables here, so don't
+				// take their names to mean what they are.
+				int line2 = map.getElementIndex(mark);
+				dot = Math.min(line1, line2);
+				mark = Math.max(line1, line2);
+				Element elem;
+				try {
+					for (line1=dot; line1<mark; line1++) {
+						elem = map.getElement(line1);
+						handleDecreaseIndent(elem, document, tabSize);
+					}
+					// Don't do the last line if the caret is at its
+					// beginning.  We must call getDot() again and not just
+					// use 'dot' as the caret's position may have changed
+					// due to the insertion of the tabs above.
+					elem = map.getElement(mark);
+					int start = elem.getStartOffset();
+					if (Math.max(c.getDot(),c.getMark())!=start) {
+						handleDecreaseIndent(elem, document, tabSize);
+					}
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+				}
+			}
+			else {
+				Element elem = map.getElement(line1);
+				try {
+					handleDecreaseIndent(elem, document, tabSize);
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+				}
+			}
+
+		}
+
+		public final String getMacroID() {
+			return rstaDecreaseIndentAction;
+		}
+
+		/**
+		 * Actually does the "de-indentation."  This method finds where the
+		 * given element's leading whitespace ends, then, if there is indeed
+		 * leading whitespace, removes either the last char in it (if it is a
+		 * tab), or removes up to the number of spaces equal to a tab in the
+		 * specified document (i.e., if the tab size was 5 and there were 3
+		 * spaces at the end of the leading whitespace, the three will be
+		 * removed; if there were 8 spaces, only the first 5 would be
+		 * removed).
+		 *
+		 * @param elem The element to "de-indent."
+		 * @param doc The document containing the specified element.
+		 * @param tabSize The size of a tab, in spaces.
+		 */
+		private final void handleDecreaseIndent(Element elem, Document doc,
+									int tabSize)
+									throws BadLocationException {
+			int start = elem.getStartOffset();
+			int end = elem.getEndOffset() - 1; // Why always true??
+			doc.getText(start,end-start, s);
+			int i = s.offset;
+			end = i+s.count;
+			if (end>i) {
+				// If the first character is a tab, remove it.
+				if (s.array[i]=='\t') {
+					doc.remove(start, 1);
+				}
+				// Otherwise, see if the first character is a space.  If it
+				// is, remove all contiguous whitespaces at the beginning of
+				// this line, up to the tab size.
+				else if (s.array[i]==' ') {
+					i++;
+					int toRemove = 1;
+					while (i<end && s.array[i]==' ' && toRemove<tabSize) {
+						i++;
+						toRemove++;
+					}
+					doc.remove(start, toRemove);
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Deletes the previous word, but differentiates symbols from "words" to
+	 * match the behavior of code editors.
+	 */
+	public static class DeletePrevWordAction
+			extends RTextAreaEditorKit.DeletePrevWordAction {
+
+		private Segment seg = new Segment();
+
+		protected int getPreviousWordStart(RTextArea textArea, int offs)
+				throws BadLocationException {
+
+			if (offs==0) {
+				return offs;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			int line = textArea.getLineOfOffset(offs);
+			int start = textArea.getLineStartOffset(line);
+			if (offs==start) {
+				return start-1; // Just delete the newline
+			}
+			int end = textArea.getLineEndOffset(line);
+			if (line!=textArea.getLineCount()-1) {
+				end--;
+			}
+			doc.getText(start, end-start, seg);
+
+			// Determine the "type" of char at offs - lower case, upper case,
+			// whitespace or other.  We take special care here as we're starting
+			// in the middle of the Segment to check whether we're already at
+			// the "beginning" of a word.
+			int firstIndex = seg.getBeginIndex() + (offs-start) - 1;
+			seg.setIndex(firstIndex);
+			char ch = seg.current();
+
+			// Always strip off whitespace first
+			if (Character.isWhitespace(ch)) {
+				do {
+					ch = seg.previous();
+				} while (Character.isWhitespace(ch));
+			}
+
+			// The "word" is a group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.previous();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// The "word" is a series of symbols.
+			else {
+				while (!Character.isWhitespace(ch) &&
+						!Character.isLetterOrDigit(ch)
+						&& ch!=Segment.DONE) {
+					ch = seg.previous();
+				}
+			}
+
+			if (ch==Segment.DONE) {
+				return start; // Removed last "token" of the line
+			}
+			offs -= firstIndex - seg.getIndex();
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Moves the caret to the end of the document, taking into account code
+	 * folding.
+	 */
+	public static class EndAction extends RTextAreaEditorKit.EndAction {
+
+		public EndAction(String name, boolean select) {
+			super(name, select);
+		}
+
+		protected int getVisibleEnd(RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			return rsta.getLastVisibleOffset();
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the end of the word.  This class is here to
+	 * better handle finding the "end of the word" in programming languages.
+	 */
+	protected static class EndWordAction
+							extends RTextAreaEditorKit.EndWordAction {
+
+ 		private Segment seg;
+
+		protected EndWordAction(String name, boolean select) {
+			super(name, select);
+			seg = new Segment();
+		}
+
+		protected int getWordEnd(RTextArea textArea, int offs)
+									throws BadLocationException {
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			if (offs==doc.getLength()) {
+				return offs;
+			}
+
+			int line = textArea.getLineOfOffset(offs);
+			int end = textArea.getLineEndOffset(line);
+			if (line!=textArea.getLineCount()-1) {
+				end--; // Hide newline
+			}
+			if (offs==end) {
+				return end;
+			}
+			doc.getText(offs, end-offs, seg);
+
+			// Determine the "type" of char at offs - letter/digit,
+			// whitespace or other
+			char ch = seg.first();
+
+			// The "word" is a group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.next();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// The "word" is whitespace.
+			else if (Character.isWhitespace(ch)) {
+
+				do {
+					ch = seg.next();
+				} while (Character.isWhitespace(ch));
+			}
+
+			// Otherwise, the "word" is a single character of some other type
+			// (operator, etc.).
+
+			offs += seg.getIndex() - seg.getBeginIndex();
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Expands all folds.
+	 */
+	public static class ExpandAllFoldsAction extends FoldRelatedAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public ExpandAllFoldsAction() {
+			this(false);
+		}
+
+		public ExpandAllFoldsAction(boolean localizedName) {
+			super(rstaExpandAllFoldsAction);
+			if (localizedName) {
+				setProperties(msg, "Action.ExpandAllFolds");
+			}
+		}
+
+		public ExpandAllFoldsAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				FoldManager fm = rsta.getFoldManager();
+				for (int i=0; i<fm.getFoldCount(); i++) {
+					expand(fm.getFold(i));
+				}
+				possiblyRepaintGutter(rsta);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		private void expand(Fold fold) {
+			fold.setCollapsed(false);
+			for (int i=0; i<fold.getChildCount(); i++) {
+				expand(fold.getChild(i));
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaExpandAllFoldsAction;
+		}
+
+	}
+
+
+	/**
+	 * Base class for folding-related actions.
+	 */
+	static abstract class FoldRelatedAction extends RecordableTextAction {
+
+		public FoldRelatedAction(String name) {
+			super(name);
+		}
+
+		public FoldRelatedAction(String name, Icon icon,
+				String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		protected Fold getClosestFold(RSyntaxTextArea textArea) {
+			int offs = textArea.getCaretPosition();
+			int line = textArea.getCaretLineNumber();
+			FoldManager fm = textArea.getFoldManager();
+			Fold fold = fm.getFoldForLine(line);
+			if (fold==null) {
+				fold = fm.getDeepestOpenFoldContaining(offs);
+			}
+			return fold;
+		}
+
+		/**
+		 * Repaints the gutter in a text area's scroll pane, if necessary.
+		 *
+		 * @param textArea The text area.
+		 */
+		protected void possiblyRepaintGutter(RTextArea textArea) {
+			Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+			if (gutter!=null) {
+				gutter.repaint();
+			}
+		}
+
+	}
+
+
+	/**
+	 * Action for moving the caret to the "matching bracket" of the bracket
+	 * at the caret position (either before or after).
+	 */
+	public static class GoToMatchingBracketAction
+									extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public GoToMatchingBracketAction() {
+			super(rstaGoToMatchingBracketAction);
+		}
+
+		public GoToMatchingBracketAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			int pos = RSyntaxUtilities.getMatchingBracketPosition(rsta);
+			if (pos>-1) {
+				// Go to the position AFTER the bracket so the previous
+				// bracket (which we were just on) is highlighted.
+				rsta.setCaretPosition(pos+1);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaGoToMatchingBracketAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for increasing the font size of all fonts in the text area.
+	 */
+	public static class IncreaseFontSizeAction
+					extends RTextAreaEditorKit.IncreaseFontSizeAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public IncreaseFontSizeAction() {
+			super();
+		}
+
+		public IncreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			SyntaxScheme scheme = rsta.getSyntaxScheme();
+
+			// All we need to do is update all of the fonts in syntax
+			// schemes, then call setSyntaxHighlightingColorScheme with the
+			// same scheme already being used.  This relies on the fact that
+			// that method does not check whether the new scheme is different
+			// from the old scheme before updating.
+
+			boolean changed = false;
+			int count = scheme.getStyleCount();
+			for (int i=0; i<count; i++) {
+				Style ss = scheme.getStyle(i);
+				if (ss!=null) {
+					Font font = ss.font;
+					if (font!=null) {
+						float oldSize = font.getSize2D();
+						float newSize = oldSize + increaseAmount;
+						if (newSize<=MAXIMUM_SIZE) {
+							// Grow by increaseAmount.
+							ss.font = font.deriveFont(newSize);
+							changed = true;
+						}
+						else if (oldSize<MAXIMUM_SIZE) {
+							// Can't grow by full increaseAmount, but
+							// can grow a little bit.
+							ss.font = font.deriveFont(MAXIMUM_SIZE);
+							changed = true;
+						}
+					}
+				}
+			}
+
+			// Do the text area's font also.
+			Font font = rsta.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize + increaseAmount;
+			if (newSize<=MAXIMUM_SIZE) {
+				// Grow by increaseAmount.
+				rsta.setFont(font.deriveFont(newSize));
+				changed = true;
+			}
+			else if (oldSize<MAXIMUM_SIZE) {
+				// Can't grow by full increaseAmount, but
+				// can grow a little bit.
+				rsta.setFont(font.deriveFont(MAXIMUM_SIZE));
+				changed = true;
+			}
+
+			// If we updated at least one font, update the screen.  If
+			// all of the fonts were already the minimum size, beep.
+			if (changed) {
+				rsta.setSyntaxScheme(scheme);
+				// NOTE:  This is a hack to get an encompassing
+				// RTextScrollPane to repaint its line numbers to account
+				// for a change in line height due to a font change.  I'm
+				// not sure why we need to do this here but not when we
+				// change the syntax highlighting color scheme via the
+				// Options dialog... setSyntaxHighlightingColorScheme()
+				// calls revalidate() which won't repaint the scroll pane
+				// if scrollbars don't change, which is why we need this.
+				Component parent = rsta.getParent();
+				if (parent instanceof javax.swing.JViewport) {
+					parent = parent.getParent();
+					if (parent instanceof JScrollPane) {
+						parent.repaint();
+					}
+				}
+			}
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+
+		}
+
+	}
+
+
+	/**
+	 * Action for when the user presses the Enter key.  This is here so we can
+	 * be smart and "auto-indent" for programming languages.
+	 */
+	public static class InsertBreakAction
+							extends RTextAreaEditorKit.InsertBreakAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxTextArea sta = (RSyntaxTextArea)textArea;
+			boolean noSelection= sta.getSelectionStart()==sta.getSelectionEnd();
+
+			// First, see if this language wants to handle inserting newlines
+			// itself.
+			boolean handled = false;
+			if (noSelection) {
+				RSyntaxDocument doc = (RSyntaxDocument)sta.getDocument();
+				handled = doc.insertBreakSpecialHandling(e);
+			}
+
+			// If not...
+			if (!handled) {
+				handleInsertBreak(sta, noSelection);
+			}
+
+		}
+
+		/**
+		 * @return The first location in the string past <code>pos</code> that
+		 *         is NOT a whitespace char, or <code>-1</code> if only
+		 *         whitespace chars follow <code>pos</code> (or it is the end
+		 *         position in the string).
+		 */
+		private static final int atEndOfLine(int pos, String s, int sLen) {
+			for (int i=pos; i<sLen; i++) {
+				if (!RSyntaxUtilities.isWhitespace(s.charAt(i)))
+					return i;
+			}
+			return -1;
+		}
+
+		private static final int getOpenBraceCount(RSyntaxDocument doc) {
+			int openCount = 0;
+			Element root = doc.getDefaultRootElement();
+			int lineCount = root.getElementCount();
+			for (int i=0; i<lineCount; i++) {
+				Token t = doc.getTokenListForLine(i);
+				while (t!=null && t.isPaintable()) {
+					if (t.type==Token.SEPARATOR && t.textCount==1) {
+						char ch = t.text[t.textOffset];
+						if (ch=='{') {
+							openCount++;
+						}
+						else if (ch=='}') {
+							openCount--;
+						}
+					}
+					t = t.getNextToken();
+				}
+			}
+			return openCount;
+		}
+
+		/**
+		 * Actually inserts the newline into the document, and auto-indents
+		 * if appropriate.  This method can be called by token makers who
+		 * implement a custom action for inserting newlines.
+		 *
+		 * @param textArea
+		 * @param noSelection Whether there is no selection.
+		 */
+		protected void handleInsertBreak(RSyntaxTextArea textArea,
+										boolean noSelection) {
+			// If we're auto-indenting...
+			if (noSelection && textArea.isAutoIndentEnabled()) {
+				insertNewlineWithAutoIndent(textArea);
+			}
+			else {
+				textArea.replaceSelection("\n");
+				if (noSelection) {
+					possiblyCloseCurlyBrace(textArea, null);
+				}
+			}
+		}
+
+		private void insertNewlineWithAutoIndent(RSyntaxTextArea sta) {
+
+			try {
+
+				int caretPos = sta.getCaretPosition();
+				Document doc = sta.getDocument();
+				Element map = doc.getDefaultRootElement();
+				int lineNum = map.getElementIndex(caretPos);
+				Element line = map.getElement(lineNum);
+				int start = line.getStartOffset();
+				int end = line.getEndOffset()-1; // Why always "-1"?
+				int len = end-start;
+				String s = doc.getText(start, len);
+
+				// endWS is the end of the leading whitespace of the
+				// current line.
+				String leadingWS = RSyntaxUtilities.getLeadingWhitespace(s);
+				StringBuffer sb = new StringBuffer("\n");
+				sb.append(leadingWS);
+
+				// If there is only whitespace between the caret and
+				// the EOL, pressing Enter auto-indents the new line to
+				// the same place as the previous line.
+				int nonWhitespacePos = atEndOfLine(caretPos-start, s, len);
+				if (nonWhitespacePos==-1) {
+					if (leadingWS.length()==len &&
+							sta.isClearWhitespaceLinesEnabled()) {
+						// If the line was nothing but whitespace, select it
+						// so its contents get removed.
+						sta.setSelectionStart(start);
+						sta.setSelectionEnd(end);
+					}
+					sta.replaceSelection(sb.toString());
+				}
+
+				// If there is non-whitespace between the caret and the
+				// EOL, pressing Enter takes that text to the next line
+				// and auto-indents it to the same place as the last
+				// line.
+				else {
+					sb.append(s.substring(nonWhitespacePos));
+					sta.replaceRange(sb.toString(), caretPos, end);
+					sta.setCaretPosition(caretPos + leadingWS.length()+1);
+				}
+
+				// Must do it after everything else, as the "smart indent"
+				// calculation depends on the previous line's state
+				// AFTER the Enter press (stuff may have been moved down).
+				if (sta.getShouldIndentNextLine(lineNum)) {
+					sta.replaceSelection("\t");
+				}
+
+				possiblyCloseCurlyBrace(sta, leadingWS);
+
+			} catch (BadLocationException ble) { // Never happens
+				sta.replaceSelection("\n");
+				ble.printStackTrace();
+			}
+
+		}
+
+		private void possiblyCloseCurlyBrace(RSyntaxTextArea textArea,
+											String leadingWS) {
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+			if (textArea.getCloseCurlyBraces() &&
+					doc.getCurlyBracesDenoteCodeBlocks()) {
+
+				int line = textArea.getCaretLineNumber();
+				Token t = doc.getTokenListForLine(line-1);
+				t = t.getLastNonCommentNonWhitespaceToken();
+
+				if (t!=null && t.isLeftCurly()) {
+
+					if (getOpenBraceCount(doc)>0) {
+						StringBuffer sb = new StringBuffer();
+						if (line==textArea.getLineCount()-1) {
+							sb.append('\n');
+						}
+						if (leadingWS!=null) {
+							sb.append(leadingWS);
+						}
+						sb.append("}\n");
+						int dot = textArea.getCaretPosition();
+						int end = textArea.getLineEndOffsetOfCurrentLine();
+						// Insert at end of line, not at dot: they may have
+						// pressed Enter in the middle of the line and brought
+						// some text (though it must be whitespace and/or
+						// comments) down onto the new line.
+						textArea.insert(sb.toString(), end);
+						textArea.setCaretPosition(dot); // Caret may have moved
+					}
+
+				}
+
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * Action for inserting tabs.  This is extended to "block indent" a
+	 * group of contiguous lines if they are selected.
+	 */
+	public static class InsertTabAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public InsertTabAction() {
+			super(insertTabAction);
+		}
+
+		public InsertTabAction(String name) {
+			super(name);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			Document document = textArea.getDocument();
+			Element map = document.getDefaultRootElement();
+			Caret c = textArea.getCaret();
+			int dot = c.getDot();
+			int mark = c.getMark();
+			int dotLine = map.getElementIndex(dot);
+			int markLine = map.getElementIndex(mark);
+
+			// If there is a multi-line selection, indent all lines in
+			// the selection.
+			if (dotLine!=markLine) {
+				int first = Math.min(dotLine, markLine);
+				int last = Math.max(dotLine, markLine);
+				Element elem; int start;
+
+				// Since we're using Document.insertString(), we must mimic the
+				// soft tab behavior provided by RTextArea.replaceSelection().
+				String replacement = "\t";
+				if (textArea.getTabsEmulated()) {
+					StringBuffer sb = new StringBuffer();
+					int temp = textArea.getTabSize();
+					for (int i=0; i<temp; i++) {
+						sb.append(' ');
+					}
+					replacement = sb.toString();
+				}
+
+				textArea.beginAtomicEdit();
+				try {
+					for (int i=first; i<last; i++) {
+						elem = map.getElement(i);
+						start = elem.getStartOffset();
+						document.insertString(start, replacement, null);
+					}
+					// Don't do the last line if the caret is at its
+					// beginning.  We must call getDot() again and not just
+					// use 'dot' as the caret's position may have changed
+					// due to the insertion of the tabs above.
+					elem = map.getElement(last);
+					start = elem.getStartOffset();
+					if (Math.max(c.getDot(), c.getMark())!=start) {
+						document.insertString(start, replacement, null);
+					}
+				} catch (BadLocationException ble) { // Never happens.
+					ble.printStackTrace();
+					UIManager.getLookAndFeel().
+									provideErrorFeedback(textArea);
+				} finally {
+					textArea.endAtomicEdit();
+				}
+			}
+			else {
+				textArea.replaceSelection("\t");
+			}
+
+		}
+
+		public final String getMacroID() {
+			return insertTabAction;
+		}
+
+	}
+
+
+	/**
+	 * Action to move the selection and/or caret. Constructor indicates
+	 * direction to use.  This class overrides the behavior defined in
+	 * {@link RTextAreaEditorKit} to better skip "words" in source code.
+	 */
+	public static class NextWordAction
+						extends RTextAreaEditorKit.NextWordAction {
+
+		private Segment seg;
+
+		public NextWordAction(String nm, boolean select) {
+			super(nm, select);
+			seg = new Segment();
+		}
+
+		/**
+		 * Overridden to do better with skipping "words" in code.
+		 */
+		protected int getNextWord(RTextArea textArea, int offs)
+									throws BadLocationException {
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			if (offs==doc.getLength()) {
+				return offs;
+			}
+
+			Element root = doc.getDefaultRootElement();
+			int line = root.getElementIndex(offs);
+			int end = root.getElement(line).getEndOffset() - 1;
+			if (offs==end) {// If we're already at the end of the line...
+				RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+				if (rsta.isCodeFoldingEnabled()) { // Start of next visible line
+					FoldManager fm = rsta.getFoldManager();
+					int lineCount = root.getElementCount();
+					while (++line<lineCount && fm.isLineHidden(line));
+					if (line<lineCount) { // Found a lower visible line
+						offs = root.getElement(line).getStartOffset();
+					}
+					// No lower visible line - we're already at last visible offset
+					return offs;
+				}
+				else {
+					return offs+1; // Start of next line.
+				}
+			}
+			doc.getText(offs, end-offs, seg);
+
+			// Determine the "type" of char at offs - letter/digit,
+			// whitespace or other
+			char ch = seg.first();
+
+			// Skip the group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.next();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// Skip groups of "anything else" (operators, etc.).
+			else if (!Character.isWhitespace(ch)) {
+				do {
+					ch = seg.next();
+				} while (ch!=Segment.DONE &&
+						!(Character.isLetterOrDigit(ch) ||
+								Character.isWhitespace(ch)));
+			}
+
+			// Skip any trailing whitespace
+			while (Character.isWhitespace(ch)) {
+				ch = seg.next();
+			}
+
+			offs += seg.getIndex() - seg.getBeginIndex();
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Action for when the user tries to insert a template (that is,
+	 * they've typed a template ID and pressed the trigger character
+	 * (a space) in an attempt to do the substitution).
+	 */
+	public static class PossiblyInsertTemplateAction extends RecordableTextAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public PossiblyInsertTemplateAction() {
+			super(rstaPossiblyInsertTemplateAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled())
+				return;
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+
+			if (RSyntaxTextArea.getTemplatesEnabled()) {
+
+				Document doc = textArea.getDocument();
+				if (doc != null) {
+
+					try {
+
+						CodeTemplateManager manager = RSyntaxTextArea.
+											getCodeTemplateManager();
+						CodeTemplate template =  manager==null ? null :
+													manager.getTemplate(rsta);
+
+						// A non-null template means modify the text to insert!
+						if (template!=null) {
+							template.invoke(rsta);
+						}
+
+						// No template - insert default text.  This is
+						// exactly what DefaultKeyTypedAction does.
+						else {
+							doDefaultInsert(rsta);
+						}
+
+					} catch (BadLocationException ble) {
+						UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					}
+
+
+				} // End of if (doc!=null).
+
+			} // End of if (textArea.getTemplatesEnabled()).
+
+			// If templates aren't enabled, just insert the text as usual.
+			else {
+				doDefaultInsert(rsta);
+			}
+
+		}
+
+		private final void doDefaultInsert(RTextArea textArea) {
+			// FIXME:  We need a way to get the "trigger string" (i.e.,
+			// the text that was just typed); however, the text area's
+			// template manager might be null (if templates are disabled).
+			// Also, the manager's trigger string doesn't yet match up with
+			// that defined in RSyntaxTextAreaEditorKit.java (which is
+			// hardcoded as a space)...
+			//String str = manager.getInsertTriggerString();
+			//int mod = manager.getInsertTrigger().getModifiers();
+			//if (str!=null && str.length()>0 &&
+			//	((mod&ActionEvent.ALT_MASK)==(mod&ActionEvent.CTRL_MASK))) {
+			//	char ch = str.charAt(0);
+			//	if (ch>=0x20 && ch!=0x7F)
+			//		textArea.replaceSelection(str);
+			//}
+			textArea.replaceSelection(" ");
+		}
+
+		public final String getMacroID() {
+			return rstaPossiblyInsertTemplateAction;
+		}
+
+	}
+
+
+	/**
+	 * Action to move the selection and/or caret. Constructor indicates
+	 * direction to use.  This class overrides the behavior defined in
+	 * {@link RTextAreaEditorKit} to better skip "words" in source code.
+	 */
+	public static class PreviousWordAction
+						extends RTextAreaEditorKit.PreviousWordAction {
+
+		private Segment seg;
+
+		public PreviousWordAction(String nm, boolean select) {
+			super(nm, select);
+			seg = new Segment();
+		}
+
+		/**
+		 * Overridden to do better with skipping "words" in code.
+		 */
+		protected int getPreviousWord(RTextArea textArea, int offs)
+										throws BadLocationException {
+
+			if (offs==0) {
+				return offs;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			Element root = doc.getDefaultRootElement();
+			int line = root.getElementIndex(offs);
+			int start = root.getElement(line).getStartOffset();
+			if (offs==start) {// If we're already at the start of the line...
+				RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+				if (rsta.isCodeFoldingEnabled()) { // End of next visible line
+					FoldManager fm = rsta.getFoldManager();
+					while (--line>=0 && fm.isLineHidden(line));
+					if (line>=0) { // Found an earlier visible line
+						offs = root.getElement(line).getEndOffset() - 1;
+					}
+					// No earlier visible line - we must be at offs==0...
+					return offs;
+				}
+				else {
+					return start-1; // End of previous line.
+				}
+			}
+			doc.getText(start, offs-start, seg);
+
+			// Determine the "type" of char at offs - lower case, upper case,
+			// whitespace or other
+			char ch = seg.last();
+
+			// Skip any "leading" whitespace
+			while (Character.isWhitespace(ch)) {
+				ch = seg.previous();
+			}
+
+			// Skip the group of letters and/or digits
+			if (Character.isLetterOrDigit(ch)) {
+				do {
+					ch = seg.previous();
+				} while (Character.isLetterOrDigit(ch));
+			}
+
+			// Skip groups of "anything else" (operators, etc.).
+			else if (!Character.isWhitespace(ch)) {
+				do {
+					ch = seg.previous();
+				} while (ch!=Segment.DONE &&
+						!(Character.isLetterOrDigit(ch) ||
+								Character.isWhitespace(ch)));
+			}
+
+			offs -= seg.getEndIndex() - seg.getIndex();
+			if (ch!=Segment.DONE) {
+				offs++;
+			}
+
+			return offs;
+
+		}
+
+	}
+
+
+	/**
+	 * Selects the word around the caret.  This class is here to better
+	 * handle selecting "words" in programming languages.
+	 */
+	public static class SelectWordAction
+					extends RTextAreaEditorKit.SelectWordAction {
+
+		protected void createActions() {
+			start = new BeginWordAction("pigdog", false);
+			end = new EndWordAction("pigdog", true);
+		}
+
+	}
+
+
+	/**
+	 * Action that toggles whether the currently selected lines are
+	 * commented.
+	 */
+	public static class ToggleCommentAction extends RecordableTextAction {
+
+		public ToggleCommentAction() {
+			super(rstaToggleCommentAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+			String[] startEnd = doc.getLineCommentStartAndEnd();
+
+			if (startEnd==null) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			Element map = doc.getDefaultRootElement();
+			Caret c = textArea.getCaret();
+			int dot = c.getDot();
+			int mark = c.getMark();
+			int line1 = map.getElementIndex(dot);
+			int line2 = map.getElementIndex(mark);
+			int start = Math.min(line1, line2);
+			int end   = Math.max(line1, line2);
+
+			// Don't toggle comment on last line if there is no
+			// text selected on it.
+			if (start!=end) {
+				Element elem = map.getElement(end);
+				if (Math.max(dot, mark)==elem.getStartOffset()) {
+					end--;
+				}
+			}
+
+			textArea.beginAtomicEdit();
+			try {
+				boolean add = getDoAdd(doc,map, start,end, startEnd);
+				for (line1=start; line1<=end; line1++) {
+					Element elem = map.getElement(line1);
+					handleToggleComment(elem, doc, startEnd, add);
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			} finally {
+				textArea.endAtomicEdit();
+			}
+
+		}
+
+		private boolean getDoAdd(Document doc, Element map, int startLine,
+							int endLine, String[] startEnd)
+								throws BadLocationException {
+			boolean doAdd = false;
+			for (int i=startLine; i<=endLine; i++) {
+				Element elem = map.getElement(i);
+				int start = elem.getStartOffset();
+				String t = doc.getText(start, elem.getEndOffset()-start-1);
+				if (!t.startsWith(startEnd[0]) ||
+						(startEnd[1]!=null && !t.endsWith(startEnd[1]))) {
+					doAdd = true;
+					break;
+				}
+			}
+			return doAdd;
+		}
+
+		private void handleToggleComment(Element elem, Document doc,
+			String[] startEnd, boolean add) throws BadLocationException {
+			int start = elem.getStartOffset();
+			int end = elem.getEndOffset() - 1;
+			if (add) {
+				doc.insertString(start, startEnd[0], null);
+				if (startEnd[1]!=null) {
+					doc.insertString(end+startEnd[0].length(), startEnd[1],
+									null);
+				}
+			}
+			else {
+				doc.remove(start, startEnd[0].length());
+				if (startEnd[1]!=null) {
+					int temp = startEnd[1].length();
+					doc.remove(end-startEnd[0].length()-temp, temp);
+				}
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaToggleCommentAction;
+		}
+
+	}
+
+
+	/**
+	 * Toggles the fold at the current caret position or line.
+	 */
+	public static class ToggleCurrentFoldAction extends FoldRelatedAction {
+
+		private static final long serialVersionUID = 1L;
+
+		public ToggleCurrentFoldAction() {
+			super(rstaToggleCurrentFoldAction);
+			setProperties(msg, "Action.ToggleCurrentFold");
+		}
+
+		public ToggleCurrentFoldAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			if (rsta.isCodeFoldingEnabled()) {
+				Fold fold = getClosestFold(rsta);
+				if (fold!=null) {
+					fold.toggleCollapsedState();
+				}
+				possiblyRepaintGutter(textArea);
+			}
+			else {
+				UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+			}
+		}
+
+		public final String getMacroID() {
+			return rstaToggleCurrentFoldAction;
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java	(revision 25584)
@@ -0,0 +1,481 @@
+/*
+ * 04/23/2009
+ *
+ * RSyntaxTextAreaHighlighter.java - Highlighter for RTextAreas.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.plaf.TextUI;
+import javax.swing.plaf.basic.BasicTextUI.BasicHighlighter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.LayeredHighlighter;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rtextarea.RTextArea;
+
+
+/**
+ * The highlighter implementation used by {@link RSyntaxTextArea}s.  It knows to
+ * always paint "marked occurrences" highlights below selection highlights,
+ * and squiggle underline highlights above all other highlights.<p>
+ *
+ * Most of this code is copied from javax.swing.text.DefaultHighlighter;
+ * unfortunately, we cannot re-use much of it since it is package private.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RSyntaxTextAreaHighlighter extends BasicHighlighter {
+
+	/**
+	 * The text component we are the highlighter for.
+	 */
+	private RTextArea textArea;
+
+	/**
+	 * Marked occurrences in the document (to be painted separately from
+	 * other highlights).
+	 */
+	private List markedOccurrences;
+
+	/**
+	 * Highlights from document parsers.  These should be painted "on top of"
+	 * all other highlights to ensure they are always above the selection.
+	 */
+	private List parserHighlights;
+
+	/**
+	 * The default color used for parser notices when none is specified.
+	 */
+	private static final Color DEFAULT_PARSER_NOTICE_COLOR	= Color.RED;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextAreaHighlighter() {
+		markedOccurrences = new ArrayList();
+		parserHighlights = new ArrayList(0); // Often unused
+	}
+
+
+	/**
+	 * Adds a special "marked occurrence" highlight.
+	 *
+	 * @param start
+	 * @param end
+	 * @param p
+	 * @return A tag to reference the highlight later.
+	 * @throws BadLocationException
+	 * @see {@link #removeMarkOccurrencesHighlight(Object)}
+	 */
+	Object addMarkedOccurrenceHighlight(int start, int end,
+			MarkOccurrencesHighlightPainter p) throws BadLocationException {
+		Document doc = textArea.getDocument();
+		TextUI mapper = textArea.getUI();
+		// Always layered highlights for marked occurrences.
+		HighlightInfo i = new LayeredHighlightInfo();
+		i.painter = p;
+		i.p0 = doc.createPosition(start);
+		// HACK: Use "end-1" to prevent chars the user types at the "end" of
+		// the highlight to be absorbed into the highlight (default Highlight
+		// behavior).
+		i.p1 = doc.createPosition(end-1);
+		markedOccurrences.add(i);
+		mapper.damageRange(textArea, start, end);
+		return i;
+	}
+
+
+	/**
+	 * Adds a special "marked occurrence" highlight.
+	 *
+	 * @param notice The notice from a {@link Parser}.
+	 * @return A tag with which to reference the highlight.
+	 * @throws BadLocationException
+	 * @see {@link #clearParserHighlights()}
+	 */
+	Object addParserHighlight(ParserNotice notice, HighlightPainter p)
+								throws BadLocationException {
+
+		Document doc = textArea.getDocument();
+		TextUI mapper = textArea.getUI();
+
+		int start = notice.getOffset();
+		int end = 0;
+		if (start==-1) { // Could just define an invalid line number
+			int line = notice.getLine();
+			Element root = doc.getDefaultRootElement();
+			if (line>=0 && line<root.getElementCount()) {
+				Element elem = root.getElement(line);
+				start = elem.getStartOffset();
+				end = elem.getEndOffset();
+			}
+		}
+		else {
+			end = start + notice.getLength();
+		}
+
+		// Always layered highlights for parser highlights.
+		HighlightInfo i = new LayeredHighlightInfo();
+		i.painter = p;
+		i.p0 = doc.createPosition(start);
+		i.p1 = doc.createPosition(end);
+		i.notice = notice;//i.color = notice.getColor();
+
+		parserHighlights.add(i);
+		mapper.damageRange(textArea, start, end);
+		return i;
+
+	}
+
+
+	/**
+	 * Removes all parser highlights.
+	 *
+	 * @see #addParserHighlight(ParserNotice, javax.swing.text.Highlighter.HighlightPainter)
+	 */
+	void clearParserHighlights() {
+
+		for (int i=0; i<parserHighlights.size(); i++) {
+
+			Object tag = parserHighlights.get(i);
+
+			if (tag instanceof LayeredHighlightInfo) {
+				LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
+			    if (lhi.width > 0 && lhi.height > 0) {
+			    	textArea.repaint(lhi.x, lhi.y, lhi.width, lhi.height);
+			    }
+			}
+			else {
+				HighlightInfo info = (HighlightInfo) tag;
+				TextUI ui = textArea.getUI();
+				ui.damageRange(textArea, info.getStartOffset(),info.getEndOffset());
+				//safeDamageRange(info.p0, info.p1);
+			}
+
+		}
+
+		parserHighlights.clear();
+
+	}
+
+
+	/**
+	 * Removes all of the highlights for a specific parser.
+	 *
+	 * @param parser The parser.
+	 */
+	public void clearParserHighlights(Parser parser) {
+
+		for (Iterator i=parserHighlights.iterator(); i.hasNext(); ) {
+
+			HighlightInfo info = (HighlightInfo)i.next();
+
+			if (info.notice.getParser()==parser) {
+				if (info instanceof LayeredHighlightInfo) {
+					LayeredHighlightInfo lhi = (LayeredHighlightInfo)info;
+				    if (lhi.width > 0 && lhi.height > 0) {
+				    	textArea.repaint(lhi.x, lhi.y, lhi.width, lhi.height);
+				    }
+				}
+				else {
+					TextUI ui = textArea.getUI();
+					ui.damageRange(textArea, info.getStartOffset(),info.getEndOffset());
+					//safeDamageRange(info.p0, info.p1);
+				}
+				i.remove();
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void deinstall(JTextComponent c) {
+		this.textArea = null;
+		markedOccurrences.clear();
+		parserHighlights.clear();
+	}
+
+
+	/**
+	 * Returns a list of "marked occurrences" in the text area.  If there are
+	 * no marked occurrences, this will be an empty list.
+	 *
+	 * @return The list of marked occurrences.
+	 */
+	public List getMarkedOccurrences() {
+		List list = new ArrayList(markedOccurrences.size());
+		for (Iterator i=markedOccurrences.iterator(); i.hasNext(); ) {
+			HighlightInfo info = (HighlightInfo)i.next();
+			int start = info.getStartOffset();
+			int end = info.getEndOffset() + 1; // HACK
+			DocumentRange range = new DocumentRangeImpl(start, end);
+			list.add(range);
+		}
+		return list;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void install(JTextComponent c) {
+		super.install(c);
+		this.textArea = (RTextArea)c;
+	}
+
+
+	/**
+	 * Renders the highlights.
+	 *
+	 * @param g the graphics context
+	 */
+	public void paint(Graphics g) {
+		paintList(g, markedOccurrences);
+		super.paint(g);
+		paintList(g, parserHighlights);
+	}
+
+
+	private void paintList(Graphics g, List highlights) {
+
+		int len = highlights.size();
+
+		for (int i = 0; i < len; i++) {
+			HighlightInfo info = (HighlightInfo)highlights.get(i);
+			if (!(info instanceof LayeredHighlightInfo)) {
+				// Avoid allocating unless we need it.
+				Rectangle a = textArea.getBounds();
+				Insets insets = textArea.getInsets();
+				a.x = insets.left;
+				a.y = insets.top;
+				a.width -= insets.left + insets.right;
+				a.height -= insets.top + insets.bottom;
+				for (; i < len; i++) {
+					info = (HighlightInfo)markedOccurrences.get(i);
+					if (!(info instanceof LayeredHighlightInfo)) {
+						Color c = info.getColor();
+						Highlighter.HighlightPainter p = info.getPainter();
+						if (c!=null && p instanceof ChangeableColorHighlightPainter) {
+							((ChangeableColorHighlightPainter)p).setColor(c);
+						}
+						p.paint(g, info.getStartOffset(), info.getEndOffset(),
+								a, textArea);
+					}
+				}
+		    }
+		}
+
+	}
+
+
+	/**
+	 * When leaf Views (such as LabelView) are rendering they should
+	 * call into this method. If a highlight is in the given region it will
+	 * be drawn immediately.
+	 *
+	 * @param g Graphics used to draw
+	 * @param p0 starting offset of view
+	 * @param p1 ending offset of view
+	 * @param viewBounds Bounds of View
+	 * @param editor JTextComponent
+	 * @param view View instance being rendered
+	 */
+	public void paintLayeredHighlights(Graphics g, int p0, int p1,
+						Shape viewBounds, JTextComponent editor, View view) {
+		paintListLayered(g, p0,p1, viewBounds, editor, view, markedOccurrences);
+		super.paintLayeredHighlights(g, p0, p1, viewBounds, editor, view);
+		paintListLayered(g, p0,p1, viewBounds, editor, view, parserHighlights);
+	}
+
+
+	private void paintListLayered(Graphics g, int p0, int p1, Shape viewBounds,
+						JTextComponent editor, View view, List highlights) {
+		for (int i=highlights.size()-1; i>=0; i--) {
+			Object tag = highlights.get(i);
+			if (tag instanceof LayeredHighlightInfo) {
+				LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
+				int start = lhi.getStartOffset();
+				int end = lhi.getEndOffset();
+				if ((p0 < start && p1 > start) ||
+						(p0 >= start && p0 < end)) {
+					lhi.paintLayeredHighlights(g, p0, p1, viewBounds,
+									editor, view);
+				}
+			}
+		}
+	}
+
+
+	private void removeListHighlight(List list, Object tag) {
+		if (tag instanceof LayeredHighlightInfo) {
+			LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
+		    if (lhi.width > 0 && lhi.height > 0) {
+		    	textArea.repaint(lhi.x, lhi.y, lhi.width, lhi.height);
+		    }
+		}
+		else {
+			HighlightInfo info = (HighlightInfo) tag;
+			TextUI ui = textArea.getUI();
+			ui.damageRange(textArea, info.getStartOffset(),info.getEndOffset());
+			//safeDamageRange(info.p0, info.p1);
+		}
+		list.remove(tag);
+	}
+
+
+	/**
+	 * Removes a "marked occurrences" highlight from the view.
+	 *
+	 * @param tag The reference to the highlight
+	 * @see #addMarkedOccurrenceHighlight(int, int, MarkOccurrencesHighlightPainter)
+	 */
+	void removeMarkOccurrencesHighlight(Object tag) {
+		removeListHighlight(markedOccurrences, tag);
+    }
+
+
+	/**
+	 * Removes a parser highlight from this view.
+	 *
+	 * @param tag The reference to the highlight.
+	 * @see #addParserHighlight(ParserNotice, javax.swing.text.Highlighter.HighlightPainter)
+	 */
+	void removeParserHighlight(Object tag) {
+		removeListHighlight(parserHighlights, tag);
+	}
+
+
+	private static class DocumentRangeImpl implements DocumentRange {
+
+		private int startOffs;
+		private int endOffs;
+
+		public DocumentRangeImpl(int startOffs, int endOffs) {
+			this.startOffs = startOffs;
+			this.endOffs = endOffs;
+		}
+
+		public int getEndOffset() {
+			return endOffs;
+		}
+
+		public int getStartOffset() {
+			return startOffs;
+		}
+
+	}
+
+
+	private static class HighlightInfo implements Highlighter.Highlight {
+	
+		private Position p0;
+		private Position p1;
+		protected Highlighter.HighlightPainter painter;
+		private ParserNotice notice;//Color color; // Used only by Parser highlights.
+
+		public Color getColor() {
+			//return color;
+			Color color = null;
+			if (notice!=null) {
+				color = notice.getColor();
+				if (color==null) {
+					color = DEFAULT_PARSER_NOTICE_COLOR;
+				}
+			}
+			return color;
+		}
+
+		public int getStartOffset() {
+			return p0.getOffset();
+		}
+		
+		public int getEndOffset() {
+			return p1.getOffset();
+		}
+		
+		public Highlighter.HighlightPainter getPainter() {
+			return painter;
+		}
+		
+	}
+
+
+	private static class LayeredHighlightInfo extends HighlightInfo {
+	
+		private int x;
+		private int y;
+		private int width;
+		private int height;
+
+		void union(Shape bounds) {
+			if (bounds == null) {
+				return;
+			}
+			Rectangle alloc = (bounds instanceof Rectangle) ?
+					(Rectangle)bounds : bounds.getBounds();
+			if (width == 0 || height == 0) {
+				x = alloc.x;
+				y = alloc.y;
+				width = alloc.width;
+				height = alloc.height;
+			}
+			else {
+				width = Math.max(x + width, alloc.x + alloc.width);
+				height = Math.max(y + height, alloc.y + alloc.height);
+				x = Math.min(x, alloc.x);
+				width -= x;
+				y = Math.min(y, alloc.y);
+				height -= y;
+			}
+		}
+	
+		/**
+		 * Restricts the region based on the receivers offsets and messages
+		 * the painter to paint the region.
+		 */
+		void paintLayeredHighlights(Graphics g, int p0, int p1,
+									Shape viewBounds, JTextComponent editor,
+									View view) {
+			int start = getStartOffset();
+			int end = getEndOffset();
+			// Restrict the region to what we represent
+			p0 = Math.max(start, p0);
+			p1 = Math.min(end, p1);
+			if (getColor()!=null &&
+					(painter instanceof ChangeableColorHighlightPainter)) {
+				((ChangeableColorHighlightPainter)painter).setColor(getColor());
+			}
+			// Paint the appropriate region using the painter and union
+			// the effected region with our bounds.
+			union(((LayeredHighlighter.LayerPainter)painter).paintLayer
+								(g, p0, p1, viewBounds, editor, view));
+		}
+	
+	}
+	
+	
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java	(revision 25584)
@@ -0,0 +1,243 @@
+/*
+ * 02/24/2004
+ *
+ * RSyntaxTextAreaUI.java - UI for an RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.UIManager;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.InputMapUIResource;
+import javax.swing.text.*;
+
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaUI;
+
+
+/**
+ * UI used by <code>RSyntaxTextArea</code>.  This allows us to implement
+ * syntax highlighting.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RSyntaxTextAreaUI extends RTextAreaUI {
+
+	private static final String SHARED_ACTION_MAP_NAME	= "RSyntaxTextAreaUI.actionMap";
+	private static final String SHARED_INPUT_MAP_NAME		= "RSyntaxTextAreaUI.inputMap";
+	private static final EditorKit defaultKit			= new RSyntaxTextAreaEditorKit();
+
+
+	public static ComponentUI createUI(JComponent ta) {
+		return new RSyntaxTextAreaUI(ta);
+	}
+
+
+	/**
+	 * Constructor.
+	 */
+	public RSyntaxTextAreaUI(JComponent rSyntaxTextArea) {
+		super(rSyntaxTextArea);
+	}
+
+
+    /**
+     * Creates the view for an element.
+     *
+     * @param elem The element.
+     * @return The view.
+     */
+	public View create(Element elem) {
+		RTextArea c = getRTextArea();
+		if (c instanceof RSyntaxTextArea) {
+			RSyntaxTextArea area = (RSyntaxTextArea) c;
+			View v;
+			if (area.getLineWrap())
+				v = new WrappedSyntaxView(elem);
+			else
+				v = new SyntaxView(elem);
+			return v;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Creates the highlighter to use for syntax text areas.
+	 *
+	 * @return The highlighter.
+	 */
+	protected Highlighter createHighlighter() {
+		return new RSyntaxTextAreaHighlighter();
+	}
+
+
+	/**
+	 * Returns the name to use to cache/fetch the shared action map.  This
+	 * should be overridden by subclasses if the subclass has its own custom
+	 * editor kit to install, so its actions get picked up.
+	 *
+	 * @return The name of the cached action map.
+	 */
+	protected String getActionMapName() {
+		return SHARED_ACTION_MAP_NAME;
+	}
+
+
+	/**
+	 * Fetches the EditorKit for the UI.
+	 *
+	 * @param tc The text component for which this UI is installed.
+	 * @return The editor capabilities.
+	 * @see javax.swing.plaf.TextUI#getEditorKit
+	 */
+	public EditorKit getEditorKit(JTextComponent tc) {
+		return defaultKit;
+	}
+
+
+	/**
+	 * Get the InputMap to use for the UI.<p>  
+	 *
+	 * This method is not named <code>getInputMap()</code> because there is
+	 * a package-private method in <code>BasicTextAreaUI</code> with that name.
+	 * Thus, creating a new method with that name causes certain compilers to
+	 * issue warnings that you are not actually overriding the original method
+	 * (since it is package-private).
+	 */
+	protected InputMap getRTextAreaInputMap() {
+		InputMap map = new InputMapUIResource();
+		InputMap shared = (InputMap)UIManager.get(SHARED_INPUT_MAP_NAME);
+		if (shared==null) {
+			shared = new RSyntaxTextAreaDefaultInputMap();
+			UIManager.put(SHARED_INPUT_MAP_NAME, shared);
+		}
+		//KeyStroke[] keys = shared.allKeys();
+		//for (int i=0; i<keys.length; i++)
+		//	System.err.println(keys[i] + " -> " + shared.get(keys[i]));
+		map.setParent(shared);
+		return map;
+	}
+
+
+	/**
+	 * Paints the text area's background.
+	 *
+	 * @param g The graphics component on which to paint.
+	 */
+	protected void paintBackground(Graphics g) {
+		super.paintBackground(g);
+		paintMatchedBracket(g);
+	}
+
+
+	/**
+	 * Paints the "matched bracket", if any.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintMatchedBracket(Graphics g) {
+		// We must add "-1" to the height because otherwise we'll paint below
+		// the region that gets invalidated.
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (rsta.isBracketMatchingEnabled()) {
+			Rectangle match = rsta.match;
+			if (match!=null) {
+				if (rsta.getAnimateBracketMatching()) {
+					Color bg = rsta.getMatchedBracketBGColor();
+					if (bg!=null) {
+						g.setColor(bg);
+						g.fillRoundRect(match.x,match.y, match.width,match.height-1, 5,5);
+					}
+					g.setColor(rsta.getMatchedBracketBorderColor());
+					g.drawRoundRect(match.x,match.y, match.width,match.height-1, 5,5);
+				}
+				else {
+					Color bg = rsta.getMatchedBracketBGColor();
+					if (bg!=null) {
+						g.setColor(bg);
+						g.fillRect(match.x,match.y, match.width,match.height-1);
+					}
+					g.setColor(rsta.getMatchedBracketBorderColor());
+					g.drawRect(match.x,match.y, match.width,match.height-1);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Gets called whenever a bound property is changed on this UI's
+	 * <code>RSyntaxTextArea</code>.
+	 *
+	 * @param e The property change event.
+	 */
+	protected void propertyChange(PropertyChangeEvent e) {
+
+		String name = e.getPropertyName();
+
+		// If they change the syntax scheme, we must do this so that
+		// WrappedSyntaxView(_TEST) updates its child views properly.
+		if (name.equals(RSyntaxTextArea.SYNTAX_SCHEME_PROPERTY)) {
+			modelChanged();
+		}
+
+		// Everything else is general to all RTextAreas.
+		else {
+			super.propertyChange(e);
+		}
+
+	}
+
+
+	/**
+	 * Updates the view.  This should be called when the underlying
+	 * <code>RSyntaxTextArea</code> changes its syntax editing style.
+	 */
+	public void refreshSyntaxHighlighting() {
+		modelChanged();
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.<p>
+	 *
+	 * This method is quicker than using traditional
+	 * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+	 * computed.
+	 */
+	public int yForLine(int line) throws BadLocationException {
+		Rectangle alloc = getVisibleEditorRect();
+		if (alloc!=null) {
+			RSTAView view = (RSTAView)getRootView(textArea).getView(0);
+			return view.yForLine(alloc, line);
+		}
+		return -1;
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the line containing a specified offset.<p>
+	 *
+	 * This is faster than calling <code>modelToView(offs).y</code>, so it is
+	 * preferred if you do not need the actual bounding box.
+	 */
+	public int yForLineContaining(int offs) throws BadLocationException {
+		Rectangle alloc = getVisibleEditorRect();
+		if (alloc!=null) {
+			RSTAView view = (RSTAView)getRootView(textArea).getView(0);
+			return view.yForLineContaining(alloc, offs);
+		}
+		return -1;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java	(revision 25584)
@@ -0,0 +1,1135 @@
+/*
+ * 08/06/2004
+ *
+ * RSyntaxUtilities.java - Utility methods used by RSyntaxTextArea and its
+ * views.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.Toolkit;
+import java.util.Map;
+import javax.swing.*;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.Segment;
+import javax.swing.text.TabExpander;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextScrollPane;
+
+
+/**
+ * Utility methods used by <code>RSyntaxTextArea</code> and its associated
+ * classes.
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public class RSyntaxUtilities implements SwingConstants {
+
+	//private static final int DIGIT_MASK			= 1;
+	private static final int LETTER_MASK			= 2;
+	//private static final int WHITESPACE_MASK		= 4;
+	//private static final int UPPER_CASE_MASK		= 8;
+	private static final int HEX_CHARACTER_MASK		= 16;
+	private static final int LETTER_OR_DIGIT_MASK	= 32;
+	private static final int BRACKET_MASK			= 64;
+	private static final int JAVA_OPERATOR_MASK		= 128;
+
+	/**
+	 * A lookup table used to quickly decide if a 16-bit Java char is a
+	 * US-ASCII letter (A-Z or a-z), a digit, a whitespace char (either space
+	 * (0x0020) or tab (0x0009)), etc.  This method should be faster
+	 * than <code>Character.isLetter</code>, <code>Character.isDigit</code>,
+	 * and <code>Character.isWhitespace</code> because we know we are dealing
+	 * with ASCII chars and so don't have to worry about code planes, etc.
+	 */
+	private static final int[] dataTable = {
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0, // 0-15
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 16-31
+		 4, 128,   0,   0,   0, 128, 128,   0,  64,  64, 128, 128,   0, 128,   0, 128, // 32-47
+		49,  49,  49,  49,  49,  49,  49,  49,  49,  49, 128,   0, 128, 128, 128, 128, // 48-63
+		 0,  58,  58,  58,  58,  58,  58,  42,  42,  42,  42,  42,  42,  42,  42,  42, // 64-79
+		42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,  64,   0,  64, 128,   0, // 80-95
+		 0,  50,  50,  50,  50,  50,  50,  34,  34,  34,  34,  34,  34,  34,  34,  34, // 96-111
+		34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  34,  64, 128,  64, 128,   0, // 112-127
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 128-143
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 144-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 160-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 176-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 192-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 208-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, // 224-
+		 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0  // 240-255.
+	};
+
+	/**
+	 * Used in bracket matching methods.
+	 */
+	private static Segment charSegment = new Segment();
+
+	/**
+	 * Used internally.
+	 */
+	private static final char[] JS_KEYWORD_RETURN = { 'r', 'e', 't', 'u', 'r', 'n' };
+
+
+	/**
+	 * Returns a string with characters that are special to HTML (such as
+	 * <code>&lt;</code>, <code>&gt;</code> and <code>&amp;</code>) replaced
+	 * by their HTML escape sequences.
+	 *
+	 * @param s The input string.
+	 * @param newlineReplacement What to replace newline characters with.
+	 *        If this is <code>null</code>, they are simply removed.
+	 * @param inPreBlock Whether this HTML will be in within <code>pre</code>
+	 *        tags.  If this is <code>true</code>, spaces will be kept as-is;
+	 *        otherwise, they will be converted to "<code>&nbsp;</code>".
+	 * @return The escaped version of <code>s</code>.
+	 */
+	public static final String escapeForHtml(String s,
+						String newlineReplacement, boolean inPreBlock) {
+
+		if (s==null) {
+			return null;
+		}
+		if (newlineReplacement==null) {
+			newlineReplacement = "";
+		}
+		final String tabString = "   ";
+		boolean lastWasSpace = false;
+
+		// TODO: When updating to 1.5, replace with StringBuilder, and change
+		// loop to use new append(str, offs,len) method.
+		StringBuffer sb = new StringBuffer();
+
+		for (int i=0; i<s.length(); i++) {
+			char ch = s.charAt(i);
+			switch (ch) {
+				case ' ':
+					if (inPreBlock || !lastWasSpace) {
+						sb.append(' ');
+					}
+					else {
+						sb.append("&nbsp;");
+					}
+					lastWasSpace = true;
+					break;
+				case '\n':
+					sb.append(newlineReplacement);
+					lastWasSpace = false;
+					break;
+				case '&':
+					sb.append("&amp;");
+					lastWasSpace = false;
+					break;
+				case '\t':
+					sb.append(tabString);
+					lastWasSpace = false;
+					break;
+				case '<':
+					sb.append("&lt;");
+					lastWasSpace = false;
+					break;
+				case '>':
+					sb.append("&gt;");
+					lastWasSpace = false;
+					break;
+				default:
+					sb.append(ch);
+					lastWasSpace = false;
+					break;
+			}
+		}
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the rendering hints for text that will most accurately reflect
+	 * those of the native windowing system.
+	 *
+	 * @return The rendering hints, or <code>null</code> if they cannot be
+	 *         determined.
+	 */
+	public static Map getDesktopAntiAliasHints() {
+		return (Map)Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
+	}
+
+
+	/**
+	 * Returns the color to use for the line underneath a folded region line.
+	 *
+	 * @param textArea The text area.
+	 * @return The color to use.
+	 */
+	public static Color getFoldedLineBottomColor(RSyntaxTextArea textArea) {
+		Color color = Color.gray;
+		Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+		if (gutter!=null) {
+			color = gutter.getFoldIndicatorForeground();
+		}
+		return color;
+	}
+
+
+	/**
+	 * Returns the gutter component of the scroll pane containing a text
+	 * area, if any.
+	 *
+	 * @param textArea The text area.
+	 * @return The gutter, or <code>null</code> if the text area is not in
+	 *         an {@link RTextScrollPane}.
+	 * @see RTextScrollPane#getGutter()
+	 */
+	public static Gutter getGutter(RTextArea textArea) {
+		Gutter gutter = null;
+		Container parent = textArea.getParent();
+		if (parent instanceof JViewport) {
+			parent = parent.getParent();
+			if (parent instanceof RTextScrollPane) {
+				RTextScrollPane sp = (RTextScrollPane)parent;
+				gutter = sp.getGutter(); // Should always be non-null
+			}
+		}
+		return gutter;
+	}
+
+
+	/**
+	 * Returns the leading whitespace of a string.
+	 *
+	 * @param text The String to check.
+	 * @return The leading whitespace.
+	 */
+	public static String getLeadingWhitespace(String text) {
+		int count = 0;
+		int len = text.length();
+		while (count<len && RSyntaxUtilities.isWhitespace(text.charAt(count))) {
+			count++;
+		}
+		return text.substring(0, count);
+	}
+
+
+	private static final Element getLineElem(Document d, int offs) {
+		Element map = d.getDefaultRootElement();
+		int index = map.getElementIndex(offs);
+		Element elem = map.getElement(index);
+		if ((offs>=elem.getStartOffset()) && (offs<elem.getEndOffset())) {
+			return elem;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the bounding box (in the current view) of a specified position
+	 * in the model.  This method is designed for line-wrapped views to use,
+	 * as it allows you to specify a "starting position" in the line, from
+	 * which the x-value is assumed to be zero.  The idea is that you specify
+	 * the first character in a physical line as <code>p0</code>, as this is
+	 * the character where the x-pixel value is 0.
+	 *
+	 * @param textArea The text area containing the text.
+	 * @param s A segment in which to load the line.  This is passed in so we
+	 *        don't have to reallocate a new <code>Segment</code> for each
+	 *        call.
+	 * @param p0 The starting position in the physical line in the document.
+	 * @param p1 The position for which to get the bounding box in the view.
+	 * @param e How to expand tabs.
+	 * @param rect The rectangle whose x- and width-values are changed to
+	 *        represent the bounding box of <code>p1</code>.  This is reused
+	 *        to keep from needlessly reallocating Rectangles.
+	 * @param x0 The x-coordinate (pixel) marking the left-hand border of the
+	 *        text.  This is useful if the text area has a border, for example.
+	 * @return The bounding box in the view of the character <code>p1</code>.
+	 * @throws BadLocationException If <code>p0</code> or <code>p1</code> is
+	 *         not a valid location in the specified text area's document.
+	 * @throws IllegalArgumentException If <code>p0</code> and <code>p1</code>
+	 *         are not on the same line.
+	 */
+	public static Rectangle getLineWidthUpTo(RSyntaxTextArea textArea,
+								Segment s, int p0, int p1,
+								TabExpander e, Rectangle rect,
+								int x0)
+								throws BadLocationException {
+
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+		// Ensure p0 and p1 are valid document positions.
+		if (p0<0)
+			throw new BadLocationException("Invalid document position", p0);
+		else if (p1>doc.getLength())
+			throw new BadLocationException("Invalid document position", p1);
+
+		// Ensure p0 and p1 are in the same line, and get the start/end
+		// offsets for that line.
+		Element map = doc.getDefaultRootElement();
+		int lineNum = map.getElementIndex(p0);
+		// We do ">1" because p1 might be the first position on the next line
+		// or the last position on the previous one.
+		// if (lineNum!=map.getElementIndex(p1))
+		if (Math.abs(lineNum-map.getElementIndex(p1))>1)
+			throw new IllegalArgumentException("p0 and p1 are not on the " +
+						"same line (" + p0 + ", " + p1 + ").");
+
+		// Get the token list.
+		Token t = doc.getTokenListForLine(lineNum);
+
+		// Modify the token list 't' to begin at p0 (but still have correct
+		// token types, etc.), and get the x-location (in pixels) of the
+		// beginning of this new token list.
+		makeTokenListStartAt(t, p0, e, textArea, 0);
+
+		rect = t.listOffsetToView(textArea, e, p1, x0, rect);
+		return rect;
+
+	}
+
+
+	/**
+	 * Returns the location of the bracket paired with the one at the current
+	 * caret position.
+	 *
+	 * @param textArea The text area.
+	 * @return The location of the matching bracket in the document, or
+	 *         <code>-1</code> if there isn't a matching bracket (or the caret
+	 *         isn't on a bracket).
+	 */
+	public static int getMatchingBracketPosition(RSyntaxTextArea textArea) {
+
+		try {
+
+			// Actually position just BEFORE caret.
+			int caretPosition = textArea.getCaretPosition() - 1;
+			if (caretPosition>-1) {
+
+				// Some variables that will be used later.
+				Token token;
+				Element map;
+				int curLine;
+				Element line;
+				int start, end;
+				RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+				char bracket  = doc.charAt(caretPosition);
+
+				// First, see if the previous char was a bracket
+				// ('{', '}', '(', ')', '[', ']').
+				// If it was, then make sure this bracket isn't sitting in
+				// the middle of a comment or string.  If it isn't, then
+				// initialize some stuff so we can continue on.
+				char bracketMatch;
+				boolean goForward;
+				switch (bracket) {
+
+					case '{':
+					case '(':
+					case '[':
+
+						// Ensure this bracket isn't in a comment.
+						map = doc.getDefaultRootElement();
+						curLine = map.getElementIndex(caretPosition);
+						line = map.getElement(curLine);
+						start = line.getStartOffset();
+						end = line.getEndOffset();
+						token = doc.getTokenListForLine(curLine);
+						token = RSyntaxUtilities.getTokenAtOffset(token, caretPosition);
+						// All brackets are always returned as "separators."
+						if (token.type!=Token.SEPARATOR) {
+							return -1;
+						}
+						bracketMatch = bracket=='{' ? '}' : (bracket=='(' ? ')' : ']');
+						goForward = true;
+						break;
+
+					case '}':
+					case ')':
+					case ']':
+
+						// Ensure this bracket isn't in a comment.
+						map = doc.getDefaultRootElement();
+						curLine = map.getElementIndex(caretPosition);
+						line = map.getElement(curLine);
+						start = line.getStartOffset();
+						end = line.getEndOffset();
+						token = doc.getTokenListForLine(curLine);
+						token = RSyntaxUtilities.getTokenAtOffset(token, caretPosition);
+						// All brackets are always returned as "separators."
+						if (token.type!=Token.SEPARATOR) {
+							return -1;
+						}
+						bracketMatch = bracket=='}' ? '{' : (bracket==')' ? '(' : '[');
+						goForward = false;
+						break;
+
+					default:
+						return -1;
+
+				}
+
+				if (goForward) {
+
+					int lastLine = map.getElementCount();
+
+					// Start just after the found bracket since we're sure
+					// we're not in a comment.
+					start = caretPosition + 1;
+					int numEmbedded = 0;
+					boolean haveTokenList = false;
+
+					while (true) {
+
+						doc.getText(start,end-start, charSegment);
+						int segOffset = charSegment.offset;
+
+						for (int i=segOffset; i<segOffset+charSegment.count; i++) {
+
+							char ch = charSegment.array[i];
+
+							if (ch==bracket) {
+								if (haveTokenList==false) {
+									token = doc.getTokenListForLine(curLine);
+									haveTokenList = true;
+								}
+								int offset = start + (i-segOffset);
+								token = RSyntaxUtilities.getTokenAtOffset(token, offset);
+								if (token.type==Token.SEPARATOR)
+									numEmbedded++;
+							}
+
+							else if (ch==bracketMatch) {
+								if (haveTokenList==false) {
+									token = doc.getTokenListForLine(curLine);
+									haveTokenList = true;
+								}
+								int offset = start + (i-segOffset);
+								token = RSyntaxUtilities.getTokenAtOffset(token, offset);
+								if (token.type==Token.SEPARATOR) {
+									if (numEmbedded==0) {
+										if (textArea.isCodeFoldingEnabled() &&
+												textArea.getFoldManager().isLineHidden(curLine)) {
+											return -1; // Match hidden in a fold
+										}
+										return offset;
+									}
+									numEmbedded--;
+								}
+							}
+
+						} // End of for (int i=segOffset; i<segOffset+charSegment.count; i++).
+
+						// Bail out if we've gone through all lines and
+						// haven't found the match.
+						if (++curLine==lastLine)
+							return -1;
+
+						// Otherwise, go through the next line.
+						haveTokenList = false;
+						line = map.getElement(curLine);
+						start = line.getStartOffset();
+						end = line.getEndOffset();
+
+					} // End of while (true).
+
+				} // End of if (goForward).
+
+
+				// Otherwise, we're going backward through the file
+				// (since we found '}', ')' or ']').
+				else {	// goForward==false
+
+					// End just before the found bracket since we're sure
+					// we're not in a comment.
+					end = caretPosition;// - 1;
+					int numEmbedded = 0;
+					boolean haveTokenList = false;
+					Token t2;
+
+					while (true) {
+
+						doc.getText(start,end-start, charSegment);
+						int segOffset = charSegment.offset;
+						int iStart = segOffset + charSegment.count - 1;
+
+						for (int i=iStart; i>=segOffset; i--) {
+
+							char ch = charSegment.array[i];
+
+							if (ch==bracket) {
+								if (haveTokenList==false) {
+									token = doc.getTokenListForLine(curLine);
+									haveTokenList = true;
+								}
+								int offset = start + (i-segOffset);
+								t2 = RSyntaxUtilities.getTokenAtOffset(token, offset);
+								if (t2.type==Token.SEPARATOR)
+									numEmbedded++;
+							}
+
+							else if (ch==bracketMatch) {
+								if (haveTokenList==false) {
+									token = doc.getTokenListForLine(curLine);
+									haveTokenList = true;
+								}
+								int offset = start + (i-segOffset);
+								t2 = RSyntaxUtilities.getTokenAtOffset(token, offset);
+								if (t2.type==Token.SEPARATOR) {
+									if (numEmbedded==0)
+										return offset;
+									numEmbedded--;
+								}
+							}
+
+						}
+
+						// Bail out if we've gone through all lines and
+						// haven't found the match.
+						if (--curLine==-1)
+							return -1;
+
+						// Otherwise, get ready for going through the
+						// next line.
+						haveTokenList = false;
+						line = map.getElement(curLine);
+						start = line.getStartOffset();
+						end = line.getEndOffset();
+
+					} // End of while (true).
+
+				} // End of else.
+
+			} // End of if (caretPosition>-1).
+
+		} catch (BadLocationException ble) {
+			// Shouldn't ever happen.
+			ble.printStackTrace();
+		}
+
+		// Something went wrong...
+		return -1;
+
+	}
+
+
+	/**
+	 * Provides a way to determine the next visually represented model 
+	 * location at which one might place a caret.
+	 * Some views may not be visible,
+	 * they might not be in the same order found in the model, or they just
+	 * might not allow access to some of the locations in the model.<p>
+	 *
+	 * NOTE:  You should only call this method if the passed-in
+	 * <code>javax.swing.text.View</code> is an instance of
+	 * {@link TokenOrientedView} and <code>javax.swing.text.TabExpander</code>;
+	 * otherwise, a <code>ClassCastException</code> could be thrown.
+	 *
+	 * @param pos the position to convert >= 0
+	 * @param a the allocated region in which to render
+	 * @param direction the direction from the current position that can
+	 *  be thought of as the arrow keys typically found on a keyboard.
+	 *  This will be one of the following values:
+	 * <ul>
+	 * <li>SwingConstants.WEST
+	 * <li>SwingConstants.EAST
+	 * <li>SwingConstants.NORTH
+	 * <li>SwingConstants.SOUTH
+	 * </ul>
+	 * @return the location within the model that best represents the next
+	 *  location visual position
+	 * @exception BadLocationException
+	 * @exception IllegalArgumentException if <code>direction</code>
+	 *		doesn't have one of the legal values above
+	 */
+	public static int getNextVisualPositionFrom(int pos, Position.Bias b,
+									Shape a, int direction,
+									Position.Bias[] biasRet, View view) 
+									throws BadLocationException {
+
+		RSyntaxTextArea target = (RSyntaxTextArea)view.getContainer();
+		biasRet[0] = Position.Bias.Forward;
+
+		// Do we want the "next position" above, below, to the left or right?
+		switch (direction) {
+
+			case NORTH:
+			case SOUTH:
+				if (pos == -1) {
+					pos = (direction == NORTH) ?
+								Math.max(0, view.getEndOffset() - 1) :
+								view.getStartOffset();
+					break;
+				}
+				Caret c = (target != null) ? target.getCaret() : null;
+				// YECK! Ideally, the x location from the magic caret
+				// position would be passed in.
+				Point mcp;
+				if (c != null)
+					mcp = c.getMagicCaretPosition();
+				else
+					mcp = null;
+				int x;
+				if (mcp == null) {
+					Rectangle loc = target.modelToView(pos);
+					x = (loc == null) ? 0 : loc.x;
+				}
+				else {
+					x = mcp.x;
+				}
+				if (direction == NORTH)
+					pos = getPositionAbove(target,pos,x,(TabExpander)view);
+				else
+					pos = getPositionBelow(target,pos,x,(TabExpander)view);
+				break;
+
+			case WEST:
+				if(pos == -1) {
+					pos = Math.max(0, view.getEndOffset() - 1);
+				}
+				else {
+					pos = Math.max(0, pos - 1);
+					if (target.isCodeFoldingEnabled()) {
+						int last = target.getLineOfOffset(pos+1);
+						int current = target.getLineOfOffset(pos);
+						if (last!=current) { // If moving up a line...
+							FoldManager fm = target.getFoldManager();
+							if (fm.isLineHidden(current)) {
+								while (--current>0 && fm.isLineHidden(current));
+								pos = target.getLineEndOffset(current) - 1;
+							}
+						}
+					}
+				}
+				break;
+
+			case EAST:
+				if(pos == -1) {
+					pos = view.getStartOffset();
+				}
+				else {
+					pos = Math.min(pos + 1, view.getDocument().getLength());
+					if (target.isCodeFoldingEnabled()) {
+						int last = target.getLineOfOffset(pos-1);
+						int current = target.getLineOfOffset(pos);
+						if (last!=current) { // If moving down a line...
+							FoldManager fm = target.getFoldManager();
+							if (fm.isLineHidden(current)) {
+								int lineCount = target.getLineCount();
+								while (++current<lineCount && fm.isLineHidden(current));
+								pos = current==lineCount ?
+										target.getLineEndOffset(last)-1 : // Was the last visible line
+										target.getLineStartOffset(current);
+							}
+						}
+					}
+				}
+				break;
+
+			default:
+				throw new IllegalArgumentException(
+									"Bad direction: " + direction);
+		}
+
+		return pos;
+
+	}
+
+
+	/**
+	 * Determines the position in the model that is closest to the given 
+	 * view location in the row above.  The component given must have a
+	 * size to compute the result.  If the component doesn't have a size
+	 * a value of -1 will be returned.
+	 *
+	 * @param c the editor
+	 * @param offs the offset in the document >= 0
+	 * @param x the X coordinate >= 0
+	 * @return the position >= 0 if the request can be computed, otherwise
+	 *  a value of -1 will be returned.
+	 * @exception BadLocationException if the offset is out of range
+	 */
+	public static final int getPositionAbove(RSyntaxTextArea c, int offs,
+					float x, TabExpander e) throws BadLocationException {
+
+		TokenOrientedView tov = (TokenOrientedView)e;
+		Token token = tov.getTokenListForPhysicalLineAbove(offs);
+		if (token==null)
+			return -1;
+
+		// A line containing only Token.NULL is an empty line.
+		else if (token.type==Token.NULL) {
+			int line = c.getLineOfOffset(offs);	// Sure to be >0 ??
+			return c.getLineStartOffset(line-1);
+		}
+
+		else {
+			return token.getListOffset(c, e, 0, x);
+		}
+
+	}
+
+
+	/**
+	 * Determines the position in the model that is closest to the given 
+	 * view location in the row below.  The component given must have a
+	 * size to compute the result.  If the component doesn't have a size
+	 * a value of -1 will be returned.
+	 *
+	 * @param c the editor
+	 * @param offs the offset in the document >= 0
+	 * @param x the X coordinate >= 0
+	 * @return the position >= 0 if the request can be computed, otherwise
+	 *  a value of -1 will be returned.
+	 * @exception BadLocationException if the offset is out of range
+	 */
+	public static final int getPositionBelow(RSyntaxTextArea c, int offs,
+					float x, TabExpander e) throws BadLocationException {
+
+		TokenOrientedView tov = (TokenOrientedView)e;
+		Token token = tov.getTokenListForPhysicalLineBelow(offs);
+		if (token==null)
+			return -1;
+
+		// A line containing only Token.NULL is an empty line.
+		else if (token.type==Token.NULL) {
+			int line = c.getLineOfOffset(offs);	// Sure to be > c.getLineCount()-1 ??
+//			return c.getLineStartOffset(line+1);
+FoldManager fm = c.getFoldManager();
+line = fm.getVisibleLineBelow(line);
+return c.getLineStartOffset(line);
+		}
+
+		else {
+			return token.getListOffset(c, e, 0, x);
+		}
+
+	}
+
+
+	/**
+	 * Returns the token at the specified index, or <code>null</code> if
+	 * the given offset isn't in this token list's range.<br>
+	 * Note that this method does NOT check to see if <code>tokenList</code>
+	 * is null; callers should check for themselves.
+	 *
+	 * @param tokenList The list of tokens in which to search.
+	 * @param offset The offset at which to get the token.
+	 * @return The token at <code>offset</code>, or <code>null</code> if
+	 *         none of the tokens are at that offset.
+	 */
+	public static final Token getTokenAtOffset(Token tokenList, int offset) {
+		for (Token t=tokenList; t!=null; t=t.getNextToken()) {
+			if (t.containsPosition(offset))
+				return t;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the end of the word at the given offset.
+	 *
+	 * @param textArea The text area.
+	 * @param offs The offset into the text area's content.
+	 * @return The end offset of the word.
+	 * @throws BadLocationException If <code>offs</code> is invalid.
+	 * @see #getWordStart(RSyntaxTextArea, int)
+	 */
+	public static int getWordEnd(RSyntaxTextArea textArea, int offs)
+										throws BadLocationException {
+
+		Document doc = textArea.getDocument();
+		int endOffs = textArea.getLineEndOffsetOfCurrentLine();
+		int lineEnd = Math.min(endOffs, doc.getLength());
+		if (offs == lineEnd) { // End of the line.
+			return offs;
+		}
+
+		String s = doc.getText(offs, lineEnd-offs-1);
+		if (s!=null && s.length()>0) { // Should always be true
+			int i = 0;
+			int count = s.length();
+			char ch = s.charAt(i);
+			if (Character.isWhitespace(ch)) {
+				while (i<count && Character.isWhitespace(s.charAt(i++)));
+			}
+			else if (Character.isLetterOrDigit(ch)) {
+				while (i<count && Character.isLetterOrDigit(s.charAt(i++)));
+			}
+			else {
+				i = 2;
+			}
+			offs += i - 1;
+		}
+
+		return offs;
+
+	}
+
+	/**
+	 * Returns the start of the word at the given offset.
+	 *
+	 * @param textArea The text area.
+	 * @param offs The offset into the text area's content.
+	 * @return The start offset of the word.
+	 * @throws BadLocationException If <code>offs</code> is invalid.
+	 * @see #getWordEnd(RSyntaxTextArea, int)
+	 */
+	public static int getWordStart(RSyntaxTextArea textArea, int offs)
+											throws BadLocationException {
+
+		Document doc = textArea.getDocument();
+		Element line = getLineElem(doc, offs);
+		if (line == null) {
+			throw new BadLocationException("No word at " + offs, offs);
+		}
+
+		int lineStart = line.getStartOffset();
+		if (offs==lineStart) { // Start of the line.
+			return offs;
+		}
+
+		int endOffs = Math.min(offs+1, doc.getLength());
+		String s = doc.getText(lineStart, endOffs-lineStart);
+		if(s != null && s.length() > 0) {
+			int i = s.length() - 1;
+			char ch = s.charAt(i);
+			if (Character.isWhitespace(ch)) {
+				while (i>0 && Character.isWhitespace(s.charAt(i-1))) {
+					i--;
+				}
+				offs = lineStart + i;
+			}
+			else if (Character.isLetterOrDigit(ch)) {
+				while (i>0 && Character.isLetterOrDigit(s.charAt(i-1))) {
+					i--;
+				}
+				offs = lineStart + i;
+			}
+
+		}
+
+		return offs;
+
+	}
+
+
+	/**
+	 * Determines the width of the given token list taking tabs 
+	 * into consideration.  This is implemented in a 1.1 style coordinate 
+	 * system where ints are used and 72dpi is assumed.<p>
+	 *
+	 * This method also assumes that the passed-in token list begins at
+	 * x-pixel <code>0</code> in the view (for tab purposes).
+	 *
+	 * @param tokenList The tokenList list representing the text.
+	 * @param textArea The text area in which this token list resides.
+	 * @param e The tab expander.  This value cannot be <code>null</code>.
+	 * @return The width of the token list, in pixels.
+	 */
+	public static final float getTokenListWidth(Token tokenList,
+									RSyntaxTextArea textArea,
+									TabExpander e) {
+		return getTokenListWidth(tokenList, textArea, e, 0);
+	}
+
+
+	/**
+	 * Determines the width of the given token list taking tabs 
+	 * into consideration.  This is implemented in a 1.1 style coordinate 
+	 * system where ints are used and 72dpi is assumed.<p>
+	 *
+	 * @param tokenList The token list list representing the text.
+	 * @param textArea The text area in which this token list resides.
+	 * @param e The tab expander.  This value cannot be <code>null</code>.
+	 * @param x0 The x-pixel coordinate of the start of the token list.
+	 * @return The width of the token list, in pixels.
+	 * @see #getTokenListWidthUpTo
+	 */
+	public static final float getTokenListWidth(final Token tokenList,
+									RSyntaxTextArea textArea,
+									TabExpander e, float x0) {
+		float width = x0;
+		for (Token t=tokenList; t!=null&&t.isPaintable(); t=t.getNextToken()) {
+			width += t.getWidth(textArea, e, width);
+		}
+		return width - x0;
+	}
+
+
+	/**
+	 * Determines the width of the given token list taking tabs into
+	 * consideration and only up to the given index in the document
+	 * (exclusive).
+	 *
+	 * @param tokenList The token list representing the text.
+	 * @param textArea The text area in which this token list resides.
+	 * @param e The tab expander.  This value cannot be <code>null</code>.
+	 * @param x0 The x-pixel coordinate of the start of the token list.
+	 * @param upTo The document position at which you want to stop,
+	 *        exclusive.  If this position is before the starting position
+	 *        of the token list, a width of <code>0</code> will be
+	 *        returned; similarly, if this position comes after the entire
+	 *        token list, the width of the entire token list is returned.
+	 * @return The width of the token list, in pixels, up to, but not
+	 *         including, the character at position <code>upTo</code>.
+	 * @see #getTokenListWidth
+	 */
+	public static final float getTokenListWidthUpTo(final Token tokenList,
+								RSyntaxTextArea textArea, TabExpander e,
+								float x0, int upTo) {
+		float width = 0;
+		for (Token t=tokenList; t!=null&&t.isPaintable(); t=t.getNextToken()) {
+			if (t.containsPosition(upTo)) {
+				return width + t.getWidthUpTo(upTo-t.offset, textArea, e,
+													x0+width);
+			}
+			width += t.getWidth(textArea, e, x0+width);
+		}
+		return width;
+	}
+
+
+	/**
+	 * Returns whether or not this character is a "bracket" to be matched by
+	 * such programming languages as C, C++, and Java.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a "bracket" - one of '(', ')',
+	 *         '[', ']', '{', and '}'.
+	 */
+	public static final boolean isBracket(char ch) {
+		// We need the first condition as it might be that ch>255, and thus
+		// not in our table.  '}' is the highest-valued char in the bracket
+		// set.
+		return ch<='}' && (dataTable[ch]&BRACKET_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether or not a character is a digit (0-9).
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a digit.
+	 */
+	public static final boolean isDigit(char ch) {
+		// We do it this way as we'd need to do two conditions anyway (first
+		// to check that ch<255 so it can index into our table, then whether
+		// that table position has the digit mask).
+		return ch>='0' && ch<='9';
+	}
+
+
+	/**
+	 * Returns whether or not this character is a hex character.  This method
+	 * accepts both upper- and lower-case letters a-f.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a hex character 0-9, a-f, or
+	 *         A-F.
+	 */
+	public static final boolean isHexCharacter(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).  'f' is the highest-valued
+		// char that is a valid hex character.
+		return (ch<='f') && (dataTable[ch]&HEX_CHARACTER_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether a character is a Java operator.  Note that C and C++
+	 * operators are the same as Java operators.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a Java operator.
+	 */
+	public static final boolean isJavaOperator(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).  '~' is the highest-valued
+		// char that is a valid Java operator.
+		return (ch<='~') && (dataTable[ch]&JAVA_OPERATOR_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether a character is a US-ASCII letter (A-Z or a-z).
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a US-ASCII letter.
+	 */
+	public static final boolean isLetter(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).
+		return (ch<='z') && (dataTable[ch]&LETTER_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether or not a character is a US-ASCII letter or a digit.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a US-ASCII letter or a digit.
+	 */
+	public static final boolean isLetterOrDigit(char ch) {
+		// We need the first condition as it could be that ch>255 (and thus
+		// not a valid index into our table).
+		return (ch<='z') && (dataTable[ch]&LETTER_OR_DIGIT_MASK)>0;
+	}
+
+
+	/**
+	 * Returns whether or not a character is a whitespace character (either
+	 * a space ' ' or tab '\t').  This checks for the Unicode character values
+	 * 0x0020 and 0x0009.
+	 *
+	 * @param ch The character to check.
+	 * @return Whether or not the character is a whitespace character.
+	 */
+	public static final boolean isWhitespace(char ch) {
+		// We do it this way as we'd need to do two conditions anyway (first
+		// to check that ch<255 so it can index into our table, then whether
+		// that table position has the whitespace mask).
+		return ch==' ' || ch=='\t';
+	}
+
+
+	/**
+	 * Modifies the passed-in token list to start at the specified offset.
+	 * For example, if the token list covered positions 20-60 in the document
+	 * (inclusive) like so:
+	 * <pre>
+	 *   [token1] -> [token2] -> [token3] -> [token4]
+	 *   20     30   31     40   41     50   51     60
+	 * </pre>
+	 * and you used this method to make the token list start at position 44,
+	 * then the token list would be modified to be the following:
+	 * <pre>
+	 *   [part-of-old-token3] -> [token4]
+	 *   44                 50   51     60
+	 * </pre>
+	 * Tokens that come before the specified position are forever lost, and
+	 * the token containing that position is made to begin at that position if
+	 * necessary.  All token types remain the same as they were originally.<p>
+	 *
+	 * This method can be useful if you are only interested in part of a token
+	 * list (i.e., the line it represents), but you don't want to modify the
+	 * token list yourself.
+	 *
+	 * @param tokenList The list to make start at the specified position.
+	 *        This parameter is modified.
+	 * @param pos The position at which the new token list is to start.  If
+	 *        this position is not in the passed-in token list,
+	 *        returned token list will either be <code>null</code> or the
+	 *        unpaintable token(s) at the end of the passed-in token list.
+	 * @param e How to expand tabs.
+	 * @param textArea The text area from which the token list came.
+	 * @param x0 The initial x-pixel position of the old token list.
+	 * @return The width, in pixels, of the part of the token list "removed
+	 *         from the front."  This way, you know the x-offset of the "new"
+	 *         token list.
+	 */
+	public static float makeTokenListStartAt(Token tokenList, int pos,
+									TabExpander e,
+									final RSyntaxTextArea textArea,
+									float x0) {
+
+		Token t = tokenList;
+
+		// Loop through the token list until you find the one that contains
+		// pos.  Remember the cumulative width of all of these tokens.
+		while (t!=null && t.isPaintable() && !t.containsPosition(pos)) {
+			x0 += t.getWidth(textArea, e, x0);
+			t = t.getNextToken();
+		}
+
+		// Make the token that contains pos start at pos.
+		if (t!=null && t.isPaintable() && t.offset!=pos) {
+			// Number of chars between p0 and token start.
+			int difference = pos - t.offset;
+			x0 += t.getWidthUpTo(t.textCount-difference+1, textArea, e, x0);
+			t.makeStartAt(pos);
+		}
+
+		// Make the passed-in token list point to the proper place.
+		// t can be null, for example, if line ends with unended MLC.
+		if (t!=null && t.isPaintable())
+			tokenList.copyFrom(t);
+		else
+			tokenList = null;
+		t = null;
+
+		// Return the x-offset (in pixels) of the newly-modified t.
+		return x0;
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token in JavaScript.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one in
+	 *         JavaScript.
+	 */
+	public static boolean regexCanFollowInJavaScript(Token t) {
+		char ch;
+		// We basically try to mimic Eclipse's JS editor's behavior here.
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='[' ||
+					ch=='!' ||
+					ch=='&'
+				)) ||
+				/* Operators "==", "===", "!=", "!==" */
+				(t.type==Token.OPERATOR &&
+						t.text[t.textOffset+t.textCount-1]=='=') ||
+				t.is(Token.RESERVED_WORD, JS_KEYWORD_RETURN);
+	}
+
+
+	/**
+	 * If the character is an upper-case US-ASCII letter, it returns the
+	 * lower-case version of that letter; otherwise, it just returns the
+	 * character.
+	 *
+	 * @param ch The character to lower-case (if it is a US-ASCII upper-case
+	 *        character).
+	 * @return The lower-case version of the character.
+	 */
+	public static final char toLowerCase(char ch) {
+		// We can logical OR with 32 because A-Z are 65-90 in the ASCII table
+		// and none of them have the 6th bit (32) set, and a-z are 97-122 in
+		// the ASCII table, which is 32 over from A-Z.
+		// We do it this way as we'd need to do two conditions anyway (first
+		// to check that ch<255 so it can index into our table, then whether
+		// that table position has the upper-case mask).
+		if (ch>='A' && ch<='Z')
+			return (char)(ch | 0x20);
+		return ch;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RTfToText.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RTfToText.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RTfToText.java	(revision 25584)
@@ -0,0 +1,224 @@
+/*
+ * 07/28/2008
+ *
+ * RtfToText.java - Returns the plain text version of RTF documents.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.*;
+
+
+/**
+ * Gets the plain text version of RTF documents.<p>
+ *
+ * This is used by <code>RtfTransferable</code> to return the plain text
+ * version of the transferable when the receiver does not support RTF.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RtfToText {
+
+	private Reader r;
+	private StringBuffer sb;
+	private StringBuffer controlWord;
+	private int blockCount;
+	private boolean inControlWord;
+
+
+	/**
+	 * Private constructor.
+	 *
+	 * @param r The reader to read RTF text from.
+	 */
+	private RtfToText(Reader r) {
+		this.r = r;
+		sb = new StringBuffer();
+		controlWord = new StringBuffer();
+		blockCount = 0;
+		inControlWord = false;
+	}
+
+
+	/**
+	 * Converts the RTF text read from this converter's <code>Reader</code>
+	 * into plain text.  It is the caller's responsibility to close the
+	 * reader after this method is called.
+	 *
+	 * @return The plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private String convert() throws IOException {
+
+		// Skip over first curly brace as the whole file is in '{' and '}'
+		int i = r.read();
+		if (i!='{') {
+			throw new IOException("Invalid RTF file");
+		}
+
+		while ((i=r.read())!=-1) {
+
+			char ch = (char)i;
+			switch (ch) {
+				case '{':
+					if (inControlWord && controlWord.length()==0) { // "\{"
+						sb.append('{');
+						controlWord.setLength(0);
+						inControlWord = false;
+					}
+					else {
+						blockCount++;
+					}
+					break;
+				case '}':
+					if (inControlWord && controlWord.length()==0) { // "\}"
+						sb.append('}');
+						controlWord.setLength(0);
+						inControlWord = false;
+					}
+					else {
+						blockCount--;
+					}
+					break;
+				case '\\':
+					if (blockCount==0) {
+						if (inControlWord) {
+							if (controlWord.length()==0) { // "\\"
+								sb.append('\\');
+								controlWord.setLength(0);
+								inControlWord = false;
+							}
+							else {
+								endControlWord();
+							}
+						}
+						inControlWord = true;
+					}
+					break;
+				case ' ':
+					if (blockCount==0) {
+						if (inControlWord) {
+							endControlWord();
+						}
+						else {
+							sb.append(' ');
+						}
+					}
+					break;
+				case '\r':
+				case '\n':
+					if (blockCount==0) {
+						if (inControlWord) {
+							endControlWord();
+						}
+						// Otherwise, ignore
+					}
+					break;
+				default:
+					if (blockCount==0) {
+						if (inControlWord) {
+							controlWord.append(ch);
+						}
+						else {
+							sb.append(ch);
+						}
+					}
+					break;
+			}
+
+		}
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Ends a control word.  Checks whether it is a common one that affects
+	 * the plain text output (such as "<code>par</code>" or "<code>tab</code>")
+	 * and updates the text buffer accordingly.
+	 */
+	private void endControlWord() {
+		String word = controlWord.toString();
+		if ("par".equals(word)) {
+			sb.append('\n');
+		}
+		else if ("tab".equals(word)) {
+			sb.append('\t');
+		}
+		controlWord.setLength(0);
+		inControlWord = false;
+	}
+
+
+	/**
+	 * Converts the contents of the specified byte array representing
+	 * an RTF document into plain text.
+	 *
+	 * @param rtf The byte array representing an RTF document.
+	 * @return The contents of the RTF document, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(byte[] rtf) throws IOException {
+		return getPlainText(new ByteArrayInputStream(rtf));
+	}
+
+
+	/**
+	 * Converts the contents of the specified RTF file to plain text.
+	 *
+	 * @param file The RTF file to convert.
+	 * @return The contents of the file, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(File file) throws IOException {
+		return getPlainText(new BufferedReader(new FileReader(file)));
+	}
+
+
+	/**
+	 * Converts the contents of the specified input stream to plain text.
+	 * The input stream will be closed when this method returns.
+	 *
+	 * @param in The input stream to convert.
+	 * @return The contents of the stream, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(InputStream in) throws IOException {
+		return getPlainText(new InputStreamReader(in, "US-ASCII"));
+	}
+
+
+	/**
+	 * Converts the contents of the specified <code>Reader</code> to plain text.
+	 *
+	 * @param r The <code>Reader</code>.
+	 * @return The contents of the <code>Reader</code>, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private static String getPlainText(Reader r) throws IOException {
+		try {
+			RtfToText  converter = new RtfToText(r);
+			return converter.convert();
+		} finally {
+			r.close();
+		}
+	}
+
+
+	/**
+	 * Converts the contents of the specified String to plain text.
+	 *
+	 * @param rtf A string whose contents represent an RTF document.
+	 * @return The contents of the String, in plain text.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static String getPlainText(String rtf) throws IOException {
+		return getPlainText(new StringReader(rtf));
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RtfGenerator.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RtfGenerator.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RtfGenerator.java	(revision 25584)
@@ -0,0 +1,541 @@
+/*
+ * 07/28/2008
+ *
+ * RtfGenerator.java - Generates RTF via a simple Java API.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.GraphicsEnvironment;
+import java.awt.Toolkit;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+ * Generates RTF text via a simple Java API.<p>
+ *
+ * The following RTF features are supported:
+ * <ul>
+ *    <li>Fonts
+ *    <li>Font sizes
+ *    <li>Foreground and background colors
+ *    <li>Bold, italic, and underline
+ * </ul>
+ *
+ * The RTF generated isn't really "optimized," but it will do, especially for
+ * small amounts of text, such as what's common when copy-and-pasting.  It
+ * tries to be sufficient for the use case of copying syntax highlighted
+ * code:
+ * <ul>
+ *    <li>It assumes that tokens changing foreground color often is fairly
+ *        common.
+ *    <li>It assumes that background highlighting is fairly uncommon.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RtfGenerator {
+
+	private List fontList;
+	private List colorList;
+	private StringBuffer document;
+	private boolean lastWasControlWord;
+	private int lastFontIndex;
+	private int lastFGIndex;
+	private boolean lastBold;
+	private boolean lastItalic;
+	private int lastFontSize;
+	private String monospacedFontName;
+
+	/**
+	 * Java2D assumes a 72 dpi screen resolution, but on Windows the screen
+	 * resolution is either 96 dpi or 120 dpi, depending on your font display
+	 * settings.  This is an attempt to make the RTF generated match the
+	 * size of what's displayed in the RSyntaxTextArea.
+	 */
+	private int screenRes;
+
+	/**
+	 * The default font size for RTF.  This is point size, in half
+	 * points.
+	 */
+	private static final int DEFAULT_FONT_SIZE = 12;//24;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RtfGenerator() {
+		fontList = new ArrayList(1); // Usually only 1.
+		colorList = new ArrayList(1); // Usually only 1.
+		document = new StringBuffer();
+		reset();
+	}
+
+
+	/**
+	 * Adds a newline to the RTF document.
+	 *
+	 * @see #appendToDoc(String, Font, Color, Color)
+	 */
+	public void appendNewline() {
+		document.append("\\par");
+		document.append('\n'); // Just for ease of reading RTF.
+		lastWasControlWord = false;
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param fg The foreground of the text.  If this is <code>null</code>,
+	 *        the default foreground color is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @see #appendNewline()
+	 */
+	public void appendToDoc(String text, Font f, Color fg, Color bg) {
+		appendToDoc(text, f, fg, bg, false);
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @param underline Whether the text should be underlined.
+	 * @see #appendNewline()
+	 */
+	public void appendToDocNoFG(String text, Font f, Color bg,
+							boolean underline) {
+		appendToDoc(text, f, null, bg, underline, false);
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param fg The foreground of the text.  If this is <code>null</code>,
+	 *        the default foreground color is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @param underline Whether the text should be underlined.
+	 * @see #appendNewline()
+	 */
+	public void appendToDoc(String text, Font f, Color fg, Color bg,
+							boolean underline) {
+		appendToDoc(text, f, fg, bg, underline, true);
+	}
+
+
+	/**
+	 * Appends styled text to the RTF document being generated.
+	 *
+	 * @param text The text to append.
+	 * @param f The font of the text.  If this is <code>null</code>, the
+	 *        default font is used.
+	 * @param fg The foreground of the text.  If this is <code>null</code>,
+	 *        the default foreground color is used.
+	 * @param bg The background color of the text.  If this is
+	 *        <code>null</code>, the default background color is used.
+	 * @param underline Whether the text should be underlined.
+	 * @param setFG Whether the foreground specified by <code>fg</code> should
+	 *        be honored (if it is non-<code>null</code>).
+	 * @see #appendNewline()
+	 */
+	public void appendToDoc(String text, Font f, Color fg, Color bg,
+							boolean underline, boolean setFG) {
+
+		if (text!=null) {
+
+			// Set font to use, if different from last addition.
+			int fontIndex = f==null ? 0 : (getFontIndex(fontList, f)+1);
+			if (fontIndex!=lastFontIndex) {
+				document.append("\\f").append(fontIndex);
+				lastFontIndex = fontIndex;
+				lastWasControlWord = true;
+			}
+
+			// Set styles to use.
+			if (f!=null) {
+				int fontSize = fixFontSize(f.getSize2D()); // Half points
+				if (fontSize!=lastFontSize) {
+					document.append("\\fs").append(fontSize);
+					lastFontSize = fontSize;
+					lastWasControlWord = true;
+				}
+				if (f.isBold()!=lastBold) {
+					document.append(lastBold ? "\\b0" : "\\b");
+					lastBold = !lastBold;
+					lastWasControlWord = true;
+				}
+				if (f.isItalic()!=lastItalic) {
+					document.append(lastItalic ? "\\i0" : "\\i");
+					lastItalic = !lastItalic;
+					lastWasControlWord = true;
+				}
+			}
+			else { // No font specified - assume neither bold nor italic.
+				if (lastFontSize!=DEFAULT_FONT_SIZE) {
+					document.append("\\fs").append(DEFAULT_FONT_SIZE);
+					lastFontSize = DEFAULT_FONT_SIZE;
+					lastWasControlWord = true;
+				}
+				if (lastBold) {
+					document.append("\\b0");
+					lastBold = false;
+					lastWasControlWord = true;
+				}
+				if (lastItalic) {
+					document.append("\\i0");
+					lastItalic = false;
+					lastWasControlWord = true;
+				}
+			}
+			if (underline) {
+				document.append("\\ul");
+				lastWasControlWord = true;
+			}
+
+			// Set the foreground color.
+			if (setFG) {
+				int fgIndex = 0;
+				if (fg!=null) { // null => fg color index 0
+					fgIndex = getIndex(colorList, fg)+1;
+				}
+				if (fgIndex!=lastFGIndex) {
+					document.append("\\cf").append(fgIndex);
+					lastFGIndex = fgIndex;
+					lastWasControlWord = true;
+				}
+			}
+
+			// Set the background color.
+			if (bg!=null) {
+				int pos = getIndex(colorList, bg);
+				document.append("\\highlight").append(pos+1);
+				lastWasControlWord = true;
+			}
+
+			if (lastWasControlWord) {
+				document.append(' '); // Delimiter
+				lastWasControlWord = false;
+			}
+			escapeAndAdd(document, text);
+
+			// Reset everything that was set for this text fragment.
+			if (bg!=null) {
+				document.append("\\highlight0");
+				lastWasControlWord = true;
+			}
+			if (underline) {
+				document.append("\\ul0");
+				lastWasControlWord = true;
+			}
+
+		}
+
+	}
+
+
+	/**
+	 * Appends some text to a buffer, with special care taken for special
+	 * characters as defined by the RTF spec:
+	 *
+	 * <ul>
+	 *   <li>All tab characters are replaced with the string
+	 *       "<code>\tab</code>"
+	 *   <li>'\', '{' and '}' are changed to "\\", "\{" and "\}"
+	 * </ul>
+	 *
+	 * @param text The text to append (with tab chars substituted).
+	 * @param sb The buffer to append to.
+	 */
+	private final void escapeAndAdd(StringBuffer sb, String text) {
+		// TODO: On the move to 1.5 use StringBuffer append() overloads that
+		// can take a CharSequence and a range of that CharSequence to speed
+		// things up.
+		//int last = 0;
+		int count = text.length();
+		for (int i=0; i<count; i++) {
+			char ch = text.charAt(i);
+			switch (ch) {
+				case '\t':
+					// Micro-optimization: for syntax highlighting with
+					// tab indentation, there are often multiple tabs
+					// back-to-back at the start of lines, so don't put
+					// spaces between each "\tab".
+					sb.append("\\tab");
+					while ((++i<count) && text.charAt(i)=='\t') {
+						sb.append("\\tab");
+					}
+					sb.append(' ');
+					i--; // We read one too far.
+					break;
+				case '\\':
+				case '{':
+				case '}':
+					sb.append('\\').append(ch);
+					break;
+				default:
+					sb.append(ch);
+					break;
+			}
+		}
+	}
+
+
+	/**
+	 * Returns a font point size adjusted for the current screen resolution.
+	 * Java2D assumes 72 dpi.  On systems with larger dpi (Windows, GTK, etc.),
+	 * font rendering will appear to small if we simply return a Java "Font"
+	 * object's getSize() value.  We need to adjust it for the screen
+	 * resolution.
+	 *
+	 * @param pointSize A Java Font's point size, as returned from
+	 *        <code>getSize2D()</code>.
+	 * @return The font point size, adjusted for the current screen resolution.
+	 *         This will allow other applications to render fonts the same
+	 *         size as they appear in the Java application.
+	 */
+	private int fixFontSize(float pointSize) {
+		if (screenRes!=72) { // Java2D assumes 72 dpi
+			pointSize = (int)Math.round(pointSize*screenRes/72.0);
+		}
+		return (int)pointSize;
+	}
+
+
+	private String getColorTableRtf() {
+
+		// Example:
+		// "{\\colortbl ;\\red255\\green0\\blue0;\\red0\\green0\\blue255; }"
+
+		StringBuffer sb = new StringBuffer();
+
+		sb.append("{\\colortbl ;");
+		for (int i=0; i<colorList.size(); i++) {
+			Color c = (Color)colorList.get(i);
+			sb.append("\\red").append(c.getRed());
+			sb.append("\\green").append(c.getGreen());
+			sb.append("\\blue").append(c.getBlue());
+			sb.append(';');
+		}
+		sb.append("}");
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the index of the specified font in a list of fonts.  This
+	 * method only checks for a font by its family name; its attributes such
+	 * as bold and italic are ignored.<p>
+	 *
+	 * If the font is not in the list, it is added, and its new index is
+	 * returned.
+	 *
+	 * @param list The list (possibly) containing the font.
+	 * @param font The font to get the index of.
+	 * @return The index of the font.
+	 */
+	private static int getFontIndex(List list, Font font) {
+		String fontName = font.getFamily();
+		for (int i=0; i<list.size(); i++) {
+			Font font2 = (Font)list.get(i);
+			if (font2.getFamily().equals(fontName)) {
+				return i;
+			}
+		}
+		list.add(font);
+		return list.size()-1;
+	}
+
+
+	private String getFontTableRtf() {
+
+		// Example:
+		// "{\\fonttbl{\\f0\\fmodern\\fcharset0 Courier;}}"
+
+		StringBuffer sb = new StringBuffer();
+
+		// Workaround for text areas using the Java logical font "Monospaced"
+		// by default.  There's no way to know what it's mapped to, so we
+		// just search for a monospaced font on the system.
+		String monoFamilyName = getMonospacedFontName();
+
+		sb.append("{\\fonttbl{\\f0\\fnil\\fcharset0 " + monoFamilyName + ";}");
+		for (int i=0; i<fontList.size(); i++) {
+			Font f = (Font)fontList.get(i);
+			String familyName = f.getFamily();
+			if (familyName.equals("Monospaced")) {
+				familyName = monoFamilyName;
+			}
+			sb.append("{\\f").append(i+1).append("\\fnil\\fcharset0 ");
+			sb.append(familyName).append(";}");
+		}
+		sb.append('}');
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the index of the specified item in a list.  If the item
+	 * is not in the list, it is added, and its new index is returned.
+	 *
+	 * @param list The list (possibly) containing the item.
+	 * @param item The item to get the index of.
+	 * @return The index of the item.
+	 */
+	private static int getIndex(List list, Object item) {
+		int pos = list.indexOf(item);
+		if (pos==-1) {
+			list.add(item);
+			pos = list.size()-1;
+		}
+		return pos;
+	}
+
+
+	/**
+	 * Try to pick a monospaced font installed on this system.  We try
+	 * to check for monospaced fonts that are commonly installed on
+	 * different OS's.  This information was gleaned from
+	 * http://www.codestyle.org/css/font-family/sampler-Monospace.shtml.
+	 *
+	 * @return The name of a monospaced font.
+	 */
+	private String getMonospacedFontName() {
+
+		if (monospacedFontName==null) {
+
+			GraphicsEnvironment ge = GraphicsEnvironment.
+									getLocalGraphicsEnvironment();
+			String[] familyNames = ge.getAvailableFontFamilyNames();
+			Arrays.sort(familyNames);
+			boolean windows = System.getProperty("os.name").toLowerCase().
+								indexOf("windows")>=0;
+
+			// "Monaco" is the "standard" monospaced font on OS X.  We'll
+			// check for it first so on Macs we don't get stuck with the
+			// uglier Courier New. It'll look funny on Windows though, so
+			// don't pick it if we're on Windows.
+			// It's found on Windows 1.76% of the time, OS X 96.73%
+			// of the time, and UNIX 00.00% (?) of the time.
+			if (!windows && Arrays.binarySearch(familyNames, "Monaco")>=0) {
+				monospacedFontName = "Monaco";
+			}
+
+			// "Courier New" is found on Windows 96.48% of the time,
+			// OS X 92.38% of the time, and UNIX 61.95% of the time.
+			else if (Arrays.binarySearch(familyNames, "Courier New")>=0) {
+				monospacedFontName = "Courier New";
+			}
+
+			// "Courier" is found on Windows ??.??% of the time,
+			// OS X 96.27% of the time, and UNIX 74.04% of the time.
+			else if (Arrays.binarySearch(familyNames, "Courier")>=0) {
+				monospacedFontName = "Courier";
+			}
+
+			// "Nimbus Mono L" is on Windows 00.00% (?) of the time,
+			// OS X 00.00% (?) of the time, but on UNIX 88.79% of the time.
+			else if (Arrays.binarySearch(familyNames, "Nimbus Mono L")>=0) {
+				monospacedFontName = "Nimbus Mono L";
+			}
+
+			// "Lucida Sans Typewriter" is on Windows 49.37% of the time,
+			// OS X 90.43% of the time, and UNIX 00.00% (?) of the time.
+			else if (Arrays.binarySearch(familyNames, "Lucida Sans Typewriter")>=0) {
+				monospacedFontName = "Lucida Sans Typewriter";
+			}
+
+			// "Bitstream Vera Sans Mono" is on Windows 29.81% of the time,
+			// OS X 25.53% of the time, and UNIX 80.71% of the time.
+			else if (Arrays.binarySearch(familyNames, "Bitstream Vera Sans Mono")>=0) {
+				monospacedFontName = "Bitstream Vera Sans Mono";
+			}
+
+			// Windows: 34.16% of the time, OS X: 00.00% (?) of the time,
+			// UNIX: 33.92% of the time.
+			if (monospacedFontName==null) {
+				monospacedFontName = "Terminal";
+			}
+
+		}
+
+		return monospacedFontName;
+
+	}
+
+
+	/**
+	 * Returns the RTF document created by this generator.
+	 *
+	 * @return The RTF document, as a <code>String</code>.
+	 */
+	public String getRtf() {
+
+		StringBuffer sb = new StringBuffer();
+		sb.append("{");
+
+		// Header
+		sb.append("\\rtf1\\ansi\\ansicpg1252");
+		sb.append("\\deff0"); // First font in font table is the default
+		sb.append("\\deflang1033");
+		sb.append("\\viewkind4");		// "Normal" view
+		sb.append("\\uc\\pard\\f0");
+		sb.append("\\fs20");			// Font size in half-points (default 24)
+		sb.append(getFontTableRtf()).append('\n');
+		sb.append(getColorTableRtf()).append('\n');
+
+		// Content
+		sb.append(document);
+
+		sb.append("}");
+
+		//System.err.println("*** " + sb.length());
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Resets this generator.  All document information and content is
+	 * cleared.
+	 */
+	public void reset() {
+		fontList.clear();
+		colorList.clear();
+		document.setLength(0);
+		lastWasControlWord = false;
+		lastFontIndex = 0;
+		lastFGIndex = 0;
+		lastBold = false;
+		lastItalic = false;
+		lastFontSize = DEFAULT_FONT_SIZE;
+		screenRes = Toolkit.getDefaultToolkit().getScreenResolution();
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RtfTransferable.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RtfTransferable.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/RtfTransferable.java	(revision 25584)
@@ -0,0 +1,91 @@
+/*
+ * 07/28/2008
+ *
+ * RtfTransferable.java - Used during drag-and-drop to represent RTF text.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.datatransfer.*;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+
+
+/**
+ * Object used during copy/paste and DnD operations to represent RTF text.
+ * It can return the text being moved as either RTF or plain text.  This
+ * class is basically the same as
+ * <code>java.awt.datatransfer.StringSelection</code>, except that it can also
+ * return the text as RTF.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RtfTransferable implements Transferable {
+
+	/**
+	 * The RTF data, in bytes (the RTF is 7-bit ascii).
+	 */
+	private byte[] data;
+
+
+	/**
+	 * The "flavors" the text can be returned as.
+	 */
+	private final DataFlavor[] FLAVORS = {
+		new DataFlavor("text/rtf", "RTF"),
+		DataFlavor.stringFlavor,
+		DataFlavor.plainTextFlavor // deprecated
+	};
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param data The RTF data.
+	 */
+	public RtfTransferable(byte[] data) {
+		this.data = data;
+	}
+
+
+	public Object getTransferData(DataFlavor flavor)
+					throws UnsupportedFlavorException, IOException {
+		if (flavor.equals(FLAVORS[0])) { // RTF
+			return new ByteArrayInputStream(data==null ? new byte[0] : data);
+		}
+		else if (flavor.equals(FLAVORS[1])) { // stringFlavor
+			return data==null ? "" : RtfToText.getPlainText(data);
+		}
+		else if (flavor.equals(FLAVORS[2])) { // plainTextFlavor (deprecated)
+			String text = ""; // Valid if data==null
+			if (data!=null) {
+				text = RtfToText.getPlainText(data);
+			}
+			return new StringReader(text);
+		}
+		else {
+			throw new UnsupportedFlavorException(flavor);
+		}
+	}
+
+
+	public DataFlavor[] getTransferDataFlavors() {
+		return (DataFlavor[])FLAVORS.clone();
+	}
+
+
+	public boolean isDataFlavorSupported(DataFlavor flavor) {
+		for (int i=0; i<FLAVORS.length; i++) {
+			if (flavor.equals(FLAVORS[i])) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java	(revision 25584)
@@ -0,0 +1,117 @@
+/*
+ * 09/13/2005
+ *
+ * SquiggleUnderlineHighlightPainter.java - Highlighter that draws a squiggle
+ * underline under "highlighted" text, similar to error markers in Microsoft
+ * Visual Studio or Eclipse.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * Highlight painter that paints a squiggly underline underneath text, similar
+ * to what popular IDE's such as Visual Studio and Eclipse do to indicate
+ * errors, warnings, etc.<p>
+ *
+ * This class must be used as a <code>LayerPainter</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class SquiggleUnderlineHighlightPainter
+				extends ChangeableColorHighlightPainter {
+
+	private static final int AMT			= 2;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param color The color of the squiggle.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public SquiggleUnderlineHighlightPainter(Color color) {
+		super(color);
+		setColor(color);
+	}
+
+
+	/**
+	 * Paints a portion of a highlight.
+	 *
+	 * @param g the graphics context
+	 * @param offs0 the starting model offset >= 0
+	 * @param offs1 the ending model offset >= offs1
+	 * @param bounds the bounding box of the view, which is not
+	 *        necessarily the region to paint.
+	 * @param c the editor
+	 * @param view View painting for
+	 * @return region drawing occurred in
+	 */
+	public Shape paintLayer(Graphics g, int offs0, int offs1,
+						Shape bounds, JTextComponent c, View view) {
+
+		g.setColor(getColor());
+
+		if (offs0 == view.getStartOffset() && offs1 == view.getEndOffset()) {
+			// Contained in view, can just use bounds.
+			Rectangle alloc;
+			if (bounds instanceof Rectangle)
+				alloc = (Rectangle)bounds;
+			else
+				alloc = bounds.getBounds();
+			paintSquiggle(g, alloc);
+			return alloc;
+		}
+
+		// Otherwise, should only render part of View.
+		try {
+			// --- determine locations ---
+			Shape shape = view.modelToView(offs0, Position.Bias.Forward,
+                                               offs1,Position.Bias.Backward,
+                                               bounds);
+			Rectangle r = (shape instanceof Rectangle) ?
+						(Rectangle)shape : shape.getBounds();
+			paintSquiggle(g, r);
+			return r;
+		} catch (BadLocationException e) {
+			e.printStackTrace(); // can't render
+		}
+
+		// Only if exception
+		return null;
+
+	}
+
+
+	/**
+	 * Paints a squiggle underneath text in the specified rectangle.
+	 *
+	 * @param g The graphics context with which to paint.
+	 * @param r The rectangle containing the text.
+	 */
+	protected void paintSquiggle(Graphics g, Rectangle r) {
+		int x = r.x;
+		int y = r.y + r.height - 1;
+		int delta = -AMT;
+		while (x<r.x+r.width) {
+			g.drawLine(x,y, x+AMT,y+delta);
+			y += delta;
+			delta = -delta;
+			x += AMT;
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Style.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Style.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Style.java	(revision 25584)
@@ -0,0 +1,192 @@
+/*
+ * 08/06/2004
+ *
+ * Style.java - A set of traits for a particular token type to use while
+ * painting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import javax.swing.JPanel;
+
+
+/**
+ * The color and style information for a token type.  Each token type in an
+ * <code>RSyntaxTextArea</code> has a corresponding <code>Style</code>; this
+ * <code>Style</code> tells us the following things:
+ *
+ * <ul>
+ *   <li>What foreground color to use for tokens of this type.</li>
+ *   <li>What background color to use.</li>
+ *   <li>The font to use.</li>
+ *   <li>Whether the token should be underlined.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class Style implements Cloneable {
+
+	public static final Color DEFAULT_FOREGROUND	= Color.BLACK;
+	public static final Color DEFAULT_BACKGROUND	= null;
+	public static final Font DEFAULT_FONT			= null;
+
+	public Color foreground;
+	public Color background;
+	public boolean underline;
+	public Font font;
+
+	FontMetrics fontMetrics;
+
+
+	/**
+	 * Creates a new style defaulting to black foreground, no
+	 * background, and no styling.
+	 */
+	public Style() {
+		this(DEFAULT_FOREGROUND);
+	}
+
+
+	/**
+	 * Creates a new style with the specified foreground and no styling.
+	 *
+	 * @param fg The foreground color to use.
+	 */
+	public Style(Color fg) {
+		this(fg, DEFAULT_BACKGROUND);
+	}
+
+
+	/**
+	 * Creates a new style with the specified colors and no styling.
+	 *
+	 * @param fg The foreground color to use.
+	 * @param bg The background color to use.
+	 */
+	public Style(Color fg, Color bg) {
+		this(fg, bg, DEFAULT_FONT);
+	}
+
+
+	/**
+	 * Creates a new style.
+	 *
+	 * @param fg The foreground color to use.
+	 * @param bg The background color to use.
+	 * @param font The font for this syntax scheme.
+	 */
+	public Style(Color fg, Color bg, Font font) {
+		this(fg, bg, font, false);
+	}
+
+
+	/**
+	 * Creates a new style.
+	 *
+	 * @param fg The foreground color to use.
+	 * @param bg The background color to use.
+	 * @param font The font for this syntax scheme.
+	 * @param underline Whether or not to underline tokens with this style.
+	 */
+	public Style(Color fg, Color bg, Font font, boolean underline) {
+		foreground = fg;
+		background = bg;
+		this.font = font;
+		this.underline = underline;
+		this.fontMetrics = font==null ? null :
+			new JPanel().getFontMetrics(font); // Default, no rendering hints!
+	}
+
+
+	/**
+	 * Returns whether or not two (possibly <code>null</code>) objects are
+	 * equal.
+	 */
+	private boolean areEqual(Object o1, Object o2) {
+		return (o1==null && o2==null) || (o1!=null && o1.equals(o2));
+	}
+
+
+	/**
+	 * Returns a deep copy of this object.
+	 *
+	 * @return The copy.
+	 */
+	public Object clone() {
+		Style clone = null;
+		try {
+			clone = (Style)super.clone();
+		} catch (CloneNotSupportedException cnse) { // Never happens
+			cnse.printStackTrace();
+			return null;
+		}
+		clone.foreground = foreground;
+		clone.background = background;
+		clone.font = font;
+		clone.underline = underline;
+		clone.fontMetrics = fontMetrics;
+		return clone;
+	}
+
+
+	/**
+	 * Returns whether or not two syntax schemes are equal.
+	 *
+	 * @param o2 The object with which to compare this syntax scheme.
+	 * @return Whether or not these two syntax schemes represent the same
+	 *         scheme.
+	 */
+	public boolean equals(Object o2) {
+		if (o2 instanceof Style) {
+			Style ss2 = (Style)o2;
+			if (this.underline==ss2.underline &&
+				areEqual(foreground, ss2.foreground) &&
+				areEqual(background, ss2.background) &&
+				areEqual(font, ss2.font) &&
+				areEqual(fontMetrics, ss2.fontMetrics))
+					return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Computes the hash code to use when adding this syntax scheme to
+	 * hash tables.<p>
+	 *
+	 * This method is implemented, since {@link #equals(Object)} is implemented,
+	 * to keep FindBugs happy.
+	 *
+	 * @return The hash code.
+	 */
+	public int hashCode() {
+		int hashCode = underline ? 1 : 0;
+		if (foreground!=null) {
+			hashCode ^= foreground.hashCode();
+		}
+		if (background!=null) {
+			hashCode ^= background.hashCode();
+		} 
+		return hashCode;
+	}
+
+
+	/**
+	 * Returns a string representation of this style.
+	 *
+	 * @return A string representation of this style.
+	 */
+	public String toString() {
+		return "[Style: foreground: " + foreground +
+			  ", background: " + background + ", underline: " +
+			  underline + ", font: " + font + "]";
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java	(revision 25584)
@@ -0,0 +1,235 @@
+/*
+ * 03/08/2004
+ *
+ * SyntaxConstants.java - Constants used by RSyntaxTextArea and friends.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * Constants that define the different programming languages understood by
+ * <code>RSyntaxTextArea</code>.  These constants are the values you can pass
+ * to {@link RSyntaxTextArea#setSyntaxEditingStyle(String)} to get syntax
+ * highlighting.<p>
+ *
+ * By default, all <code>RSyntaxTextArea</code>s can render all of these
+ * languages, but this can be changed (the list can be augmented or completely
+ * overwritten) on a per-text area basis.  What languages can be rendered is
+ * actually managed by the {@link TokenMakerFactory} installed on the text
+ * area's {@link RSyntaxDocument}.  By default, all
+ * <code>RSyntaxDocumenet</code>s have a factory installed capable of handling
+ * all of these languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface SyntaxConstants {
+
+	/**
+	 * Style meaning don't syntax highlight anything.
+	 */
+	public static final String SYNTAX_STYLE_NONE			= "text/plain";
+
+
+	/**
+	 * Style for highlighting ActionScript.
+	 */
+	public static final String SYNTAX_STYLE_ACTIONSCRIPT	= "text/actionscript";
+
+
+	/**
+	 * Style for highlighting x86 assembler.
+	 */
+	public static final String SYNTAX_STYLE_ASSEMBLER_X86	= "text/asm";
+
+
+	/**
+	 * Style for highlighting BBCode.
+	 */
+	public static final String SYNTAX_STYLE_BBCODE			= "text/bbcode";
+
+
+	/**
+	 * Style for highlighting C.
+	 */
+	public static final String SYNTAX_STYLE_C				= "text/c";
+
+
+	/**
+	 * Style for highlighting Clojure.
+	 */
+	public static final String SYNTAX_STYLE_CLOJURE			= "text/clojure";
+
+
+	/**
+	 * Style for highlighting C++.
+	 */
+	public static final String SYNTAX_STYLE_CPLUSPLUS		= "text/cpp";
+
+
+	/**
+	 * Style for highlighting C#.
+	 */
+	public static final String SYNTAX_STYLE_CSHARP			= "text/cs";
+
+
+	/**
+	 * Style for highlighting CSS.
+	 */
+	public static final String SYNTAX_STYLE_CSS			= "text/css";
+
+
+	/**
+	 * Style for highlighting Delphi/Pascal.
+	 */
+	public static final String SYNTAX_STYLE_DELPHI			= "text/delphi";
+
+
+	/**
+	 * Style for highlighting DTD files.
+	 */
+	public static final String SYNTAX_STYLE_DTD			= "text/dtd";
+
+
+	/**
+	 * Style for highlighting Fortran.
+	 */
+	public static final String SYNTAX_STYLE_FORTRAN			= "text/fortran";
+
+
+	/**
+	 * Style for highlighting Groovy.
+	 */
+	public static final String SYNTAX_STYLE_GROOVY			= "text/groovy";
+
+
+	/**
+	 * Style for highlighting HTML.
+	 */
+	public static final String SYNTAX_STYLE_HTML			= "text/html";
+
+
+	/**
+	 * Style for highlighting Java.
+	 */
+	public static final String SYNTAX_STYLE_JAVA			= "text/java";
+
+
+	/**
+	 * Style for highlighting JavaScript.
+	 */
+	public static final String SYNTAX_STYLE_JAVASCRIPT		= "text/javascript";
+
+
+	/**
+	 * Style for highlighting JSP.
+	 */
+	public static final String SYNTAX_STYLE_JSP			= "text/jsp";
+
+
+	/**
+	 * Style for highlighting LaTeX.
+	 */
+	public static final String SYNTAX_STYLE_LATEX		= "text/latex";
+
+
+	/**
+	 * Style for highlighting Lisp.
+	 */
+	public static final String SYNTAX_STYLE_LISP		= "text/lisp";
+
+
+	/**
+	 * Style for highlighting Lua.
+	 */
+	public static final String SYNTAX_STYLE_LUA			= "text/lua";
+
+
+	/**
+	 * Style for highlighting makefiles.
+	 */
+	public static final String SYNTAX_STYLE_MAKEFILE		= "text/makefile";
+
+
+	/**
+	 * Style for highlighting MXML.
+	 */
+	public static final String SYNTAX_STYLE_MXML			= "text/mxml";
+
+
+	/**
+	 * Style for highlighting Perl.
+	 */
+	public static final String SYNTAX_STYLE_PERL			= "text/perl";
+
+
+	/**
+	 * Style for highlighting PHP.
+	 */
+	public static final String SYNTAX_STYLE_PHP				= "text/php";
+
+
+	/**
+	 * Style for highlighting properties files.
+	 */
+	public static final String SYNTAX_STYLE_PROPERTIES_FILE	= "text/properties";
+
+
+	/**
+	 * Style for highlighting Python.
+	 */
+	public static final String SYNTAX_STYLE_PYTHON			= "text/python";
+
+
+	/**
+	 * Style for highlighting Ruby.
+	 */
+	public static final String SYNTAX_STYLE_RUBY			= "text/ruby";
+
+
+	/**
+	 * Style for highlighting SAS keywords.
+	 */
+	public static final String SYNTAX_STYLE_SAS			= "text/sas";
+
+
+	/**
+	 * Style for highlighting Scala.
+	 */
+	public static final String SYNTAX_STYLE_SCALA		= "text/scala";
+
+
+	/**
+	 * Style for highlighting SQL.
+	 */
+	public static final String SYNTAX_STYLE_SQL			= "text/sql";
+
+
+	/**
+	 * Style for highlighting Tcl.
+	 */
+	public static final String SYNTAX_STYLE_TCL			= "text/tcl";
+
+
+	/**
+	 * Style for highlighting UNIX shell keywords.
+	 */
+	public static final String SYNTAX_STYLE_UNIX_SHELL		= "text/unix";
+
+
+	/**
+	 * Style for highlighting Windows batch files.
+	 */
+	public static final String SYNTAX_STYLE_WINDOWS_BATCH	= "text/bat";
+
+
+	/**
+	 * Style for highlighting XML.
+	 */
+	public static final String SYNTAX_STYLE_XML			= "text/xml";
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java	(revision 25584)
@@ -0,0 +1,657 @@
+/*
+ * 02/26/2004
+ *
+ * SyntaxScheme.java - The set of colors and tokens used by an RSyntaxTextArea
+ * to color tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import javax.swing.text.StyleContext;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+
+/**
+ * The set of colors and styles used by an <code>RSyntaxTextArea</code> to
+ * color tokens.  You can use this class to programmatically set the fonts
+ * and colors used in an RSyntaxTextArea, but for more powerful, externalized
+ * control, consider using {@link Theme}s instead.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Theme
+ */
+public class SyntaxScheme implements Cloneable, TokenTypes {
+
+	private Style[] styles;
+
+	private static final String VERSION			= "*ver1";
+
+
+	/**
+	 * Creates a color scheme that either has all color values set to
+	 * a default value or set to <code>null</code>.
+	 *
+	 * @param useDefaults If <code>true</code>, all color values will
+	 *        be set to default colors; if <code>false</code>, all colors
+	 *        will be initially <code>null</code>.
+	 */
+	public SyntaxScheme(boolean useDefaults) {
+		styles = new Style[NUM_TOKEN_TYPES];
+		if (useDefaults) {
+			restoreDefaults(null);
+		}
+	}
+
+
+	/**
+	 * Creates a default color scheme.
+	 *
+	 * @param baseFont The base font to use.  Keywords will be a bold version
+	 *        of this font, and comments will be an italicized version of this
+	 *        font.
+	 */
+	public SyntaxScheme(Font baseFont) {
+		this(baseFont, true);
+	}
+
+
+	/**
+	 * Creates a default color scheme.
+	 *
+	 * @param baseFont The base font to use.  Keywords will be a bold version
+	 *        of this font, and comments will be an italicized version of this
+	 *        font.
+	 * @param fontStyles Whether bold and italic should be used in the scheme
+	 *        (vs. all tokens using a plain font).
+	 */
+	public SyntaxScheme(Font baseFont, boolean fontStyles) {
+		styles = new Style[NUM_TOKEN_TYPES];
+		restoreDefaults(baseFont, fontStyles);
+	}
+
+
+	/**
+	 * Changes the "base font" for this syntax scheme.  This is called by
+	 * <code>RSyntaxTextArea</code> when its font changes via
+	 * <code>setFont()</code>.  This looks for tokens that use a derivative of
+	 * the text area's old font (but bolded and/or italicized) and make them
+	 * use the new font with those stylings instead.  This is desirable because
+	 * most programmers prefer a single font to be used in their text editor,
+	 * but might want bold (say for keywords) or italics.
+	 *
+	 * @param old The old font of the text area.
+	 * @param font The new font of the text area.
+	 */
+	void changeBaseFont(Font old, Font font) {
+		for (int i=0; i<styles.length; i++) {
+			Style style = styles[i];
+			if (style!=null && style.font!=null) {
+				if (style.font.getFamily().equals(old.getFamily()) &&
+						style.font.getSize()==old.getSize()) {
+					int s = style.font.getStyle(); // Keep bold or italic
+					StyleContext sc = StyleContext.getDefaultStyleContext();
+					style.font= sc.getFont(font.getFamily(), s, font.getSize());
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Returns a deep copy of this color scheme.
+	 *
+	 * @return The copy.
+	 */
+	public Object clone() {
+		SyntaxScheme shcs = null;
+		try {
+			shcs = (SyntaxScheme)super.clone();
+		} catch (CloneNotSupportedException cnse) { // Never happens
+			cnse.printStackTrace();
+			return null;
+		}
+		shcs.styles = new Style[NUM_TOKEN_TYPES];
+		for (int i=0; i<NUM_TOKEN_TYPES; i++) {
+			Style s = styles[i];
+			if (s!=null) {
+				shcs.styles[i] = (Style)s.clone();
+			}
+		}
+		return shcs;
+	}
+
+
+	/**
+	 * Tests whether this color scheme is the same as another color scheme.
+	 *
+	 * @param otherScheme The color scheme to compare to.
+	 * @return <code>true</code> if this color scheme and
+	 *         <code>otherScheme</code> are the same scheme;
+	 *         <code>false</code> otherwise.
+	 */
+	public boolean equals(Object otherScheme) {
+
+		// No need for null check; instanceof takes care of this for us,
+		// i.e. "if (!(null instanceof Foo))" evaluates to "true".
+		if (!(otherScheme instanceof SyntaxScheme)) {
+			return false;
+		}
+
+		Style[] otherSchemes = ((SyntaxScheme)otherScheme).styles;
+
+		int length = styles.length;
+		for (int i=0; i<length; i++) {
+			if (styles[i]==null) {
+				if (otherSchemes[i]!=null) {
+					return false;
+				}
+			}
+			else if (!styles[i].equals(otherSchemes[i])) {
+				return false;
+			}
+		}
+		return true;
+
+	}
+
+
+	/**
+	 * Returns a hex string representing an RGB color, of the form
+	 * <code>"$rrggbb"</code>.
+	 *
+	 * @param c The color.
+	 * @return The string representation of the color.
+	 */
+	private static final String getHexString(Color c) {
+		return "$" + Integer.toHexString((c.getRGB() & 0xffffff)+0x1000000).
+									substring(1);
+	}
+
+
+	/**
+	 * Returns the specified style.
+	 *
+	 * @param index The index of the style.
+	 * @return The style.
+	 * @see #setStyle(int, Style)
+	 * @see #getStyleCount()
+	 */
+	public Style getStyle(int index) {
+		return styles[index];
+	}
+
+
+	/**
+	 * Returns the number of styles.
+	 *
+	 * @return The number of styles.
+	 * @see #getStyle(int)
+	 */
+	public int getStyleCount() {
+		return styles.length;
+	}
+
+
+	/**
+	 * This is implemented to be consistent with {@link #equals(Object)}.
+	 * This is a requirement to keep FindBugs happy.
+	 *
+	 * @return The hash code for this object.
+	 */
+	public int hashCode() {
+		// Keep me fast.  Iterating over *all* syntax schemes contained is
+		// probably much slower than a "bad" hash code here.
+		int hashCode = 0;
+		int count = styles.length;
+		for (int i=0; i<count; i++) {
+			if (styles[i]!=null) {
+				hashCode ^= styles[i].hashCode();
+				break;
+			}
+		}
+		return hashCode;
+	}
+
+
+	/**
+	 * Loads a syntax scheme from an input stream.
+	 *
+	 * @param baseFont The font to use as the "base" for the syntax scheme.
+	 *        If this is <code>null</code>, a default monospaced font is used.
+	 * @param in The stream to load from.  It is up to the caller to close this
+	 *        stream when they are done.
+	 * @return The syntax scheme.
+	 * @throws IOException If an IO error occurs.
+	 */
+	public static SyntaxScheme load(Font baseFont, InputStream in)
+									throws IOException {
+		if (baseFont==null) {
+			baseFont = RSyntaxTextArea.getDefaultFont();
+		}
+		return XmlParser.load(baseFont, in);
+	}
+
+
+	/**
+	 * Loads a syntax highlighting color scheme from a string created from
+	 * <code>toCommaSeparatedString</code>.  This method is useful for saving
+	 * and restoring color schemes.
+	 *
+	 * @param string A string generated from {@link #toCommaSeparatedString()}.
+	 * @return A color scheme.
+	 */
+	public static SyntaxScheme loadFromString(String string) {
+
+		SyntaxScheme scheme = new SyntaxScheme(true);
+
+		try {
+
+			if (string!=null) {
+
+				String[] tokens = string.split(",", -1);
+
+				// Check the version string, use defaults if incompatible
+				if (tokens.length==0 || !VERSION.equals(tokens[0])) {
+					return scheme; // Still set to defaults
+				}
+
+				int tokenTypeCount = NUM_TOKEN_TYPES;
+				int tokenCount = tokenTypeCount*7 + 1; // Version string
+				if (tokens.length!=tokenCount) {
+					throw new Exception(
+						"Not enough tokens in packed color scheme: expected " +
+						tokenCount + ", found " + tokens.length);
+				}
+
+				// Loop through each token style.  Format:
+				// "index,(fg|-),(bg|-),(t|f),((font,style,size)|(-,,))"
+				for (int i=0; i<tokenTypeCount; i++) {
+
+					int pos = i*7 + 1;
+					int integer = Integer.parseInt(tokens[pos]); // == i
+					if (integer!=i)
+						throw new Exception("Expected " + i + ", found " +
+											integer);
+
+					Color fg = null; String temp = tokens[pos+1];
+					if (!"-".equals(temp)) { // "-" => keep fg as null
+						fg = stringToColor(temp);
+					}
+					Color bg = null; temp = tokens[pos+2];
+					if (!"-".equals(temp)) { // "-" => keep bg as null
+						bg = stringToColor(temp);
+					}
+
+					// Check for "true" or "false" since we don't want to
+					// accidentally suck in an int representing the next
+					// packed color, and any string != "true" means false.
+					temp = tokens[pos+3];
+					if (!"t".equals(temp) && !"f".equals(temp))
+						throw new Exception("Expected 't' or 'f', found " + temp);
+					boolean underline = "t".equals(temp);
+
+					Font font = null;
+					String family = tokens[pos+4];
+					if (!"-".equals(family)) {
+						font = new Font(family,
+							Integer.parseInt(tokens[pos+5]),	// style
+							Integer.parseInt(tokens[pos+6]));	// size
+					}
+					scheme.styles[i] = new Style(fg, bg, font, underline);
+
+				}
+
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return scheme;
+
+	}
+
+
+	void refreshFontMetrics(Graphics2D g2d) {
+		// It is assumed that any rendering hints are already applied to g2d.
+		for (int i=0; i<styles.length; i++) {
+			Style s = styles[i];
+			if (s!=null) {
+				s.fontMetrics = s.font==null ? null :
+								g2d.getFontMetrics(s.font);
+			}
+		}
+	}
+
+
+	/**
+	 * Restores all colors and fonts to their default values.
+	 *
+	 * @param baseFont The base font to use when creating this scheme.  If
+	 *        this is <code>null</code>, then a default monospaced font is
+	 *        used.
+	 */
+	public void restoreDefaults(Font baseFont) {
+		restoreDefaults(baseFont, true);
+	}
+
+
+	/**
+	 * Restores all colors and fonts to their default values.
+	 *
+	 * @param baseFont The base font to use when creating this scheme.  If
+	 *        this is <code>null</code>, then a default monospaced font is
+	 *        used.
+	 * @param fontStyles Whether bold and italic should be used in the scheme
+	 *        (vs. all tokens using a plain font).
+	 */
+	public void restoreDefaults(Font baseFont, boolean fontStyles) {
+
+		// Colors used by tokens.
+		Color comment			= new Color(0,128,0);
+		Color docComment		= new Color(164,0,0);
+		Color keyword			= Color.BLUE;
+		Color function			= new Color(173,128,0);
+		Color preprocessor		= new Color(128,64,64);
+		Color regex				= new Color(0,128,164);
+		Color variable			= new Color(255,153,0);
+		Color literalNumber		= new Color(100,0,200);
+		Color literalString		= new Color(220,0,156);
+		Color error			= new Color(148,148,0);
+
+		// (Possible) special font styles for keywords and comments.
+		if (baseFont==null) {
+			baseFont = RSyntaxTextArea.getDefaultFont();
+		}
+		Font commentFont = baseFont;
+		Font keywordFont = baseFont;
+		if (fontStyles) {
+			// WORKAROUND for Sun JRE bug 6282887 (Asian font bug in 1.4/1.5)
+			StyleContext sc = StyleContext.getDefaultStyleContext();
+			Font boldFont = sc.getFont(baseFont.getFamily(), Font.BOLD,
+					baseFont.getSize());
+			Font italicFont = sc.getFont(baseFont.getFamily(), Font.ITALIC,
+					baseFont.getSize());
+			commentFont = italicFont;//baseFont.deriveFont(Font.ITALIC);
+			keywordFont = boldFont;//baseFont.deriveFont(Font.BOLD);
+		}
+
+		styles[COMMENT_EOL]				= new Style(comment, null, commentFont);
+		styles[COMMENT_MULTILINE]			= new Style(comment, null, commentFont);
+		styles[COMMENT_DOCUMENTATION]		= new Style(docComment, null, commentFont);
+		styles[COMMENT_KEYWORD]			= new Style(new Color(255,152,0), null, commentFont);
+		styles[COMMENT_MARKUP]			= new Style(Color.gray, null, commentFont);
+		styles[RESERVED_WORD]				= new Style(keyword, null, keywordFont);
+		styles[RESERVED_WORD_2]			= new Style(keyword, null, keywordFont);
+		styles[FUNCTION]					= new Style(function);
+		styles[LITERAL_BOOLEAN]			= new Style(literalNumber);
+		styles[LITERAL_NUMBER_DECIMAL_INT]	= new Style(literalNumber);
+		styles[LITERAL_NUMBER_FLOAT]		= new Style(literalNumber);
+		styles[LITERAL_NUMBER_HEXADECIMAL]	= new Style(literalNumber);
+		styles[LITERAL_STRING_DOUBLE_QUOTE]	= new Style(literalString);
+		styles[LITERAL_CHAR]				= new Style(literalString);
+		styles[LITERAL_BACKQUOTE]			= new Style(literalString);
+		styles[DATA_TYPE]				= new Style(new Color(0,128,128));
+		styles[VARIABLE]					= new Style(variable);
+		styles[REGEX]						= new Style(regex);
+		styles[ANNOTATION]				= new Style(Color.gray);
+		styles[IDENTIFIER]				= new Style(null);
+		styles[WHITESPACE]				= new Style(Color.gray);
+		styles[SEPARATOR]				= new Style(Color.RED);
+		styles[OPERATOR]					= new Style(preprocessor);
+		styles[PREPROCESSOR]				= new Style(Color.gray);
+		styles[MARKUP_TAG_DELIMITER]		= new Style(Color.RED);
+		styles[MARKUP_TAG_NAME]			= new Style(Color.BLUE);
+		styles[MARKUP_TAG_ATTRIBUTE]		= new Style(new Color(63,127,127));
+		styles[MARKUP_TAG_ATTRIBUTE_VALUE]= new Style(literalString);
+		styles[MARKUP_PROCESSING_INSTRUCTION] = new Style(preprocessor);
+		styles[MARKUP_CDATA]				= new Style(variable);
+		styles[ERROR_IDENTIFIER]			= new Style(error);
+		styles[ERROR_NUMBER_FORMAT]		= new Style(error);
+		styles[ERROR_STRING_DOUBLE]		= new Style(error);
+		styles[ERROR_CHAR]				= new Style(error);
+
+	}
+
+
+	/**
+	 * Sets a style to use when rendering a token type.
+	 *
+	 * @param type The token type.
+	 * @param style The style for the token type.
+	 * @see #getStyle(int)
+	 */
+	public void setStyle(int type, Style style) {
+		styles[type] = style;
+	}
+
+
+	/**
+	 * Returns the color represented by a string.  If the first char in the
+	 * string is '<code>$</code>', it is assumed to be in hex, otherwise it is
+	 * assumed to be decimal.  So, for example, both of these:
+	 * <pre>
+	 * "$00ff00"
+	 * "65280"
+	 * </pre>
+	 * will return <code>new Color(0, 255, 0)</code>.
+	 *
+	 * @param s The string to evaluate.
+	 * @return The color.
+	 */
+	private static final Color stringToColor(String s) {
+		// Check for decimal as well as hex, for backward
+		// compatibility (fix from GwynEvans on forums)
+		char ch = s.charAt(0);
+		return new Color((ch=='$' || ch=='#') ?
+				Integer.parseInt(s.substring(1),16) :
+				Integer.parseInt(s));
+	}
+
+
+	/**
+	 * Returns this syntax highlighting scheme as a comma-separated list of
+	 * values as follows:
+	 * <ul>
+	 *   <li>If a color is non-null, it is added as a 24-bit integer
+	 *      of the form <code>((r<<16) | (g<<8) | (b))</code>; if it is
+	 *       <code>null</code>, it is added as "<i>-,</i>".
+	 *   <li>The font and style (bold/italic) is added as an integer like so:
+	 *       "<i>family,</i> <i>style,</i> <i>size</i>".
+	 *   <li>The entire syntax highlighting scheme is thus one long string of
+	 *       color schemes of the format "<i>i,[fg],[bg],uline,[style]</i>,
+	 *       where:
+	 *       <ul>
+	 *          <li><code>i</code> is the index of the syntax scheme.
+	 *          <li><i>fg</i> and <i>bg</i> are the foreground and background
+	 *              colors for the scheme, and may be null (represented by 
+	 *              <code>-</code>).
+	 *          <li><code>uline</code> is whether or not the font should be
+	 *              underlined, and is either <code>t</code> or <code>f</code>.
+	 *          <li><code>style</code> is the <code>family,style,size</code>
+	 *              triplet described above.
+	 *       </ul>
+	 * </ul>
+	 *
+	 * @return A string representing the rgb values of the colors.
+	 */
+	public String toCommaSeparatedString() {
+
+		StringBuffer sb = new StringBuffer(VERSION);
+		sb.append(',');
+
+		for (int i=0; i<NUM_TOKEN_TYPES; i++) {
+
+			sb.append(i).append(',');
+
+			Style ss = styles[i];
+			if (ss==null) { // Only true for i==0 (NULL token)
+				sb.append("-,-,f,-,,,");
+				continue;
+			}
+
+			Color c = ss.foreground;
+			sb.append(c!=null ? (getHexString(c) + ",") : "-,");
+			c = ss.background;
+			sb.append(c!=null ? (getHexString(c) + ",") : "-,");
+
+			sb.append(ss.underline ? "t," : "f,");
+
+			Font font = ss.font;
+			if (font!=null) {
+				sb.append(font.getFamily()).append(',').
+					append(font.getStyle()).append(',').
+						append(font.getSize()).append(',');
+			}
+			else {
+				sb.append("-,,,");
+			}
+
+		}
+
+		return sb.substring(0,sb.length()-1); // Take off final ','.
+
+	}
+
+
+	/**
+	 * Loads a <code>SyntaxScheme</code> from an XML file.
+	 */
+	private static class XmlParser extends DefaultHandler {
+
+		private Font baseFont;
+		private SyntaxScheme scheme;
+
+		public XmlParser(Font baseFont) {
+			scheme = new SyntaxScheme(baseFont);
+		}
+
+		/**
+		 * Creates the XML reader to use.  Note that in 1.4 JRE's, the reader
+		 * class wasn't defined by default, but in 1.5+ it is.
+		 *
+		 * @return The XML reader to use.
+		 */
+		private static XMLReader createReader() throws IOException {
+			XMLReader reader = null;
+			try {
+				reader = XMLReaderFactory.createXMLReader();
+			} catch (SAXException e) {
+				// Happens in JRE 1.4.x; 1.5+ define the reader class properly
+				try {
+					reader = XMLReaderFactory.createXMLReader(
+							"org.apache.crimson.parser.XMLReaderImpl");
+				} catch (SAXException se) {
+					throw new IOException(se.toString());
+				}
+			}
+			return reader;
+		}
+
+		public static SyntaxScheme load(Font baseFont,
+										InputStream in) throws IOException {
+			XMLReader reader = createReader();
+			XmlParser parser = new XmlParser(baseFont);
+			parser.baseFont = baseFont;
+			reader.setContentHandler(parser);
+			InputSource is = new InputSource(in);
+			is.setEncoding("UTF-8");
+			try {
+				reader.parse(is);
+			} catch (SAXException se) {
+				throw new IOException(se.toString());
+			}
+			return parser.scheme;
+		}
+
+		public void startElement(String uri, String localName, String qName,
+								Attributes attrs) {
+
+			if ("style".equals(qName)) {
+
+				String type = attrs.getValue("token");
+				Field field = null;
+				try {
+					field = Token.class.getField(type);
+				} catch (RuntimeException re) {
+					throw re; // FindBugs
+				} catch (Exception e) {
+					System.err.println("Invalid token type: " + type);
+					return;
+				}
+
+				if (field.getType()==int.class) {
+
+					int index = 0;
+					try {
+						index = field.getInt(scheme);
+					} catch (IllegalArgumentException e) {
+						e.printStackTrace();
+						return;
+					} catch (IllegalAccessException e) {
+						e.printStackTrace();
+						return;
+					}
+
+					String fgStr = attrs.getValue("fg");
+					if (fgStr!=null) {
+						Color fg = stringToColor(fgStr);
+						scheme.styles[index].foreground = fg;
+					}
+
+					String bgStr = attrs.getValue("bg");
+					if (bgStr!=null) {
+						Color bg = stringToColor(bgStr);
+						scheme.styles[index].background = bg;
+					}
+
+					boolean styleSpecified = false;
+					boolean bold = false;
+					boolean italic = false;
+					String boldStr = attrs.getValue("bold");
+					if (boldStr!=null) {
+						bold = Boolean.valueOf(boldStr).booleanValue();
+						styleSpecified = true;
+					}
+					String italicStr = attrs.getValue("italic");
+					if (italicStr!=null) {
+						italic = Boolean.valueOf(italicStr).booleanValue();
+						styleSpecified = true;
+					}
+					if (styleSpecified) {
+						int style = 0;
+						if (bold) { style |= Font.BOLD; }
+						if (italic) { style |= Font.ITALIC; }
+						scheme.styles[index].font = baseFont.deriveFont(style);
+					}
+
+					String ulineStr = attrs.getValue("underline");
+					if (ulineStr!=null) {
+						boolean uline= Boolean.valueOf(ulineStr).booleanValue();
+						scheme.styles[index].underline = uline;
+					}
+
+				}
+
+			}
+
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxView.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxView.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/SyntaxView.java	(revision 25584)
@@ -0,0 +1,872 @@
+/*
+ * 02/24/2004
+ *
+ * SyntaxView.java - The View object used by RSyntaxTextArea when word wrap is
+ * disabled.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The <code>javax.swing.text.View</code> object used by {@link RSyntaxTextArea}
+ * when word wrap is disabled.  It implements syntax highlighting for
+ * programming languages using the colors and font styles specified by the
+ * <code>RSyntaxTextArea</code>.<p>
+ *
+ * You don't really have to do anything to use this class, as
+ * {@link RSyntaxTextAreaUI} automatically sets the text area's view to be
+ * an instance of this class if word wrap is disabled.<p>
+ *
+ * The tokens that specify how to paint the syntax-highlighted text are gleaned
+ * from the text area's {@link RSyntaxDocument}.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+public class SyntaxView extends View implements TabExpander,
+											TokenOrientedView, RSTAView {
+
+	/**
+	 * The default font used by the text area.  If this changes we need to
+	 * recalculate the longest line.
+	 */
+	Font font;
+
+	/**
+	 * Font metrics for the current font.
+	 */
+	protected FontMetrics metrics;
+
+	/**
+	 * The current longest line.  This is used to calculate the preferred width
+	 * of the view.  Since the calculation is potentially expensive, we try to
+	 * avoid it by stashing which line is currently the longest.
+	 */
+	Element longLine;
+	float longLineWidth;
+
+	private int tabSize;
+	protected int tabBase;
+    
+
+	/**
+	 * Cached for each paint() call so each drawLine() call has access to it.
+	 */
+	private RSyntaxTextArea host;
+
+	/**
+	 * Cached values to speed up the painting a tad.
+	 */
+	private int lineHeight = 0;
+	private int ascent;
+	private int clipStart;
+	private int clipEnd;
+
+//	/**
+//	 * The end-of-line marker.
+//	 */
+//	private static final char[] eolMarker = { '.' };
+
+
+	/**
+	 * Constructs a new <code>SyntaxView</code> wrapped around an element.
+	 *
+	 * @param elem The element representing the text to display.
+	 */
+	public SyntaxView(Element elem) {
+		super(elem);
+	}
+
+
+	/**
+	 * Iterate over the lines represented by the child elements
+	 * of the element this view represents, looking for the line
+	 * that is the longest.  The <em>longLine</em> variable is updated to
+	 * represent the longest line contained.  The <em>font</em> variable
+	 * is updated to indicate the font used to calculate the 
+	 * longest line.
+	 */
+	void calculateLongestLine() {
+		Component c = getContainer();
+		font = c.getFont();
+		metrics = c.getFontMetrics(font);
+		tabSize = getTabSize() * metrics.charWidth(' ');
+		Element lines = getElement();
+		int n = lines.getElementCount();
+		for (int i=0; i<n; i++) {
+			Element line = lines.getElement(i);
+			float w = getLineWidth(i);
+			if (w > longLineWidth) {
+				longLineWidth = w;
+				longLine = line;
+			}
+		}
+	}
+
+
+	/**
+	 * Gives notification from the document that attributes were changed
+	 * in a location that this view is responsible for.
+	 *
+	 * @param changes the change information from the associated document
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#changedUpdate
+	 */
+	public void changedUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateDamage(changes, a, f);
+	}
+
+
+	/**
+	 * Repaint the given line range.
+	 *
+	 * @param line0 The starting line number to repaint.  This must
+	 *   be a valid line number in the model.
+	 * @param line1 The ending line number to repaint.  This must
+	 *   be a valid line number in the model.
+	 * @param a  The region allocated for the view to render into.
+	 * @param host The component hosting the view (used to call repaint).
+	 */
+	protected void damageLineRange(int line0, int line1, Shape a,
+												Component host) {
+		if (a != null) {
+			Rectangle area0 = lineToRect(a, line0);
+			Rectangle area1 = lineToRect(a, line1);
+			if ((area0 != null) && (area1 != null)) {
+				Rectangle dmg = area0.union(area1); // damage.
+				host.repaint(dmg.x, dmg.y, dmg.width, dmg.height);
+			}
+			else
+				host.repaint();
+		}
+	}
+
+
+	/**
+	 * Draws the passed-in text using syntax highlighting for the current
+	 * language.  The tokens used to decide how to paint the syntax
+	 * highlighting are grabbed from the text area's document.
+	 *
+	 * @param token The list of tokens to draw.
+	 * @param g The graphics context in which to draw.
+	 * @param x The x-coordinate at which to draw.
+	 * @param y The y-coordinate at which to draw.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public float drawLine(Token token, Graphics2D g, float x, float y) {
+
+		float nextX = x;	// The x-value at the end of our text.
+
+		while (token!=null && token.isPaintable() && nextX<clipEnd) {
+			nextX = token.paint(g, nextX,y, host, this, clipStart);
+			token = token.getNextToken();
+		}
+
+		// NOTE: We should re-use code from Token (paintBackground()) here,
+		// but don't because I'm just too lazy.
+		if (host.getEOLMarkersVisible()) {
+			g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+			g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+			g.drawString("\u00B6", nextX, y);
+		}
+
+		// Return the x-coordinate at the end of the painted text.
+		return nextX;
+
+	}
+
+
+	/**
+	 * Calculates the width of the line represented by the given element.
+	 *
+	 * @param line The line for which to get the length.
+	 * @param lineNumber The line number of the specified line in the document.
+	 * @return The width of the line.
+	 */
+	private float getLineWidth(int lineNumber) {
+		Token tokenList = ((RSyntaxDocument)getDocument()).
+									getTokenListForLine(lineNumber);
+		return RSyntaxUtilities.getTokenListWidth(tokenList,
+								(RSyntaxTextArea)getContainer(),
+								this);
+	}
+
+
+	/**
+	 * Provides a way to determine the next visually represented model 
+	 * location that one might place a caret.  Some views may not be visible,
+	 * they might not be in the same order found in the model, or they just
+	 * might not allow access to some of the locations in the model.
+	 *
+	 * @param pos the position to convert >= 0
+	 * @param a the allocated region to render into
+	 * @param direction the direction from the current position that can
+	 *  be thought of as the arrow keys typically found on a keyboard.
+	 *  This may be SwingConstants.WEST, SwingConstants.EAST, 
+	 *  SwingConstants.NORTH, or SwingConstants.SOUTH.  
+	 * @return the location within the model that best represents the next
+	 *  location visual position.
+	 * @exception BadLocationException
+	 * @exception IllegalArgumentException for an invalid direction
+	 */
+	public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a, 
+							int direction, Position.Bias[] biasRet)
+							throws BadLocationException {
+		return RSyntaxUtilities.getNextVisualPositionFrom(pos, b, a,
+										direction, biasRet, this);
+	}
+
+
+	/**
+	 * Determines the preferred span for this view along an
+	 * axis.
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return   the span the view would like to be rendered into >= 0.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @exception IllegalArgumentException for an invalid axis
+	 */
+	public float getPreferredSpan(int axis) {
+		updateMetrics();
+		switch (axis) {
+			case View.X_AXIS:
+				float span = longLineWidth + 10; // "fudge factor."
+				if (host.getEOLMarkersVisible()) {
+					span += metrics.charWidth('\u00B6');
+				}
+				return span;
+			case View.Y_AXIS:
+				// We update lineHeight here as when this method is first
+				// called, lineHeight isn't initialized.  If we don't do it
+				// here, we get no vertical scrollbar (as lineHeight==0).
+				lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+//				return getElement().getElementCount() * lineHeight;
+int visibleLineCount = getElement().getElementCount();
+if (host.isCodeFoldingEnabled()) {
+	visibleLineCount -= host.getFoldManager().getHiddenLineCount();
+}
+return visibleLineCount * lineHeight;
+			default:
+				throw new IllegalArgumentException("Invalid axis: " + axis);
+		}
+	}
+
+
+	/**
+	 * Returns the tab size set for the document, defaulting to 5.
+	 *
+	 * @return The tab size.
+	 */
+	protected int getTabSize() {
+		Integer i = (Integer)getDocument().getProperty(
+									PlainDocument.tabSizeAttribute);
+		int size = (i != null) ? i.intValue() : 5;
+		return size;
+	}
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line above the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * this plain (non-wrapped) view, this is simply the token list for the
+	 * logical line above the line containing <code>offset</code>, since lines
+	 * are not wrapped.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         before this one.  If <code>offset</code> is in the first line in
+	 *         the document, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineAbove(int offset) {
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+		Element map = document.getDefaultRootElement();
+int line = map.getElementIndex(offset);
+FoldManager fm = host.getFoldManager();
+if (fm==null) {
+	line--;
+	if (line>=0) {
+		return document.getTokenListForLine(line);
+	}
+}
+else {
+	line = fm.getVisibleLineAbove(line);
+	if (line>=0) {
+		return document.getTokenListForLine(line);
+	}
+}
+//		int line = map.getElementIndex(offset) - 1;
+//		if (line>=0)
+//			return document.getTokenListForLine(line);
+		return null;
+	}
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line below the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * this plain (non-wrapped) view, this is simply the token list for the
+	 * logical line below the line containing <code>offset</code>, since lines
+	 * are not wrapped.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         after this one.  If <code>offset</code> is in the last physical
+	 *         line in the document, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineBelow(int offset) {
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+		Element map = document.getDefaultRootElement();
+		int lineCount = map.getElementCount();
+int line = map.getElementIndex(offset);
+if (!host.isCodeFoldingEnabled()) {
+	if (line<lineCount-1) {
+		return document.getTokenListForLine(line+1);
+	}
+}
+else {
+	FoldManager fm = host.getFoldManager();
+	line = fm.getVisibleLineBelow(line);
+	if (line>=0 && line<lineCount) {
+		return document.getTokenListForLine(line);
+	}
+}
+//		int line = map.getElementIndex(offset);
+//		int lineCount = map.getElementCount();
+//		if (line<lineCount-1)
+//			return document.getTokenListForLine(line+1);
+		return null;
+	}
+
+
+	/**
+	 * Gives notification that something was inserted into the document
+	 * in a location that this view is responsible for.
+	 *
+	 * @param changes The change information from the associated document.
+	 * @param a The current allocation of the view.
+	 * @param f The factory to use to rebuild if the view has children.
+	 */
+	public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateDamage(changes, a, f);
+	}
+
+
+	/**
+	 * Determine the rectangle that represents the given line.
+	 *
+	 * @param a The region allocated for the view to render into
+	 * @param line The line number to find the region of.  This must
+	 *        be a valid line number in the model.
+	 */
+	protected Rectangle lineToRect(Shape a, int line) {
+		Rectangle r = null;
+		updateMetrics();
+		if (metrics != null) {
+			Rectangle alloc = a.getBounds();
+			// NOTE:  lineHeight is not initially set here, leading to the
+			// current line not being highlighted when a document is first
+			// opened.  So, we set it here just in case.
+			lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+if (host.isCodeFoldingEnabled()) {
+	FoldManager fm = host.getFoldManager();
+	int hiddenCount = fm.getHiddenLineCountAbove(line);
+	line -= hiddenCount;
+}
+			r = new Rectangle(alloc.x, alloc.y + line*lineHeight,
+									alloc.width, lineHeight);
+		}
+		return r;
+	}
+
+
+	/**
+	 * Provides a mapping from the document model coordinate space
+	 * to the coordinate space of the view mapped to it.
+	 *
+	 * @param pos the position to convert >= 0
+	 * @param a the allocated region to render into
+	 * @return the bounding box of the given position
+	 * @exception BadLocationException  if the given position does not
+	 *   represent a valid location in the associated document
+	 * @see View#modelToView
+	 */
+	public Shape modelToView(int pos, Shape a, Position.Bias b)
+										throws BadLocationException {
+
+		// line coordinates
+		Element map = getElement();
+		RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+		int lineIndex = map.getElementIndex(pos);
+		Token tokenList = doc.getTokenListForLine(lineIndex);
+		Rectangle lineArea = lineToRect(a, lineIndex);
+		tabBase = lineArea.x; // Used by listOffsetToView().
+
+		//int x = (int)RSyntaxUtilities.getTokenListWidthUpTo(tokenList,
+		//							(RSyntaxTextArea)getContainer(),
+		//							this, 0, pos);
+		// We use this method instead as it returns the actual bounding box,
+		// not just the x-coordinate.
+		lineArea = tokenList.listOffsetToView(
+						(RSyntaxTextArea)getContainer(), this, pos,
+						tabBase, lineArea);
+
+		return lineArea;
+
+	}
+
+
+	/**
+	 * Provides a mapping, for a given region, from the document model
+	 * coordinate space to the view coordinate space. The specified region is
+	 * created as a union of the first and last character positions.<p>
+	 *
+	 * This is implemented to subtract the width of the second character, as
+	 * this view's <code>modelToView</code> actually returns the width of the
+	 * character instead of "1" or "0" like the View implementations in
+	 * <code>javax.swing.text</code>.  Thus, if we don't override this method,
+	 * the <code>View</code> implementation will return one character's width
+	 * too much for its consumers (implementations of
+	 * <code>javax.swing.text.Highlighter</code>).
+	 *
+	 * @param p0 the position of the first character (>=0)
+	 * @param b0 The bias of the first character position, toward the previous
+	 *        character or the next character represented by the offset, in
+	 *        case the position is a boundary of two views; <code>b0</code>
+	 *        will have one of these values:
+	 * <ul>
+	 *    <li> <code>Position.Bias.Forward</code>
+	 *    <li> <code>Position.Bias.Backward</code>
+	 * </ul>
+	 * @param p1 the position of the last character (>=0)
+	 * @param b1 the bias for the second character position, defined
+	 *		one of the legal values shown above
+	 * @param a the area of the view, which encompasses the requested region
+	 * @return the bounding box which is a union of the region specified
+	 *		by the first and last character positions
+	 * @exception BadLocationException  if the given position does
+	 *   not represent a valid location in the associated document
+	 * @exception IllegalArgumentException if <code>b0</code> or
+	 *		<code>b1</code> are not one of the
+	 *		legal <code>Position.Bias</code> values listed above
+	 * @see View#viewToModel
+	 */
+	public Shape modelToView(int p0, Position.Bias b0,
+							int p1, Position.Bias b1,
+							Shape a) throws BadLocationException {
+
+		Shape s0 = modelToView(p0, a, b0);
+		Shape s1;
+		if (p1 ==getEndOffset()) {
+			try {
+				s1 = modelToView(p1, a, b1);
+			} catch (BadLocationException ble) {
+				s1 = null;
+			}
+			if (s1 == null) {
+				// Assume extends left to right.
+				Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+				s1 = new Rectangle(alloc.x + alloc.width - 1, alloc.y,
+								1, alloc.height);
+			}
+		}
+		else {
+			s1 = modelToView(p1, a, b1);
+		}
+		Rectangle r0 = s0.getBounds();
+		Rectangle r1 = (s1 instanceof Rectangle) ? (Rectangle) s1 :
+													s1.getBounds();
+		if (r0.y != r1.y) {
+			// If it spans lines, force it to be the width of the view.
+			Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+			r0.x = alloc.x;
+			r0.width = alloc.width;
+		}
+
+		r0.add(r1);
+		// The next line is the only difference between this method and
+		// View's implementation.  We're subtracting the width of the second
+		// character.  This is because this method is used by Highlighter
+		// implementations to get the area to "highlight", and if we don't do
+		// this, one character too many is highlighted thanks to our
+		// modelToView() implementation returning the actual width of the
+		// character requested!
+		if (p1>p0) r0.width -= r1.width;
+
+		return r0;
+
+	}
+
+
+	/**
+	 * Returns the next tab stop position after a given reference position.
+	 * This implementation does not support things like centering so it
+	 * ignores the tabOffset argument.
+	 *
+	 * @param x the current position >= 0
+	 * @param tabOffset the position within the text stream
+	 *   that the tab occurred at >= 0.
+	 * @return the tab stop, measured in points >= 0
+	 */
+	public float nextTabStop(float x, int tabOffset) {
+		if (tabSize == 0)
+			return x;
+		int ntabs = (((int)x) - tabBase) / tabSize;
+		return tabBase + ((ntabs + 1) * tabSize);
+	}
+
+
+	/**
+	 * Actually paints the text area.  Only lines that have been damaged are
+	 * repainted.
+	 *
+	 * @param g The graphics context with which to paint.
+	 * @param a The allocated region in which to render.
+	 * @see #drawLine
+	 */
+	public void paint(Graphics g, Shape a) {
+
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+
+		Rectangle alloc = a.getBounds();
+
+		tabBase = alloc.x;
+		host = (RSyntaxTextArea)getContainer();
+
+		Rectangle clip = g.getClipBounds();
+		// An attempt to speed things up for files with long lines.  Note that
+		// this will actually slow things down a tad for the common case of
+		// regular-length lines, but I don't think it'll make a difference
+		// visually.  We'll see...
+		clipStart = clip.x;
+		clipEnd = clipStart + clip.width;
+
+		lineHeight = host.getLineHeight();
+		ascent = host.getMaxAscent();//metrics.getAscent();
+		int heightAbove = clip.y - alloc.y;
+		int linesAbove = Math.max(0, heightAbove / lineHeight);
+
+		FoldManager fm = host.getFoldManager();
+		linesAbove += fm.getHiddenLineCountAbove(linesAbove, true);
+		Rectangle lineArea = lineToRect(a, linesAbove);
+		int y = lineArea.y + ascent;
+		int x = lineArea.x;
+		Element map = getElement();
+		int lineCount = map.getElementCount();
+
+		RSyntaxTextAreaHighlighter h =
+					(RSyntaxTextAreaHighlighter)host.getHighlighter();
+
+		Graphics2D g2d = (Graphics2D)g;
+		Token token;
+		//System.err.println("Painting lines: " + linesAbove + " to " + (endLine-1));
+
+
+		int line = linesAbove;
+//int count = 0;
+		while (y<clip.y+clip.height+lineHeight && line<lineCount) {
+
+			Fold fold = fm.getFoldForLine(line);
+			Element lineElement = map.getElement(line);
+			int startOffset = lineElement.getStartOffset();
+			//int endOffset = (line==lineCount ? lineElement.getEndOffset()-1 :
+			//							lineElement.getEndOffset()-1);
+			int endOffset = lineElement.getEndOffset()-1; // Why always "-1"?
+			h.paintLayeredHighlights(g2d, startOffset, endOffset,
+								a, host, this);
+	
+			// Paint a line of text.
+			token = document.getTokenListForLine(line);
+			drawLine(token, g2d, x,y);
+
+			if (fold!=null && fold.isCollapsed()) {
+
+				// Visible indicator of collapsed lines
+				Color c = RSyntaxUtilities.getFoldedLineBottomColor(host);
+				if (c!=null) {
+					g.setColor(c);
+					g.drawLine(x,y+lineHeight-ascent-1,
+							alloc.width,y+lineHeight-ascent-1);
+				}
+
+				// Skip to next line to paint, taking extra care for lines with
+				// block ends and begins together, e.g. "} else {"
+				do {
+					int hiddenLineCount = fold.getLineCount();
+					if (hiddenLineCount==0) {
+						// Fold parser identified a zero-line fold region.
+						// This is really a bug, but we'll be graceful here
+						// and avoid an infinite loop.
+						break;
+					}
+					line += hiddenLineCount;
+					fold = fm.getFoldForLine(line);
+				} while (fold!=null && fold.isCollapsed());
+
+			}
+
+			y += lineHeight;
+			line++;
+			//count++;
+
+		}
+
+		//System.out.println("SyntaxView: lines painted=" + count);
+
+	}
+
+
+	/**
+	 * If the passed-in line is longer than the current longest line, then
+	 * the longest line is updated.
+	 *
+	 * @param line The line to test against the current longest.
+	 * @param lineNumber The line number of the passed-in line.
+	 * @return <code>true</code> iff the current longest line was updated.
+	 */
+	protected boolean possiblyUpdateLongLine(Element line, int lineNumber) {
+		float w = getLineWidth(lineNumber);
+		if (w > longLineWidth) {
+			longLineWidth = w;
+			longLine = line;
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Gives notification that something was removed from the document
+	 * in a location that this view is responsible for.
+	 *
+	 * @param changes the change information from the associated document
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 */
+	public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateDamage(changes, a, f);
+	}
+
+
+	public void setSize(float width, float height) {
+		super.setSize(width, height);
+		updateMetrics();
+	}
+
+
+	/**
+	 * Repaint the region of change covered by the given document
+	 * event.  Damages the line that begins the range to cover
+	 * the case when the insert/remove is only on one line.  
+	 * If lines are added or removed, damages the whole 
+	 * view.  The longest line is checked to see if it has 
+	 * changed.
+	 */
+	protected void updateDamage(DocumentEvent changes, Shape a, ViewFactory f) {
+		Component host = getContainer();
+		updateMetrics();
+		Element elem = getElement();
+		DocumentEvent.ElementChange ec = changes.getChange(elem);
+		Element[] added = (ec != null) ? ec.getChildrenAdded() : null;
+		Element[] removed = (ec != null) ? ec.getChildrenRemoved() : null;
+		if (((added != null) && (added.length > 0)) || 
+			((removed != null) && (removed.length > 0))) {
+			// lines were added or removed...
+			if (added != null) {
+				int addedAt = ec.getIndex(); // FIXME: Is this correct?????
+				for (int i = 0; i < added.length; i++)
+					possiblyUpdateLongLine(added[i], addedAt+i);
+			}
+			if (removed != null) {
+				for (int i = 0; i < removed.length; i++) {
+					if (removed[i] == longLine) {
+						longLineWidth = -1; // Must do this!!
+						calculateLongestLine();
+						break;
+					}
+				}
+			}
+			preferenceChanged(null, true, true);
+			host.repaint();
+		}
+
+		// This occurs when syntax highlighting only changes on lines
+		// (i.e. beginning a multiline comment).
+		else if (changes.getType()==DocumentEvent.EventType.CHANGE) {
+			//System.err.println("Updating the damage due to a CHANGE event...");
+			int startLine = changes.getOffset();
+			int endLine = changes.getLength();
+			damageLineRange(startLine,endLine, a, host);
+		}
+
+		else {
+			Element map = getElement();
+			int line = map.getElementIndex(changes.getOffset());
+			damageLineRange(line, line, a, host);
+			if (changes.getType() == DocumentEvent.EventType.INSERT) {
+				// check to see if the line is longer than current
+				// longest line.
+				Element e = map.getElement(line);
+				if (e == longLine) {
+					// We must recalculate longest line's width here
+					// because it has gotten longer.
+					longLineWidth = getLineWidth(line);
+					preferenceChanged(null, true, false);
+				}
+				else {
+					// If long line gets updated, update the status bars too.
+					if (possiblyUpdateLongLine(e, line))
+						preferenceChanged(null, true, false);
+				}
+			}
+			else if (changes.getType() == DocumentEvent.EventType.REMOVE) {
+				if (map.getElement(line) == longLine) {
+					// removed from longest line... recalc
+					longLineWidth = -1; // Must do this!
+					calculateLongestLine();
+					preferenceChanged(null, true, false);
+				}			
+			}
+		}
+	}
+
+
+	/**
+	 * Checks to see if the font metrics and longest line are up-to-date.
+	 */
+	protected void updateMetrics() {
+		host = (RSyntaxTextArea)getContainer();
+		Font f = host.getFont();
+		if (font != f) {
+			// The font changed, we need to recalculate the longest line!
+			// This also updates cached font and tab size.
+			calculateLongestLine();
+		}
+	}
+
+
+	/**
+	 * Provides a mapping from the view coordinate space to the logical
+	 * coordinate space of the model.
+	 *
+	 * @param fx the X coordinate >= 0
+	 * @param fy the Y coordinate >= 0
+	 * @param a the allocated region to render into
+	 * @return the location within the model that best represents the
+	 *  given point in the view >= 0
+	 */
+	public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
+
+		bias[0] = Position.Bias.Forward;
+
+		Rectangle alloc = a.getBounds();
+		RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+		int x = (int) fx;
+		int y = (int) fy;
+
+		// If they're asking about a view position above the area covered by
+		// this view, then the position is assumed to be the starting position
+		// of this view.
+		if (y < alloc.y) {
+			return getStartOffset();
+		}
+
+		// If they're asking about a position below this view, the position
+		// is assumed to be the ending position of this view.
+		else if (y > alloc.y + alloc.height) {
+			return host.getLastVisibleOffset();
+		}
+
+		// They're asking about a position within the coverage of this view
+		// vertically.  So, we figure out which line the point corresponds to.
+		// If the line is greater than the number of lines contained, then
+		// simply use the last line as it represents the last possible place
+		// we can position to.
+		else {
+
+			Element map = doc.getDefaultRootElement();
+			int lineIndex = Math.abs((y - alloc.y) / lineHeight);//metrics.getHeight() );
+FoldManager fm = host.getFoldManager();
+//System.out.print("--- " + lineIndex);
+lineIndex += fm.getHiddenLineCountAbove(lineIndex, true);
+//System.out.println(" => " + lineIndex);
+			if (lineIndex >= map.getElementCount()) {
+				return host.getLastVisibleOffset();
+			}
+
+			Element line = map.getElement(lineIndex);
+
+			// If the point is to the left of the line...
+			if (x < alloc.x)
+				return line.getStartOffset();
+
+			// If the point is to the right of the line...
+			else if (x > alloc.x + alloc.width)
+				return line.getEndOffset() - 1;
+
+			else {
+				// Determine the offset into the text
+				int p0 = line.getStartOffset();
+				Token tokenList = doc.getTokenListForLine(lineIndex);
+				tabBase = alloc.x;
+				int offs = tokenList.getListOffset(
+									(RSyntaxTextArea)getContainer(),
+									this, tabBase, x);
+				return offs!=-1 ? offs : p0;
+			}
+
+		} // End of else.
+
+	} 
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLine(Rectangle alloc, int line) throws BadLocationException {
+
+		//Rectangle lineArea = lineToRect(alloc, lineIndex);
+		updateMetrics();
+		if (metrics != null) {
+			// NOTE:  lineHeight is not initially set here, leading to the
+			// current line not being highlighted when a document is first
+			// opened.  So, we set it here just in case.
+			lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+			FoldManager fm = host.getFoldManager();
+			if (!fm.isLineHidden(line)) {
+				line -= fm.getHiddenLineCountAbove(line);
+				return alloc.y + line*lineHeight;
+			}
+		}
+
+		return -1;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLineContaining(Rectangle alloc, int offs)
+							throws BadLocationException {
+		Element map = getElement();
+		int line = map.getElementIndex(offs);
+		return yForLine(alloc, line);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TextEditorPane.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TextEditorPane.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TextEditorPane.java	(revision 25584)
@@ -0,0 +1,699 @@
+/*
+ * 11/25/2008
+ *
+ * TextEditorPane.java - A syntax highlighting text area that has knowledge of
+ * the file it is editing on disk.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.Document;
+
+import org.fife.io.UnicodeReader;
+import org.fife.io.UnicodeWriter;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rtextarea.RTextAreaEditorKit;
+
+
+/**
+ * An extension of {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea}
+ * that adds information about the file being edited, such as:
+ *
+ * <ul>
+ *   <li>Its name and location.
+ *   <li>Is it dirty?
+ *   <li>Is it read-only?
+ *   <li>The last time it was loaded or saved to disk (local files only).
+ *   <li>The file's encoding on disk.
+ *   <li>Easy access to the line separator.
+ * </ul>
+ *
+ * Loading and saving is also built into the editor.<p>
+ * Both local and remote files (e.g. ftp) are supported.  See the
+ * {@link FileLocation} class for more information.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see FileLocation
+ */
+public class TextEditorPane extends RSyntaxTextArea implements
+									DocumentListener {
+
+	private static final long serialVersionUID = 1L;
+
+	public static final String FULL_PATH_PROPERTY	= "TextEditorPane.fileFullPath";
+	public static final String DIRTY_PROPERTY	= "TextEditorPane.dirty";
+	public static final String READ_ONLY_PROPERTY	= "TextEditorPane.readOnly";
+
+	/**
+	 * The location of the file being edited.
+	 */
+	private FileLocation loc;
+
+	/**
+	 * The charset to use when reading or writing this file.
+	 */
+	private String charSet;
+
+	/**
+	 * Whether the file should be treated as read-only.
+	 */
+	private boolean readOnly;
+
+	/**
+	 * Whether the file is dirty.
+	 */
+	private boolean dirty;
+
+	/**
+	 * The last time this file was modified on disk, for local files.
+	 * For remote files, this value should always be
+	 * {@link #LAST_MODIFIED_UNKNOWN}.
+	 */
+	private long lastSaveOrLoadTime;
+
+	/**
+	 * The value returned by {@link #getLastSaveOrLoadTime()} for remote files.
+	 */
+	public static final long LAST_MODIFIED_UNKNOWN		= 0;
+
+	/**
+	 * The default name given to files if none is specified in a constructor.
+	 */
+	private static final String DEFAULT_FILE_NAME = "Untitled.txt";
+
+
+	/**
+	 * Constructor.  The file will be given a default name.
+	 */
+	public TextEditorPane() {
+		this(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.  The file will be given a default name.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 */
+	public TextEditorPane(int textMode) {
+		this(textMode, false);
+	}
+
+
+	/**
+	 * Creates a new <code>TextEditorPane</code>.  The file will be given
+	 * a default name.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+	 */
+	public TextEditorPane(int textMode, boolean wordWrapEnabled) {
+		super(textMode);
+		setLineWrap(wordWrapEnabled);
+		try {
+			init(null, null);
+		} catch (IOException ioe) { // Never happens
+			ioe.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * Creates a new <code>TextEditorPane</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+	 * @param loc The location of the text file being edited.  If this value
+	 *        is <code>null</code>, a file named "Untitled.txt" in the current
+	 *        directory is used.
+	 * @throws IOException If an IO error occurs reading the file at
+	 *         <code>loc</code>.  This of course won't happen if
+	 *         <code>loc</code> is <code>null</code>.
+	 */
+	public TextEditorPane(int textMode, boolean wordWrapEnabled,
+							FileLocation loc) throws IOException {
+		this(textMode, wordWrapEnabled, loc, null);
+	}
+
+
+	/**
+	 * Creates a new <code>TextEditorPane</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+	 * @param loc The location of the text file being edited.  If this value
+	 *        is <code>null</code>, a file named "Untitled.txt" in the current
+	 *        directory is used.  This file is displayed as empty even if it
+	 *        actually exists.
+	 * @param defaultEnc The default encoding to use when opening the file,
+	 *        if the file is not Unicode.  If this value is <code>null</code>,
+	 *        a system default value is used.
+	 * @throws IOException If an IO error occurs reading the file at
+	 *         <code>loc</code>.  This of course won't happen if
+	 *         <code>loc</code> is <code>null</code>.
+	 */
+	public TextEditorPane(int textMode, boolean wordWrapEnabled,
+				FileLocation loc, String defaultEnc) throws IOException {
+		super(textMode);
+		setLineWrap(wordWrapEnabled);
+		init(loc, defaultEnc);
+	}
+
+
+	/**
+	 * Callback for when styles in the current document change.
+	 * This method is never called.
+	 *
+	 * @param e The document event.
+	 */
+	public void changedUpdate(DocumentEvent e) {
+	}
+
+
+
+	/**
+	 * Returns the default encoding for this operating system.
+	 *
+	 * @return The default encoding.
+	 */
+	private static final String getDefaultEncoding() {
+		// TODO: Change to "Charset.defaultCharset().name()" when 1.4 support
+		// is no longer needed.
+		// NOTE:  The "file.encoding" property is not guaranteed to be set by
+		// the spec, so we cannot rely on it.
+		String encoding = System.getProperty("file.encoding");
+		if (encoding==null) {
+			try {
+				File f = File.createTempFile("rsta", null);
+				FileWriter w = new FileWriter(f);
+				encoding = w.getEncoding();
+				w.close();
+				f.deleteOnExit();//delete();  Keep FindBugs happy
+			} catch (IOException ioe) {
+				encoding = "US-ASCII";
+			}
+		}
+		return encoding;
+	}
+
+
+	/**
+	 * Returns the encoding to use when reading or writing this file.
+	 *
+	 * @return The encoding.
+	 * @see #setEncoding(String)
+	 */
+	public String getEncoding() {
+		return charSet;
+	}
+
+
+	/**
+	 * Returns the full path to this document.
+	 *
+	 * @return The full path to the document.
+	 */
+	public String getFileFullPath() {
+		return loc==null ? null : loc.getFileFullPath();
+	}
+
+
+	/**
+	 * Returns the file name of this document.
+	 *
+	 * @return The file name.
+	 */
+	public String getFileName() {
+		return loc.getFileName();
+	}
+
+
+	/**
+	 * Returns the timestamp for when this file was last loaded or saved
+	 * <em>by this editor pane</em>.  If the file has been modified on disk by
+	 * another process after it was loaded into this editor pane, this method
+	 * will not return the actual file's last modified time.<p>
+	 *
+	 * For remote files, this method will always return
+	 * {@link #LAST_MODIFIED_UNKNOWN}.
+	 *
+	 * @return The timestamp when this file was last loaded or saved by this
+	 *         editor pane, if it is a local file, or
+	 *         {@link #LAST_MODIFIED_UNKNOWN} if it is a remote file.
+	 * @see #isModifiedOutsideEditor()
+	 */
+	public long getLastSaveOrLoadTime() {
+		return lastSaveOrLoadTime;
+	}
+
+
+	/**
+	 * Returns the line separator used when writing this file (e.g.
+	 * "<code>\n</code>", "<code>\r\n</code>", or "<code>\r</code>").<p>
+	 * 
+	 * Note that this value is an <code>Object</code> and not a
+	 * <code>String</code> as that is the way the {@link Document} interface
+	 * defines its property values.  If you always use
+	 * {@link #setLineSeparator(String)} to modify this value, then the value
+	 * returned from this method will always be a <code>String</code>.
+	 *
+	 * @return The line separator.  If this value is <code>null</code>, then
+	 *         the system default line separator is used (usually the value
+	 *         of <code>System.getProperty("line.separator")</code>).
+	 * @see #setLineSeparator(String)
+	 * @see #setLineSeparator(String, boolean)
+	 */
+	public Object getLineSeparator() {
+		return getDocument().getProperty(
+							RTextAreaEditorKit.EndOfLineStringProperty);
+	}
+
+
+	/**
+	 * Initializes this editor with the specified file location.
+	 *
+	 * @param loc The file location.  If this is <code>null</code>, a default
+	 *        location is used and an empty file is displayed.
+	 * @param defaultEnc The default encoding to use when opening the file,
+	 *        if the file is not Unicode.  If this value is <code>null</code>,
+	 *        a system default value is used.
+	 * @throws IOException If an IO error occurs reading from <code>loc</code>.
+	 *         If <code>loc</code> is <code>null</code>, this cannot happen.
+	 */
+	private void init(FileLocation loc, String defaultEnc) throws IOException {
+
+		if (loc==null) {
+			// Don't call load() just in case Untitled.txt actually exists,
+			// just to ensure there is no chance of an IOException being thrown
+			// in the default case.
+			this.loc = FileLocation.create(DEFAULT_FILE_NAME);
+			charSet = defaultEnc==null ? getDefaultEncoding() : defaultEnc;
+			// Ensure that line separator always has a value, even if the file
+			// does not exist (or is the "default" file).  This makes life
+			// easier for host applications that want to display this value.
+			setLineSeparator(System.getProperty("line.separator"));
+		}
+		else {
+			load(loc, defaultEnc); // Sets this.loc
+		}
+
+		if (this.loc.isLocalAndExists()) {
+			File file = new File(this.loc.getFileFullPath());
+			lastSaveOrLoadTime = file.lastModified();
+			setReadOnly(!file.canWrite());
+		}
+		else {
+			lastSaveOrLoadTime = LAST_MODIFIED_UNKNOWN;
+			setReadOnly(false);
+		}
+
+		setDirty(false);
+
+	}
+
+
+	/**
+	 * Callback for when text is inserted into the document.
+	 *
+	 * @param e Information on the insertion.
+	 */
+	public void insertUpdate(DocumentEvent e) {
+		if (!dirty) {
+			setDirty(true);
+		}
+	}
+
+
+	/**
+	 * Returns whether or not the text in this editor has unsaved changes.
+	 *
+	 * @return Whether or not the text has unsaved changes.
+	 */
+	public boolean isDirty() {
+		return dirty;
+	}
+
+
+	/**
+	 * Returns whether this file is a local file.
+	 *
+	 * @return Whether this is a local file.
+	 */
+	public boolean isLocal() {
+		return loc.isLocal();
+	}
+
+
+	/**
+	 * Returns whether this is a local file that already exists.
+	 *
+	 * @return Whether this is a local file that already exists.
+	 */
+	public boolean isLocalAndExists() {
+		return loc.isLocalAndExists();
+	}
+
+
+	/**
+	 * Returns whether the text file has been modified outside of this editor
+	 * since the last load or save operation.  Note that if this is a remote
+	 * file, this method will always return <code>false</code>.<p>
+	 *
+	 * This method may be used by applications to implement a reloading
+	 * feature, where the user is prompted to reload a file if it has been
+	 * modified since their last open or save.
+	 *
+	 * @return Whether the text file has been modified outside of this
+	 *         editor.
+	 * @see #getLastSaveOrLoadTime()
+	 */
+	public boolean isModifiedOutsideEditor() {
+		return loc.getActualLastModified()>getLastSaveOrLoadTime();
+	}
+
+
+	/**
+	 * Returns whether or not the text area should be treated as read-only.
+	 *
+	 * @return Whether or not the text area should be treated as read-only.
+	 * @see #setReadOnly(boolean)
+	 */
+	public boolean isReadOnly() {
+		return readOnly;
+	}
+
+
+	/**
+	 * Loads the specified file in this editor.  This method fires a property
+	 * change event of type {@link #FULL_PATH_PROPERTY}.
+	 *
+	 * @param loc The location of the file to load.  This cannot be
+	 *        <code>null</code>.
+	 * @param defaultEnc The encoding to use when loading/saving the file.
+	 *        This encoding will only be used if the file is not Unicode.
+	 *        If this value is <code>null</code>, the system default encoding
+	 *        is used.
+	 * @throws IOException If an IO error occurs.
+	 * @see #save()
+	 * @see #saveAs(FileLocation)
+	 */
+	public void load(FileLocation loc, String defaultEnc) throws IOException {
+
+		// For new local files, just go with it.
+		if (loc.isLocal() && !loc.isLocalAndExists()) {
+			this.charSet = defaultEnc!=null ? defaultEnc : getDefaultEncoding();
+			this.loc = loc;
+			return;
+		}
+
+		// Old local files and remote files, load 'em up.  UnicodeReader will
+		// check for BOMs and handle them correctly in all cases, then pass
+		// rest of stream down to InputStreamReader.
+		UnicodeReader ur = new UnicodeReader(loc.getInputStream(), defaultEnc);
+
+		// Remove listener so dirty flag doesn't get set when loading a file.
+		Document doc = getDocument();
+		doc.removeDocumentListener(this);
+		BufferedReader r = new BufferedReader(ur);
+		try {
+			read(r, null);
+		} finally {
+			doc.addDocumentListener(this);
+			r.close();
+		}
+
+		// No IOException thrown, so we can finally change the location.
+		charSet = ur.getEncoding();
+		String old = getFileFullPath();
+		this.loc = loc;
+		firePropertyChange(FULL_PATH_PROPERTY, old, getFileFullPath());
+
+	}
+
+
+	/**
+	 * Reloads this file from disk.  The file must exist for this operation
+	 * to not throw an exception.<p>
+	 * 
+	 * The file's "dirty" state will be set to <code>false</code> after this
+	 * operation.  If this is a local file, its "last modified" time is
+	 * updated to reflect that of the actual file.<p>
+	 *
+	 * Note that if the file has been modified on disk, and is now a Unicode
+	 * encoding when before it wasn't (or if it is a different Unicode now),
+	 * this will cause this {@link TextEditorPane}'s encoding to change.
+	 * Otherwise, the file's encoding will stay the same.
+	 *
+	 * @throws IOException If the file does not exist, or if an IO error
+	 *         occurs reading the file.
+	 * @see #isLocalAndExists()
+	 */
+	public void reload() throws IOException {
+		String oldEncoding = getEncoding();
+		UnicodeReader ur = new UnicodeReader(loc.getInputStream(), oldEncoding);
+		String encoding = ur.getEncoding();
+		BufferedReader r = new BufferedReader(ur);
+		try {
+			read(r, null); // Dumps old contents.
+		} finally {
+			r.close();
+		}
+		setEncoding(encoding);
+		setDirty(false);
+		syncLastSaveOrLoadTimeToActualFile();
+		discardAllEdits(); // Prevent user from being able to undo the reload
+	}
+
+
+	/**
+	 * Called whenever text is removed from this editor.
+	 *
+	 * @param e The document event.
+	 */
+	public void removeUpdate(DocumentEvent e) {
+		if (!dirty) {
+			setDirty(true);
+		}
+	}
+
+
+	/**
+	 * Saves the file in its current encoding.<p>
+	 *
+	 * The text area's "dirty" state is set to <code>false</code>, and if
+	 * this is a local file, its "last modified" time is updated.
+	 *
+	 * @throws IOException If an IO error occurs.
+	 * @see #saveAs(FileLocation)
+	 * @see #load(FileLocation, String)
+	 */
+	public void save() throws IOException {
+		saveImpl(loc);
+		setDirty(false);
+		syncLastSaveOrLoadTimeToActualFile();
+	}
+
+
+	/**
+	 * Saves this file in a new local location.  This method fires a property
+	 * change event of type {@link #FULL_PATH_PROPERTY}.
+	 *
+	 * @param loc The location to save to.
+	 * @throws IOException If an IO error occurs.
+	 * @see #save()
+	 * @see #load(FileLocation, String)
+	 */
+	public void saveAs(FileLocation loc) throws IOException {
+		saveImpl(loc);
+		// No exception thrown - we can "rename" the file.
+		String old = getFileFullPath();
+		this.loc = loc;
+		setDirty(false);
+		lastSaveOrLoadTime = loc.getActualLastModified();
+		firePropertyChange(FULL_PATH_PROPERTY, old, getFileFullPath());
+	}
+
+
+	/**
+	 * Saves the text in this editor to the specified location.
+	 *
+	 * @param loc The location to save to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void saveImpl(FileLocation loc) throws IOException {
+		OutputStream out = loc.getOutputStream();
+		PrintWriter w = new PrintWriter(
+			new BufferedWriter(new UnicodeWriter(out, getEncoding())));
+		try {
+			write(w);
+		} finally {
+			w.close();
+		}
+	}
+
+
+	/**
+	 * Sets whether or not this text in this editor has unsaved changes.
+	 * This fires a property change event of type {@link #DIRTY_PROPERTY}.
+	 *
+	 * @param dirty Whether or not the text has been modified.
+	 * @see #isDirty()
+	 */
+	private void setDirty(boolean dirty) {
+		if (this.dirty!=dirty) {
+			this.dirty = dirty;
+			firePropertyChange(DIRTY_PROPERTY, !dirty, dirty);
+		}
+	}
+
+
+	/**
+	 * Sets the document for this editor.
+	 *
+	 * @param doc The new document.
+	 */
+	public void setDocument(Document doc) {
+		Document old = getDocument();
+		if (old!=null) {
+			old.removeDocumentListener(this);
+		}
+		super.setDocument(doc);
+		doc.addDocumentListener(this);
+	}
+
+
+	/**
+	 * Sets the encoding to use when reading or writing this file.  This
+	 * method sets the editor's dirty flag when the encoding is changed.
+	 *
+	 * @param encoding The new encoding.
+	 * @throws UnsupportedCharsetException If the encoding is not supported.
+	 * @throws NullPointerException If <code>encoding</code> is
+	 *         <code>null</code>.
+	 * @see #getEncoding()
+	 */
+	public void setEncoding(String encoding) {
+		if (encoding==null) {
+			throw new NullPointerException("encoding cannot be null");
+		}
+		else if (!Charset.isSupported(encoding)) {
+			throw new UnsupportedCharsetException(encoding);
+		}
+		if (charSet==null || !charSet.equals(encoding)) {
+			charSet = encoding;
+			setDirty(true);
+		}
+	}
+
+
+	/**
+	 * Sets the line separator sequence to use when this file is saved (e.g.
+	 * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
+	 *
+	 * Besides parameter checking, this method is preferred over
+	 * <code>getDocument().putProperty()</code> because it sets the editor's
+	 * dirty flag when the line separator is changed.
+	 *
+	 * @param separator The new line separator.
+	 * @throws NullPointerException If <code>separator</code> is
+	 *         <code>null</code>.
+	 * @throws IllegalArgumentException If <code>separator</code> is not one
+	 *         of "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>".
+	 * @see #getLineSeparator()
+	 */
+	public void setLineSeparator(String separator) {
+		setLineSeparator(separator, true);
+	}
+
+
+	/**
+	 * Sets the line separator sequence to use when this file is saved (e.g.
+	 * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
+	 *
+	 * Besides parameter checking, this method is preferred over
+	 * <code>getDocument().putProperty()</code> because can set the editor's
+	 * dirty flag when the line separator is changed.
+	 *
+	 * @param separator The new line separator.
+	 * @param setDirty Whether the dirty flag should be set if the line
+	 *        separator is changed.
+	 * @throws NullPointerException If <code>separator</code> is
+	 *         <code>null</code>.
+	 * @throws IllegalArgumentException If <code>separator</code> is not one
+	 *         of "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>".
+	 * @see #getLineSeparator()
+	 */
+	public void setLineSeparator(String separator, boolean setDirty) {
+		if (separator==null) {
+			throw new NullPointerException("terminator cannot be null");
+		}
+		if (!"\r\n".equals(separator) && !"\n".equals(separator) &&
+				!"\r".equals(separator)) {
+			throw new IllegalArgumentException("Invalid line terminator");
+		}
+		Document doc = getDocument();
+		Object old = doc.getProperty(
+						RTextAreaEditorKit.EndOfLineStringProperty);
+		if (!separator.equals(old)) {
+			doc.putProperty(RTextAreaEditorKit.EndOfLineStringProperty,
+							separator);
+			if (setDirty) {
+				setDirty(true);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets whether or not this text area should be treated as read-only.
+	 * This fires a property change event of type {@link #READ_ONLY_PROPERTY}.
+	 *
+	 * @param readOnly Whether or not the document is read-only.
+	 * @see #isReadOnly()
+	 */
+	public void setReadOnly(boolean readOnly) {
+		if (this.readOnly!=readOnly) {
+			this.readOnly = readOnly;
+			firePropertyChange(READ_ONLY_PROPERTY, !readOnly, readOnly);
+		}
+	}
+
+
+	/**
+	 * Syncs this text area's "last saved or loaded" time to that of the file
+	 * being edited, if that file is local and exists.  If the file is
+	 * remote or is local but does not yet exist, nothing happens.<p>
+	 *
+	 * You normally do not have to call this method, as the "last saved or
+	 * loaded" time for {@link TextEditorPane}s is kept up-to-date internally
+	 * during such operations as {@link #save()}, {@link #reload()}, etc.
+	 *
+	 * @see #getLastSaveOrLoadTime()
+	 * @see #isModifiedOutsideEditor()
+	 */
+	public void syncLastSaveOrLoadTimeToActualFile() {
+		if (loc.isLocalAndExists()) {
+			lastSaveOrLoadTime = loc.getActualLastModified();
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Theme.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Theme.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Theme.java	(revision 25584)
@@ -0,0 +1,653 @@
+/*
+ * 10/30/2011
+ *
+ * Theme.java - A color theme for RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.lang.reflect.Field;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+import org.fife.io.UnicodeWriter;
+import org.fife.ui.rtextarea.Gutter;
+
+
+/**
+ * A theme is a set of fonts and colors to use to style RSyntaxTextArea.
+ * Themes are defined in XML files that are validated against
+ * <code>themes.dtd</code>.  This provides applications and other consumers
+ * with an easy way to style RSyntaxTextArea without having to use the API.<p>
+ * 
+ * Sample themes are included in the source tree under the <code>/themes</code>
+ * folder, but are not a part of the built RSyntaxTextArea jar.  Hosting
+ * applications are free to ship and use these themes as-is, modify them, or
+ * create their own.<p>
+ *
+ * Note that to save a <code>Theme</code> via {@link #save(OutputStream)},
+ * you must currently create a <code>Theme</code> from a text area wrapped in
+ * an <code>RTextScrollPane</code>, so that the color information for the
+ * gutter can be retrieved.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class Theme {
+
+	private Font baseFont;
+	private Color bgColor;
+	private Color caretColor;
+	private Color selectionBG;
+	private boolean selectionRoundedEdges;
+	private Color currentLineHighlight;
+	private boolean fadeCurrentLineHighlight;
+	private Color marginLineColor;
+	private Color markAllHighlightColor;
+	private Color markOccurrencesColor;
+	private boolean markOccurrencesBorder;
+	private Color matchedBracketFG;
+	private Color matchedBracketBG;
+	private boolean matchedBracketAnimate;
+	private Color hyperlinkFG;
+
+	private SyntaxScheme scheme;
+
+	private Color gutterBorderColor;
+	private Color lineNumberColor;
+	private String lineNumberFont;
+	private int lineNumberFontSize;
+	private Color foldIndicatorFG;
+	private Color foldBG;
+
+
+	/**
+	 * Private constructor, used when loading from a stream.
+	 */
+	private Theme() {
+	}
+
+
+	/**
+	 * Creates a theme from an RSyntaxTextArea.  It should be contained in
+	 * an <code>RTextScrollPane</code> to get all gutter color information.
+	 *
+	 * @param textArea The text area.
+	 */
+	public Theme(RSyntaxTextArea textArea) {
+
+		baseFont = textArea.getFont();
+		bgColor = textArea.getBackground();
+		caretColor = textArea.getCaretColor();
+		selectionBG = textArea.getSelectionColor();
+		selectionRoundedEdges = textArea.getRoundedSelectionEdges();
+		currentLineHighlight = textArea.getCurrentLineHighlightColor();
+		fadeCurrentLineHighlight = textArea.getFadeCurrentLineHighlight();
+		marginLineColor = textArea.getMarginLineColor();
+		markAllHighlightColor = textArea.getMarkAllHighlightColor();
+		markOccurrencesColor = textArea.getMarkOccurrencesColor();
+		markOccurrencesBorder = textArea.getPaintMarkOccurrencesBorder();
+		matchedBracketBG = textArea.getMatchedBracketBGColor();
+		matchedBracketFG = textArea.getMatchedBracketBorderColor();
+		matchedBracketAnimate = textArea.getAnimateBracketMatching();
+		hyperlinkFG = textArea.getHyperlinkForeground();
+
+		scheme = textArea.getSyntaxScheme();
+
+		Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+		if (gutter!=null) {
+			bgColor = gutter.getBackground();
+			gutterBorderColor = gutter.getBorderColor();
+			lineNumberColor = gutter.getLineNumberColor();
+			lineNumberFont = gutter.getLineNumberFont().getFamily();
+			lineNumberFontSize = gutter.getLineNumberFont().getSize();
+			foldIndicatorFG = gutter.getFoldIndicatorForeground();
+			foldBG = gutter.getFoldBackground();
+		}
+
+	}
+
+
+	/**
+	 * Applies this theme to a text area.
+	 *
+	 * @param textArea The text area to apply this theme to.
+	 */
+	public void apply(RSyntaxTextArea textArea) {
+
+		textArea.setFont(baseFont);
+		textArea.setBackground(bgColor);
+		textArea.setCaretColor(caretColor);
+		textArea.setSelectionColor(selectionBG);
+		textArea.setRoundedSelectionEdges(selectionRoundedEdges);
+		textArea.setCurrentLineHighlightColor(currentLineHighlight);
+		textArea.setFadeCurrentLineHighlight(fadeCurrentLineHighlight);
+		textArea.setMarginLineColor(marginLineColor);
+		textArea.setMarkAllHighlightColor(markAllHighlightColor);
+		textArea.setMarkOccurrencesColor(markOccurrencesColor);
+		textArea.setPaintMarkOccurrencesBorder(markOccurrencesBorder);
+		textArea.setMatchedBracketBGColor(matchedBracketBG);
+		textArea.setMatchedBracketBorderColor(matchedBracketFG);
+		textArea.setAnimateBracketMatching(matchedBracketAnimate);
+		textArea.setHyperlinkForeground(hyperlinkFG);
+
+		textArea.setSyntaxScheme(scheme);
+
+		Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+		if (gutter!=null) {
+			gutter.setBackground(bgColor);
+			gutter.setBorderColor(gutterBorderColor);
+			gutter.setLineNumberColor(lineNumberColor);
+			String fontName = lineNumberFont!=null ? lineNumberFont :
+				baseFont.getFamily();
+			int fontSize = lineNumberFontSize>0 ? lineNumberFontSize :
+				baseFont.getSize();
+			Font font = new Font(fontName, Font.PLAIN, fontSize);
+			gutter.setLineNumberFont(font);
+			gutter.setFoldIndicatorForeground(foldIndicatorFG);
+			gutter.setFoldBackground(foldBG);
+		}
+
+	}
+
+
+	private static final String colorToString(Color c) {
+		int color = c.getRGB() & 0xffffff;
+		String str = Integer.toHexString(color);
+		while (str.length()<6) {
+			str = "0" + str;
+		}
+		return str;
+	}
+
+
+	/**
+	 * Loads a theme.
+	 *
+	 * @param in The input stream to read from.  This will be closed when this
+	 *        method returns.
+	 * @return The theme.
+	 * @throws IOException If an IO error occurs.
+	 * @see #save(OutputStream)
+	 */
+	public static Theme load(InputStream in) throws IOException {
+
+		Theme theme = new Theme();
+
+		BufferedInputStream bin = new BufferedInputStream(in);
+		try {
+			XmlHandler.load(theme, bin);
+		} finally {
+			bin.close();
+		}
+
+		return theme;
+
+	}
+
+
+	/**
+	 * Saves this theme to an output stream.
+	 *
+	 * @param out The output stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 * @see #load(InputStream)
+	 */
+	public void save(OutputStream out) throws IOException {
+
+		BufferedOutputStream bout = new BufferedOutputStream(out);
+		try {
+
+			DocumentBuilder db = DocumentBuilderFactory.newInstance().
+					newDocumentBuilder();
+			DOMImplementation impl = db.getDOMImplementation();
+
+			Document doc = impl.createDocument(null, "RSyntaxTheme", null);
+			Element root = doc.getDocumentElement();
+			root.setAttribute("version", "1.0");
+
+			Element elem = doc.createElement("baseFont");
+			if (!baseFont.getFamily().equals(
+					RSyntaxTextArea.getDefaultFont().getFamily())) {
+				elem.setAttribute("family", baseFont.getFamily());
+			}
+			elem.setAttribute("size", Integer.toString(baseFont.getSize()));
+			root.appendChild(elem);
+
+			elem = doc.createElement("background");
+			elem.setAttribute("color", colorToString(bgColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("caret");
+			elem.setAttribute("color", colorToString(caretColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("selection");
+			elem.setAttribute("bg", colorToString(selectionBG));
+			elem.setAttribute("roundedEdges", Boolean.toString(selectionRoundedEdges));
+			root.appendChild(elem);
+
+			elem = doc.createElement("currentLineHighlight");
+			elem.setAttribute("color", colorToString(currentLineHighlight));
+			elem.setAttribute("fade", Boolean.toString(fadeCurrentLineHighlight));
+			root.appendChild(elem);
+
+			elem = doc.createElement("marginLine");
+			elem.setAttribute("fg", colorToString(marginLineColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("markAllHighlight");
+			elem.setAttribute("color", colorToString(markAllHighlightColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("markOccurrencesHighlight");
+			elem.setAttribute("color", colorToString(markOccurrencesColor));
+			elem.setAttribute("border", Boolean.toString(markOccurrencesBorder));
+			root.appendChild(elem);
+
+			elem = doc.createElement("matchedBracket");
+			elem.setAttribute("fg", colorToString(matchedBracketFG));
+			elem.setAttribute("bg", colorToString(matchedBracketBG));
+			elem.setAttribute("animate", Boolean.toString(matchedBracketAnimate));
+			root.appendChild(elem);
+
+			elem = doc.createElement("hyperlinks");
+			elem.setAttribute("fg", colorToString(hyperlinkFG));
+			root.appendChild(elem);
+
+			elem = doc.createElement("gutterBorder");
+			elem.setAttribute("color", colorToString(gutterBorderColor));
+			root.appendChild(elem);
+
+			elem = doc.createElement("lineNumbers");
+			elem.setAttribute("fg", colorToString(lineNumberColor));
+			if (lineNumberFont!=null) {
+				elem.setAttribute("lineNumberFont", lineNumberFont);
+			}
+			if (lineNumberFontSize>0) {
+				elem.setAttribute("lineNumberFontSize",
+						Integer.toString(lineNumberFontSize));
+			}
+			root.appendChild(elem);
+
+			elem = doc.createElement("foldIndicator");
+			elem.setAttribute("fg", colorToString(foldIndicatorFG));
+			elem.setAttribute("iconBg", colorToString(foldBG));
+			root.appendChild(elem);
+
+			elem = doc.createElement("tokenStyles");
+			Field[] fields = TokenTypes.class.getFields();
+			for (int i=0; i<fields.length; i++) {
+				Field field = fields[i];
+				int value = field.getInt(null);
+				if (value!=TokenTypes.NUM_TOKEN_TYPES) {
+					Style style = scheme.getStyle(value);
+					if (style!=null) {
+						Element elem2 = doc.createElement("style");
+						elem2.setAttribute("token", field.getName());
+						Color fg = style.foreground;
+						if (fg!=null) {
+							elem2.setAttribute("fg", colorToString(fg));
+						}
+						Color bg = style.background;
+						if (bg!=null) {
+							elem2.setAttribute("bg", colorToString(bg));
+						}
+						Font font = style.font;
+						if (font!=null) {
+							if (!font.getFamily().equals(
+									baseFont.getFamily())) {
+								elem2.setAttribute("fontFamily", font.getFamily());
+							}
+							if (font.getSize()!=baseFont.getSize()) {
+								elem2.setAttribute("fontSize", Integer.toString(font.getSize()));
+							}
+							if (font.isBold()) {
+								elem2.setAttribute("bold", "true");
+							}
+							if (font.isItalic()) {
+								elem2.setAttribute("italic", "true");
+							}
+						}
+						if (style.underline) {
+							elem2.setAttribute("underline", "true");
+						}
+						elem.appendChild(elem2);
+					}
+				}
+			}
+			root.appendChild(elem);
+
+			DOMSource source = new DOMSource(doc);
+			// Use a writer instead of OutputStream to allow pretty printing.
+			// See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337981
+			StreamResult result = new StreamResult(new PrintWriter(
+					new UnicodeWriter(bout, "UTF-8")));
+			TransformerFactory transFac = TransformerFactory.newInstance();
+			Transformer transformer = transFac.newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
+			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+			transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "theme.dtd");
+			transformer.transform(source, result);
+
+		} catch (RuntimeException re) {
+			throw re; // FindBugs
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new IOException("Error generating XML: " + e.getMessage());
+			// When Java 6 is minimum required version
+			//throw new IOException("Error generating XML: " + e.getMessage(), e);
+		} finally {
+			bout.close();
+		}
+
+	}
+
+
+	/**
+	 * Returns the color represented by a string.  The input is expected to
+	 * be a 6-digit hex string, optionally prefixed by a '$'.  For example,
+	 * either of the following:
+	 * <pre>
+	 * "$00ff00"
+	 * "00ff00"
+	 * </pre>
+	 * will return <code>new Color(0, 255, 0)</code>.
+	 *
+	 * @param s The string to evaluate.
+	 * @return The color.
+	 */
+	private static final Color stringToColor(String s) {
+		if (s!=null && (s.length()==6 || s.length()==7)) {
+			if (s.charAt(0)=='$') {
+				s = s.substring(1);
+			}
+			return new Color(Integer.parseInt(s, 16));
+		}
+		return null;
+	}
+
+
+	/**
+	 * Loads a <code>SyntaxScheme</code> from an XML file.
+	 */
+	private static class XmlHandler extends DefaultHandler {
+
+		private Theme theme;
+
+		public void error(SAXParseException e) throws SAXException {
+			throw e;
+		}
+
+		public void fatalError(SAXParseException e) throws SAXException {
+			throw e;
+		}
+
+	    public static void load(Theme theme, InputStream in) throws IOException {
+			SAXParserFactory spf = SAXParserFactory.newInstance();
+			spf.setValidating(true);
+			try {
+				SAXParser parser = spf.newSAXParser();
+				XMLReader reader = parser.getXMLReader();
+				XmlHandler handler = new XmlHandler();
+				handler.theme = theme;
+				reader.setEntityResolver(handler);
+				reader.setContentHandler(handler);
+				reader.setDTDHandler(handler);
+				reader.setErrorHandler(handler);
+				InputSource is = new InputSource(in);
+				is.setEncoding("UTF-8");
+				reader.parse(is);
+			} catch (/*SAX|ParserConfiguration*/Exception se) {
+				se.printStackTrace();
+				throw new IOException(se.toString());
+			}
+		}
+
+		private static final int parseInt(Attributes attrs, String attr,
+				int def) {
+			int value = def;
+			String temp = attrs.getValue(attr);
+			if (temp != null) {
+				try {
+					value = Integer.parseInt(temp);
+				} catch (NumberFormatException nfe) {
+					nfe.printStackTrace();
+				}
+			}
+			return value;
+		}
+
+	    public InputSource resolveEntity(String publicID, 
+				String systemID) throws SAXException {
+			return new InputSource(getClass().
+					getResourceAsStream("/theme.dtd"));
+		}
+
+		public void startElement(String uri, String localName, String qName,
+								Attributes attrs) {
+
+			if ("background".equals(qName)) {
+
+				String color = attrs.getValue("color");
+				if (color!=null) {
+					theme.bgColor = stringToColor(color);
+				}
+				else {
+					String img = attrs.getValue("image");
+					if (img!=null) {
+						throw new IllegalArgumentException("Not yet implemented");
+					}
+				}
+			}
+
+			// The base font to use in the editor.
+			else if ("baseFont".equals(qName)) {
+				String family = attrs.getValue("family");
+				int size = Integer.parseInt(attrs.getValue("size"));
+				if (family!=null) {
+					theme.baseFont = new Font(family, Font.PLAIN, size);
+				}
+				else {
+					theme.baseFont = RSyntaxTextArea.getDefaultFont();
+					theme.baseFont = theme.baseFont.deriveFont(size*1f);
+				}
+			}
+
+			else if ("caret".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.caretColor = stringToColor(color);
+			}
+
+			else if ("currentLineHighlight".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.currentLineHighlight = stringToColor(color);
+				String fadeStr = attrs.getValue("fade");
+				boolean fade = Boolean.valueOf(fadeStr).booleanValue();
+				theme.fadeCurrentLineHighlight = fade;
+			}
+
+			else if ("foldIndicator".equals(qName)) {
+				String color = attrs.getValue("fg");
+				theme.foldIndicatorFG = stringToColor(color);
+				color = attrs.getValue("iconBg");
+				theme.foldBG = stringToColor(color);
+			}
+
+			else if ("gutterBorder".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.gutterBorderColor = stringToColor(color);
+			}
+
+			else if ("lineNumbers".equals(qName)) {
+				String color = attrs.getValue("fg");
+				theme.lineNumberColor = stringToColor(color);
+				theme.lineNumberFont = attrs.getValue("fontFamily");
+				theme.lineNumberFontSize = parseInt(attrs, "fontSize", -1);
+			}
+
+			else if ("marginLine".equals(qName)) {
+				String color = attrs.getValue("fg");
+				theme.marginLineColor = stringToColor(color);
+			}
+
+			else if ("markAllHighlight".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.markAllHighlightColor = stringToColor(color);
+			}
+
+			else if ("markOccurrencesHighlight".equals(qName)) {
+				String color = attrs.getValue("color");
+				theme.markOccurrencesColor = stringToColor(color);
+				String border = attrs.getValue("border");
+				theme.markOccurrencesBorder = Boolean.valueOf(border).booleanValue();
+			}
+
+			else if ("matchedBracket".equals(qName)) {
+				String fg = attrs.getValue("fg");
+				theme.matchedBracketFG = stringToColor(fg);
+				String bg = attrs.getValue("bg");
+				theme.matchedBracketBG = stringToColor(bg);
+				String animate = attrs.getValue("animate");
+				theme.matchedBracketAnimate = Boolean.valueOf(animate).booleanValue();
+			}
+
+			else if ("hyperlinks".equals(qName)) {
+				String fg = attrs.getValue("fg");
+				theme.hyperlinkFG = stringToColor(fg);
+			}
+
+			else if ("selection".equals(qName)) {
+				String color = attrs.getValue("bg");
+				theme.selectionBG = stringToColor(color);
+				String roundedStr = attrs.getValue("roundedEdges");
+				theme.selectionRoundedEdges = Boolean.valueOf(roundedStr).booleanValue();
+			}
+
+			// Start of the syntax scheme definition
+			else if ("tokenStyles".equals(qName)) {
+				theme.scheme = new SyntaxScheme(theme.baseFont, false);
+			}
+
+			// A style in the syntax scheme
+			else if ("style".equals(qName)) {
+
+				String type = attrs.getValue("token");
+				Field field = null;
+				try {
+					field = Token.class.getField(type);
+				} catch (RuntimeException re) {
+					throw re; // FindBugs
+				} catch (Exception e) {
+					System.err.println("Invalid token type: " + type);
+					return;
+				}
+
+				if (field.getType()==int.class) {
+
+					int index = 0;
+					try {
+						index = field.getInt(theme.scheme);
+					} catch (IllegalArgumentException e) {
+						e.printStackTrace();
+						return;
+					} catch (IllegalAccessException e) {
+						e.printStackTrace();
+						return;
+					}
+
+					String fgStr = attrs.getValue("fg");
+					Color fg = stringToColor(fgStr);
+					theme.scheme.getStyle(index).foreground = fg;
+
+					String bgStr = attrs.getValue("bg");
+					Color bg = stringToColor(bgStr);
+					theme.scheme.getStyle(index).background = bg;
+
+					Font font = theme.baseFont;
+					String familyName = attrs.getValue("fontFamily");
+					if (familyName!=null) {
+						font = new Font(familyName, font.getStyle(),
+								font.getSize());
+					}
+					String sizeStr = attrs.getValue("fontSize");
+					if (sizeStr!=null) {
+						try {
+							float size = Float.parseFloat(sizeStr);
+							size = Math.max(size, 1f);
+							font = font.deriveFont(size);
+						} catch (NumberFormatException nfe) {
+							nfe.printStackTrace();
+						}
+					}
+					theme.scheme.getStyle(index).font = font;
+
+					boolean styleSpecified = false;
+					boolean bold = false;
+					boolean italic = false;
+					String boldStr = attrs.getValue("bold");
+					if (boldStr!=null) {
+						bold = Boolean.valueOf(boldStr).booleanValue();
+						styleSpecified = true;
+					}
+					String italicStr = attrs.getValue("italic");
+					if (italicStr!=null) {
+						italic = Boolean.valueOf(italicStr).booleanValue();
+						styleSpecified = true;
+					}
+					if (styleSpecified) {
+						int style = 0;
+						if (bold) { style |= Font.BOLD; }
+						if (italic) { style |= Font.ITALIC; }
+						Font orig = theme.scheme.getStyle(index).font;
+						theme.scheme.getStyle(index).font =
+							orig.deriveFont(style);
+					}
+
+					String ulineStr = attrs.getValue("underline");
+					if (ulineStr!=null) {
+						boolean uline= Boolean.valueOf(ulineStr).booleanValue();
+						theme.scheme.getStyle(index).underline = uline;
+					}
+
+				}
+
+			}
+
+		}
+
+		public void warning(SAXParseException e) throws SAXException {
+			throw e;
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Token.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Token.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/Token.java	(revision 25584)
@@ -0,0 +1,999 @@
+/*
+ * 02/21/2004
+ *
+ * Token.java - A token used in syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * A generic token that functions as a node in a linked list of syntax
+ * highlighted tokens for some language.<p>
+ *
+ * A <code>Token</code> is a piece of text representing some logical token in
+ * source code for a programming language.  For example, the line of C code:<p>
+ * <pre>
+ * int i = 0;
+ * </pre>
+ * would be broken into 8 <code>Token</code>s: the first representing
+ * <code>int</code>, the second whitespace, the third <code>i</code>, the fourth
+ * whitespace, the fifth <code>=</code>, etc.<p>
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+public abstract class Token implements TokenTypes {
+
+	/**
+	 * The text this token represents.  This is implemented as a segment so we
+	 * can point directly to the text in the document without having to make a
+	 * copy of it.
+	 */
+	public char[] text;
+	public int textOffset;
+	public int textCount;
+	
+	/**
+	 * The offset into the document at which this token resides.
+	 */
+	public int offset;
+
+	/**
+	 * The type of token this is; for example, {@link #FUNCTION}.
+	 */
+	public int type;
+
+	/**
+	 * Whether this token is a hyperlink.
+	 */
+	private boolean hyperlink;
+
+	/**
+	 * The next token in this linked list.
+	 */
+	private Token nextToken;
+
+	/**
+	 * Rectangle used for filling token backgrounds.
+	 */
+	private Rectangle2D.Float bgRect;
+
+	/**
+	 * Micro-optimization; buffer used to compute tab width.  If the width is
+	 * correct it's not re-allocated, to prevent lots of very small garbage.
+	 * Only used when painting tab lines.
+	 */
+	private static char[] tabBuf;
+
+
+	/**
+	 * Creates a "null token."  The token itself is not null; rather, it
+	 * signifies that it is the last token in a linked list of tokens and
+	 * that it is not part of a "multi-line token."
+	 */
+	public Token() {
+		this.text = null;
+		this.textOffset = -1;
+		this.textCount = -1;
+		this.type = NULL;
+		offset = -1;
+		hyperlink = false;
+		nextToken = null;
+		bgRect = new Rectangle2D.Float();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param startOffset The offset into the document at which this
+	 *        token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public Token(final char[] line, final int beg, final int end,
+							final int startOffset, final int type) {
+		this();
+		set(line, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Creates this token as a deep copy of the passed-in token.
+	 *
+	 * @param t2 The token from which to make a copy.
+	 */
+	public Token(Token t2) {
+		this();
+		copyFrom(t2);
+	}
+
+
+	/**
+	 * Appends HTML code for painting this token, using the given text area's
+	 * color scheme.
+	 *
+	 * @param sb The buffer to append to.
+	 * @param textArea The text area whose color scheme to use.
+	 * @param fontFamily Whether to include the font family in the HTML for
+	 *        this token.  You can pass <code>false</code> for this parameter
+	 *        if, for example, you are making all your HTML be monospaced,
+	 *        and don't want any crazy fonts being used in the editor to be
+	 *        reflected in your HTML.
+	 * @return The buffer appended to.
+	 * @see #getHTMLRepresentation(RSyntaxTextArea)
+	 */
+	public StringBuffer appendHTMLRepresentation(StringBuffer sb,
+											RSyntaxTextArea textArea,
+											boolean fontFamily) {
+		return appendHTMLRepresentation(sb, textArea, fontFamily, false);
+	}
+
+
+	/**
+	 * Appends HTML code for painting this token, using the given text area's
+	 * color scheme.
+	 *
+	 * @param sb The buffer to append to.
+	 * @param textArea The text area whose color scheme to use.
+	 * @param fontFamily Whether to include the font family in the HTML for
+	 *        this token.  You can pass <code>false</code> for this parameter
+	 *        if, for example, you are making all your HTML be monospaced,
+	 *        and don't want any crazy fonts being used in the editor to be
+	 *        reflected in your HTML.
+	 * @param tabsToSpaces Whether to convert tabs into spaces.
+	 * @return The buffer appended to.
+	 * @see #getHTMLRepresentation(RSyntaxTextArea)
+	 */
+	public StringBuffer appendHTMLRepresentation(StringBuffer sb,
+								RSyntaxTextArea textArea, boolean fontFamily,
+								boolean tabsToSpaces) {
+
+		SyntaxScheme colorScheme = textArea.getSyntaxScheme();
+		Style scheme = colorScheme.getStyle(type);
+		Font font = textArea.getFontForTokenType(type);//scheme.font;
+
+		if (font.isBold()) sb.append("<b>");
+		if (font.isItalic()) sb.append("<em>");
+		if (scheme.underline || isHyperlink()) sb.append("<u>");
+
+		sb.append("<font");
+		if (fontFamily) {
+			sb.append(" face=\"").append(font.getFamily()).append("\"");
+		}
+		sb.append(" color=\"").
+			append(getHTMLFormatForColor(scheme.foreground)).
+			append("\">");
+
+		// NOTE: Don't use getLexeme().trim() because whitespace tokens will
+		// be turned into NOTHING.
+		appendHtmlLexeme(textArea, sb, tabsToSpaces);
+
+		sb.append("</font>");
+		if (scheme.underline || isHyperlink()) sb.append("</u>");
+		if (font.isItalic()) sb.append("</em>");
+		if (font.isBold()) sb.append("</b>");
+
+		return sb;
+
+	}
+
+
+	/**
+	 * Appends an HTML version of the lexeme of this token (i.e. no style
+	 * HTML, but replacing chars such as <code>\t</code>, <code>&lt;</code>
+	 * and <code>&gt;</code> with their escapes).
+	 *
+	 * @param textArea The text area.
+	 * @param sb The buffer to append to.
+	 * @param tabsToSpaces Whether to convert tabs into spaces.
+	 * @return The same buffer.
+	 */
+	private final StringBuffer appendHtmlLexeme(RSyntaxTextArea textArea,
+								StringBuffer sb, boolean tabsToSpaces) {
+
+		boolean lastWasSpace = false;
+		int i = textOffset;
+		int lastI = i;
+		String tabStr = null;
+
+		while (i<textOffset+textCount) {
+			char ch = text[i];
+			switch (ch) {
+				case ' ':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					sb.append(lastWasSpace ? "&nbsp;" : " ");
+					lastWasSpace = true;
+					break;
+				case '\t':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					if (tabsToSpaces && tabStr==null) {
+						tabStr = "";
+						for (int j=0; j<textArea.getTabSize(); j++) {
+							tabStr += "&nbsp;";
+						}
+					}
+					sb.append(tabsToSpaces ? tabStr : "&#09;");
+					lastWasSpace = false;
+					break;
+				case '<':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					sb.append("&lt;");
+					lastWasSpace = false;
+					break;
+				case '>':
+					sb.append(text, lastI, i-lastI);
+					lastI = i+1;
+					sb.append("&gt;");
+					lastWasSpace = false;
+					break;
+				default:
+					lastWasSpace = false;
+					break;
+			}
+			i++;
+		}
+		if (lastI<textOffset+textCount) {
+			sb.append(text, lastI, textOffset+textCount-lastI);
+		}
+		return sb;
+	}
+
+
+	/**
+	 * Returns whether the token straddles the specified position in the
+	 * document.
+	 *
+	 * @param pos The position in the document to check.
+	 * @return Whether the specified position is straddled by this token.
+	 */
+	public boolean containsPosition(int pos) {
+		return pos>=offset && pos<offset+textCount;
+	}
+
+
+	/**
+	 * Makes one token point to the same text segment, and have the same value
+	 * as another token.
+	 *
+	 * @param t2 The token from which to copy.
+	 */
+	public void copyFrom(Token t2) {
+		text = t2.text;
+		textOffset = t2.textOffset;
+		textCount = t2.textCount;
+		offset = t2.offset;
+		type = t2.type;
+		nextToken = t2.nextToken;
+	}
+
+
+	/**
+	 * Returns the position in the token's internal char array corresponding
+	 * to the specified document position.<p>
+	 * Note that this method does NOT do any bounds checking; you can pass in
+	 * a document position that does not correspond to a position in this
+	 * token, and you will not receive an Exception or any other notification;
+	 * it is up to the caller to ensure valid input.
+	 *
+	 * @param pos A position in the document that is represented by this token.
+	 * @return The corresponding token position >= <code>textOffset</code> and
+	 *         < <code>textOffset+textCount</code>.
+	 * @see #tokenToDocument
+	 */
+	public int documentToToken(int pos) {
+		return pos + (textOffset-offset);
+	}
+
+
+	/**
+	 * Returns whether this token's lexeme ends with the specified characters.
+	 *
+	 * @param ch The characters.
+	 * @return Whether this token's lexeme ends with the specified characters.
+	 * @see #startsWith(char[])
+	 */
+	public boolean endsWith(char[] ch) {
+		if (ch==null || ch.length>textCount) {
+			return false;
+		}
+		final int start = textOffset + textCount - ch.length;
+		for (int i=0; i<ch.length; i++) {
+			if (text[start+i]!=ch[i]) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+
+	/**
+	 * Returns a <code>String</code> of the form "#xxxxxx" good for use
+	 * in HTML, representing the given color.
+	 *
+	 * @param color The color to get a string for.
+	 * @return The HTML form of the color.  If <code>color</code> is
+	 *         <code>null</code>, <code>#000000</code> is returned.
+	 */
+	private static final String getHTMLFormatForColor(Color color) {
+		if (color==null) {
+			return "black";
+		}
+		String hexRed = Integer.toHexString(color.getRed());
+		if (hexRed.length()==1)
+			hexRed = "0" + hexRed;
+		String hexGreen = Integer.toHexString(color.getGreen());
+		if (hexGreen.length()==1)
+			hexGreen = "0" + hexGreen;
+		String hexBlue = Integer.toHexString(color.getBlue());
+		if (hexBlue.length()==1)
+			hexBlue = "0" + hexBlue;
+		return "#" + hexRed + hexGreen + hexBlue;
+	}
+
+
+	/**
+	 * Returns a <code>String</code> containing HTML code for painting this
+	 * token, using the given text area's color scheme.
+	 *
+	 * @param textArea The text area whose color scheme to use.
+	 * @return The HTML representation of the token.
+	 * @see #appendHTMLRepresentation(StringBuffer, RSyntaxTextArea, boolean)
+	 */
+	public String getHTMLRepresentation(RSyntaxTextArea textArea) {
+		StringBuffer buf = new StringBuffer();
+		appendHTMLRepresentation(buf, textArea, true);
+		return buf.toString();
+	}
+
+
+	/**
+	 * Returns the last token in this list that is not whitespace or a
+	 * comment.
+	 *
+	 * @return The last non-comment, non-whitespace token, or <code>null</code>
+	 *         if there isn't one.
+	 */
+	public Token getLastNonCommentNonWhitespaceToken() {
+
+		Token last = null;
+
+		for (Token t=this; t!=null && t.isPaintable(); t=t.nextToken) {
+			switch (t.type) {
+				case COMMENT_DOCUMENTATION:
+				case COMMENT_EOL:
+				case COMMENT_MULTILINE:
+				case WHITESPACE:
+					break;
+				default:
+					last = t;
+					break;
+			}
+		}
+
+		return last;
+
+	}
+
+
+	/**
+	 * Returns the last paintable token in this token list, or <code>null</code>
+	 * if there is no paintable token.
+	 *
+	 * @return The last paintable token in this token list.
+	 */
+	public Token getLastPaintableToken() {
+		Token t = this;
+		while (t.isPaintable()) {
+			if (t.nextToken==null || !t.nextToken.isPaintable()) {
+				return t;
+			}
+			t = t.nextToken;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the text of this token, as a string.<p>
+	 *
+	 * Note that this method isn't used much by the
+	 * <code>rsyntaxtextarea</code> package internally, as it tries to limit
+	 * memory allocation.
+	 *
+	 * @return The text of this token.
+	 */
+	public String getLexeme() {
+		return new String(text, textOffset, textCount);
+	}
+
+
+	/**
+	 * Determines the offset into this token list (i.e., into the
+	 * document) that covers pixel location <code>x</code> if the token list
+	 * starts at pixel location <code>x0</code><p>.
+	 * This method will return the document position "closest" to the
+	 * x-coordinate (i.e., if they click on the "right-half" of the
+	 * <code>w</code> in <code>awe</code>, the caret will be placed in
+	 * between the <code>w</code> and <code>e</code>; similarly, clicking on
+	 * the left-half places the caret between the <code>a</code> and
+	 * <code>w</code>).  This makes it useful for methods such as
+	 * <code>viewToModel</code> found in <code>javax.swing.text.View</code>
+	 * subclasses.<p>
+	 *
+	 * This method is abstract so subclasses who paint themselves differently
+	 * (i.e., {@link VisibleWhitespaceToken} is painted a tad differently than
+	 * {@link DefaultToken} when rendering hints are enabled) can still return
+	 * accurate results.
+	 *
+	 * @param textArea The text area from which the token list was derived.
+	 * @param e How to expand tabs.
+	 * @param x0 The pixel x-location that is the beginning of
+	 *        <code>tokenList</code>.
+	 * @param x The pixel-position for which you want to get the corresponding
+	 *        offset.
+	 * @return The position (in the document, NOT into the token list!) that
+	 *         covers the pixel location.  If <code>tokenList</code> is
+	 *         <code>null</code> or has type <code>Token.NULL</code>, then
+	 *         <code>-1</code is returned; the caller should recognize this and
+	 *         return the actual end position of the (empty) line.
+	 */
+	public abstract int getListOffset(RSyntaxTextArea textArea, TabExpander e,
+								float x0, float x);
+
+
+	/**
+	 * Returns the token after this one in the linked list.
+	 *
+	 * @return The next token.
+	 * @see #setNextToken
+	 */
+	public Token getNextToken() {
+		return nextToken;
+	}
+
+
+	/**
+	 * Returns the position in the document that represents the last character
+	 * in the token that will fit into <code>endBeforeX-startX</code> pixels.
+	 * For example, if you're using a monospaced 8-pixel-per-character font,
+	 * have the token "while" and <code>startX</code> is <code>0</code> and
+	 * <code>endBeforeX</code> is <code>30</code>, this method will return the
+	 * document position of the "i" in "while", because the "i" ends at pixel
+	 * <code>24</code>, while the "l" ends at <code>32</code>.  If not even the
+	 * first character fits in <code>endBeforeX-startX</code>, the first
+	 * character's position is still returned so calling methods don't go into
+	 * infinite loops.
+	 *
+	 * @param textArea The text area in which this token is being painted.
+	 * @param e How to expand tabs.
+	 * @param startX The x-coordinate at which the token will be painted.  This
+	 *        is needed because of tabs.
+	 * @param endBeforeX The x-coordinate for which you want to find the last
+	 *        character of <code>t</code> which comes before it.
+	 * @return The last document position that will fit in the specified amount
+	 *         of pixels.
+	 */
+	/*
+	 * @see #getTokenListOffsetBeforeX
+	 * FIXME:  This method does not compute correctly!  It needs to be abstract
+	 * and implemented by subclasses.
+	 */
+	public int getOffsetBeforeX(RSyntaxTextArea textArea, TabExpander e,
+							float startX, float endBeforeX) {
+
+		FontMetrics fm = textArea.getFontMetricsForTokenType(type);
+		int i = textOffset;
+		int stop = i + textCount;
+		float x = startX;
+
+		while (i<stop) {
+			if (text[i]=='\t')
+				x = e.nextTabStop(x, 0);
+			else
+				x += fm.charWidth(text[i]);
+			if (x>endBeforeX) {
+				// If not even the first character fits into the space, go
+				// ahead and say the first char does fit so we don't go into
+				// an infinite loop.
+				int intoToken = Math.max(i-textOffset, 1);
+				return offset + intoToken;
+			}
+			i++;
+		}
+
+		// If we got here, the whole token fit in (endBeforeX-startX) pixels.
+		return offset + textCount - 1;
+
+	}
+
+
+	/**
+	 * Returns the width of this token given the specified parameters.
+	 *
+	 * @param textArea The text area in which the token is being painted.
+	 * @param e Describes how to expand tabs.  This parameter cannot be
+	 *        <code>null</code>.
+	 * @param x0 The pixel-location at which the token begins.  This is needed
+	 *        because of tabs.
+	 * @return The width of the token, in pixels.
+	 * @see #getWidthUpTo
+	 */
+	public float getWidth(RSyntaxTextArea textArea, TabExpander e, float x0) {
+		return getWidthUpTo(textCount, textArea, e, x0);
+	}
+
+
+	/**
+	 * Returns the width of a specified number of characters in this token.
+	 * For example, for the token "while", specifying a value of <code>3</code>
+	 * here returns the width of the "whi" portion of the token.<p>
+	 *
+	 * This method is abstract so subclasses who paint themselves differently
+	 * (i.e., {@link VisibleWhitespaceToken} is painted a tad differently than
+	 * {@link DefaultToken} when rendering hints are enabled) can still return
+	 * accurate results.
+	 *
+	 * @param numChars The number of characters for which to get the width.
+	 * @param textArea The text area in which the token is being painted.
+	 * @param e How to expand tabs.  This value cannot be <code>null</code>.
+	 * @param x0 The pixel-location at which this token begins.  This is needed
+	 *        because of tabs.
+	 * @return The width of the specified number of characters in this token.
+	 * @see #getWidth
+	 */
+	public abstract float getWidthUpTo(int numChars, RSyntaxTextArea textArea,
+										TabExpander e, float x0);
+
+
+	/**
+	 * Returns whether this token is of the specified type, with the specified
+	 * lexeme.<p>
+	 * This method is preferred over the other overload in performance-critical
+	 * code where this operation may be called frequently, since it does not
+	 * involve any String allocations.
+	 *
+	 * @param type The type to check for.
+	 * @param lexeme The lexeme to check for.
+	 * @return Whether this token has that type and lexeme.
+	 * @see #is(int, String)
+	 * @see #startsWith(char[])
+	 */
+	public boolean is(int type, char[] lexeme) {
+		if (this.type==type && textCount==lexeme.length) {
+			for (int i=0; i<textCount; i++) {
+				if (text[textOffset+i]!=lexeme[i]) {
+					return false;
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether this token is of the specified type, with the specified
+	 * lexeme.<p>
+	 * The other overload of this method is preferred over this one in
+	 * performance-critical code, as this one involves a String allocation
+	 * while the other does not.
+	 *
+	 * @param type The type to check for.
+	 * @param lexeme The lexeme to check for.
+	 * @return Whether this token has that type and lexeme.
+	 * @see #is(int, char[])
+	 */
+	public boolean is(int type, String lexeme) {
+		return this.type==type && textCount==lexeme.length() &&
+				lexeme.equals(getLexeme());
+	}
+
+
+	/**
+	 * Returns whether this token is a comment.
+	 *
+	 * @return Whether this token is a comment.
+	 * @see #isWhitespace()
+	 */
+	public boolean isComment() {
+		return type>=Token.COMMENT_EOL && type<=Token.COMMENT_MARKUP;
+	}
+
+
+	/**
+	 * Returns whether this token is a hyperlink.
+	 *
+	 * @return Whether this token is a hyperlink.
+	 * @see #setHyperlink(boolean)
+	 */
+	public boolean isHyperlink() {
+		return hyperlink;
+	}
+
+
+	/**
+	 * Returns whether this token is an identifier.
+	 *
+	 * @return Whether this token is an identifier.
+	 */
+	public boolean isIdentifier() {
+		return type==IDENTIFIER;
+	}
+
+
+	/**
+	 * Returns whether this token is a {@link #SEPARATOR} representing a single
+	 * left curly brace.
+	 *
+	 * @return Whether this token is a left curly brace.
+	 * @see #isRightCurly()
+	 */
+	public boolean isLeftCurly() {
+		return type==SEPARATOR && isSingleChar('{');
+	}
+
+
+	/**
+	 * Returns whether this token is a {@link #SEPARATOR} representing a single
+	 * right curly brace.
+	 *
+	 * @return Whether this token is a right curly brace.
+	 * @see #isLeftCurly()
+	 */
+	public boolean isRightCurly() {
+		return type==SEPARATOR && isSingleChar('}');
+	}
+
+
+	/**
+	 * Returns whether or not this token is "paintable;" i.e., whether or not
+	 * the type of this token is one such that it has an associated syntax
+	 * style.  What this boils down to is whether the token type is greater
+	 * than <code>Token.NULL</code>.
+	 *
+	 * @return Whether or not this token is paintable.
+	 */
+	public boolean isPaintable() {
+		return type>Token.NULL;
+	}
+
+
+	/**
+	 * Returns whether this token is the specified single character.
+	 *
+	 * @param ch The character to check for.
+	 * @return Whether this token's lexeme is the single character specified.
+	 */
+	public boolean isSingleChar(char ch) {
+		return textCount==1 && text[textOffset]==ch;
+	}
+
+
+	/**
+	 * Returns whether or not this token is whitespace.
+	 *
+	 * @return <code>true</code> iff this token is whitespace.
+	 * @see #isComment()
+	 */
+	public boolean isWhitespace() {
+		return type==WHITESPACE;
+	}
+
+
+	/**
+	 * Returns the bounding box for the specified document location.  The
+	 * location must be in the specified token list; if it isn't,
+	 * <code>null</code> is returned.
+	 *
+	 * @param textArea The text area from which the token list was derived.
+	 * @param e How to expand tabs.
+	 * @param pos The position in the document for which to get the bounding
+	 *        box in the view.
+	 * @param x0 The pixel x-location that is the beginning of
+	 *        <code>tokenList</code>.
+	 * @param rect The rectangle in which we'll be returning the results.  This
+	 *        object is reused to keep from frequent memory allocations.
+	 * @return The bounding box for the specified position in the model.
+	 */
+	public abstract Rectangle listOffsetToView(RSyntaxTextArea textArea,
+								TabExpander e, int pos, int x0,
+								Rectangle rect);
+
+
+	/**
+	 * Makes this token start at the specified offset into the document.
+	 *
+	 * @param pos The offset into the document this token should start at.
+	 *        Note that this token must already contain this position; if
+	 *        it doesn't, an exception is thrown.
+	 * @throws IllegalArgumentException If pos is not already contained by
+	 *         this token.
+	 * @see #moveOffset(int)
+	 */
+	public void makeStartAt(int pos) {
+		if (pos<offset || pos>=(offset+textCount)) {
+			throw new IllegalArgumentException("pos " + pos +
+				" is not in range " + offset + "-" + (offset+textCount-1));
+		}
+		int shift = pos - offset;
+		offset = pos;
+		textOffset += shift;
+		textCount -= shift;
+	}
+
+
+	/**
+	 * Moves the starting offset of this token.
+	 *
+	 * @param amt The amount to move the starting offset.  This should be
+	 *        between <code>0</code> and <code>textCount</code>, inclusive.
+	 * @throws IllegalArgumentException If <code>amt</code> is an invalid value.
+	 * @see #makeStartAt(int)
+	 */
+	public void moveOffset(int amt) {
+		if (amt<0 || amt>textCount) {
+			throw new IllegalArgumentException("amt " + amt +
+					" is not in range 0-" + textCount);
+		}
+		offset += amt;
+		textOffset += amt;
+		textCount -= amt;
+	}
+
+
+	/**
+	 * Paints this token.
+	 *
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public final float paint(Graphics2D g, float x, float y,
+						RSyntaxTextArea host, TabExpander e) {
+		return paint(g, x,y, host, e, 0);
+	}
+
+
+	/**
+	 * Paints this token.
+	 *
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @param clipStart The left boundary of the clip rectangle in which we're
+	 *        painting.  This optimizes painting by allowing us to not paint
+	 *        paint when this token is "to the left" of the clip rectangle.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public abstract float paint(Graphics2D g, float x, float y,
+							RSyntaxTextArea host,
+							TabExpander e, float clipStart);
+
+
+	/**
+	 * Paints the background of a token.
+	 *
+	 * @param x The x-coordinate of the token.
+	 * @param y The y-coordinate of the token.
+	 * @param width The width of the token (actually, the width of the part of
+	 *        the token to paint).
+	 * @param height The height of the token.
+	 * @param g The graphics context with which to paint.
+	 * @param fontAscent The ascent of the token's font.
+	 * @param host The text area.
+	 * @param color The color with which to paint.
+	 */
+	protected void paintBackground(float x, float y, float width, float height,
+							Graphics2D g, int fontAscent,
+							RSyntaxTextArea host, Color color) {
+		// RSyntaxTextArea's bg can be null, so we must check for this.
+		Color temp = host.getBackground();
+		g.setXORMode(temp!=null ? temp : Color.WHITE);
+		g.setColor(color);
+		bgRect.setRect(x,y-fontAscent, width,height);
+		g.fill(bgRect);
+		g.setPaintMode();
+	}
+
+
+	/**
+	 * Paints dotted "tab" lines; that is, lines that show where your caret
+	 * would go to on the line if you hit "tab".  This visual effect is usually
+	 * done in the leading whitespace token(s) of lines.
+	 *
+	 * @param x The starting x-offset of this token.  It is assumed that this
+	 *        is the left margin of the text area (may be non-zero due to
+	 *        insets), since tab lines are only painted for leading whitespace.
+	 * @param y The baseline where this token was painted.
+	 * @param endX The ending x-offset of this token.
+	 * @param g The graphics context.
+	 * @param e Used to expand tabs.
+	 * @param host The text area.
+	 */
+	protected void paintTabLines(int x, int y, int endX, Graphics2D g,
+								TabExpander e, RSyntaxTextArea host) {
+
+		// We allow tab lines to be painted in more than just Token.WHITESPACE,
+		// i.e. for MLC's and Token.IDENTIFIERS (for TokenMakers that return
+		// whitespace as identifiers for performance).  But we only paint tab
+		// lines for the leading whitespace in the token.  So, if this isn't a
+		// WHITESPACE token, figure out the leading whitespace's length.
+		if (type!=Token.WHITESPACE) {
+			int offs = textOffset;
+			for (; offs<textOffset+textCount; offs++) {
+				if (!RSyntaxUtilities.isWhitespace(text[offs])) {
+					break; // MLC text, etc.
+				}
+			}
+			int len = offs - textOffset;
+			if (len<2) { // Must be at least two whitespaces to see tab line
+				return;
+			}
+			//endX = x + (int)getWidthUpTo(len, host, e, x);
+			endX = (int)getWidthUpTo(len, host, e, 0);
+		}
+
+		// Get the length of a tab.
+		FontMetrics fm = host.getFontMetricsForTokenType(type);
+		int tabSize = host.getTabSize();
+		if (tabBuf==null || tabBuf.length<tabSize) {
+			tabBuf = new char[tabSize];
+			for (int i=0; i<tabSize; i++) {
+				tabBuf[i] = ' ';
+			}
+		}
+		// Note different token types (MLC's, whitespace) could possibly be
+		// using different fonts, which means we can't cache the actual width
+		// of a tab as it may be different per-token-type.  We could keep a
+		// per-token-type cache, but we'd have to clear it whenever they
+		// modified token styles.
+		int tabW = fm.charsWidth(tabBuf, 0, tabSize);
+
+		// Draw any tab lines.  Here we're assuming that "x" is the left
+		// margin of the editor.
+		g.setColor(host.getTabLineColor());
+		int x0 = x + tabW;
+		int y0 = y - fm.getAscent();
+		if ((y0&1)>0) {
+			// Only paint on even y-pixels to prevent doubling up between lines
+			y0++;
+		}
+		while (x0<endX) {
+			int y1 = y0;
+			int y2 = y0 + host.getLineHeight();
+			while (y1<y2) {
+				g.drawLine(x0, y1, x0, y1);
+				y1 += 2;
+			}
+			//g.drawLine(x0,y0, x0,y0+host.getLineHeight());
+			x0 += tabW;
+		}
+
+	}
+
+
+	/**
+	 * Sets the value of this token to a particular segment of a document.
+	 * The "next token" value is cleared.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param offset The offset into the document at which this token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public void set(final char[] line, final int beg, final int end,
+							final int offset, final int type) {
+		this.text = line;
+		this.textOffset = beg;
+		this.textCount = end - beg + 1;
+		this.type = type;
+		this.offset = offset;
+		nextToken = null;
+	}
+
+
+	/**
+	 * Sets whether this token is a hyperlink.
+	 *
+	 * @param hyperlink Whether this token is a hyperlink.
+	 * @see #isHyperlink()
+	 */
+	public void setHyperlink(boolean hyperlink) {
+		this.hyperlink = hyperlink;
+	}
+
+
+	/**
+	 * Sets the "next token" pointer of this token to point to the specified
+	 * token.
+	 *
+	 * @param nextToken The new next token.
+	 * @see #getNextToken()
+	 */
+	public void setNextToken(Token nextToken) {
+		this.nextToken = nextToken;
+	}
+
+
+	/**
+	 * Returns whether this token starts with the specified characters.
+	 *
+	 * @param chars The characters.
+	 * @return Whether this token starts with those characters.
+	 * @see #endsWith(char[])
+	 * @see #is(int, char[])
+	 */
+	public boolean startsWith(char[] chars) {
+		if (chars.length<=textCount){
+			for (int i=0; i<chars.length; i++) {
+				if (text[textOffset+i]!=chars[i]) {
+					return false;
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns the position in the document corresponding to the specified
+	 * position in this token's internal char array (<code>textOffset</code> -
+	 * <code>textOffset+textCount-1</code>).<p>
+	 * Note that this method does NOT do any bounds checking; you can pass in
+	 * an invalid token position, and you will not receive an Exception or any
+	 * other indication that the returned document position is invalid.  It is
+	 * up to the user to ensure valid input.
+	 *
+	 * @param pos A position in the token's internal char array
+	 *        (<code>textOffset</code> - <code>textOffset+textCount</code>).
+	 * @return The corresponding position in the document.
+	 * @see #documentToToken(int)
+	 */
+	public int tokenToDocument(int pos) {
+		return pos + (offset-textOffset);
+	}
+
+
+	/**
+	 * Returns this token as a <code>String</code>, which is useful for
+	 * debugging.
+	 *
+	 * @return A string describing this token.
+	 */
+	public String toString() {
+		return "[Token: " +
+			(type==Token.NULL ? "<null token>" :
+				"text: '" +
+					(text==null ? "<null>" : getLexeme() + "'; " +
+	       		"offset: " + offset + "; type: " + type + "; " +
+		   		"isPaintable: " + isPaintable() +
+		   		"; nextToken==null: " + (nextToken==null))) +
+		   "]";
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenFactory.java	(revision 25584)
@@ -0,0 +1,66 @@
+/*
+ * 10/28/2004
+ *
+ * TokenFactory.java - Interface for a class that generates tokens of some type.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * Interface for a class that generates tokens somehow.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+interface TokenFactory {
+
+
+	/**
+	 * Returns a null token.
+	 *
+	 * @return A null token.
+	 */
+	public Token createToken();
+
+
+	/**
+	 * Returns a token.
+	 *
+	 * @param line The segment from which to get the token's text.
+	 * @param beg The starting offset of the token's text in the segment.
+	 * @param end The ending offset of the token's text in the segment.
+	 * @param startOffset The offset in the document of the token.
+	 * @param type The type of token.
+	 * @return The token.
+	 */
+	public Token createToken(final Segment line, final int beg,
+					final int end, final int startOffset, final int type);
+
+
+	/**
+	 * Returns a token.
+	 *
+	 * @param line The char array from which to get the token's text.
+	 * @param beg The starting offset of the token's text in the char array.
+	 * @param end The ending offset of the token's text in the char array.
+	 * @param startOffset The offset in the document of the token.
+	 * @param type The type of token.
+	 * @return The token.
+	 */
+	public Token createToken(final char[] line, final int beg,
+					final int end, final int startOffset, final int type);
+
+
+	/**
+	 * Resets the state of this token maker, if necessary.
+	 * FIXME:  Improve documentation.
+	 */
+	public void resetAllTokens();
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMaker.java	(revision 25584)
@@ -0,0 +1,165 @@
+/*
+ * 02/24/2004
+ *
+ * TokenMaker.java - An object that can take a chunk of text and return a
+ * linked list of <code>Token</code>s representing it.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.Action;
+import javax.swing.text.Segment;
+
+
+/**
+ * An implementation of <code>TokenMaker</code> is a class that turns text into
+ * a linked list of <code>Token</code>s for syntax highlighting
+ * in a particular language.
+ *
+ * @see Token
+ * @see AbstractTokenMaker
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public interface TokenMaker {
+
+
+	/**
+	 * Adds a null token to the end of the current linked list of tokens.
+	 * This should be put at the end of the linked list whenever the last
+	 * token on the current line is NOT a multi-line token.
+	 */
+	public void addNullToken();
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array from which to get the text.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *        occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+							int startOffset);
+
+
+	/**
+	 * Returns whether this programming language uses curly braces
+	 * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.
+	 *
+	 * @return Whether curly braces denote code blocks.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks();
+
+
+	/**
+	 * Returns the last token on this line's type if the token is "unfinished",
+	 * or {@link Token#NULL} if it was finished.  For example, if C-style
+	 * syntax highlighting is being implemented, and <code>text</code>
+	 * contained a line of code that contained the beginning of a comment but
+	 * no end-comment marker ("*\/"), then this method would return
+	 * {@link Token#COMMENT_MULTILINE} for that line.  This is useful
+	 * for doing syntax highlighting.
+	 *
+	 * @param text The line of tokens to examine.
+	 * @param initialTokenType The token type to start with (i.e., the value
+	 *        of <code>getLastTokenTypeOnLine</code> for the line before
+	 *        <code>text</code>).
+	 * @return The last token on this line's type, or {@link Token#NULL}
+	 *         if the line was completed.
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType);
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.  A <code>null</code> value for either means there
+	 *         is no string to add for that part.  A value of
+	 *         <code>null</code> for the array means this language
+	 *         does not support commenting/uncommenting lines.
+	 */
+	public String[] getLineCommentStartAndEnd();
+
+
+	/**
+	 * Returns an action to handle "insert break" key presses (i.e. Enter).
+	 *
+	 * @return The action, or <code>null</code> if the default action should
+	 *         be used.
+	 */
+	public Action getInsertBreakAction();
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type);
+
+
+	/**
+	 * If a line ends in the specified token, this method returns whether
+	 * a new line inserted after that line should be indented.
+	 *
+	 * @param token The token the previous line ends with.
+	 * @return Whether the next line should be indented.
+	 */
+	public boolean getShouldIndentNextLineAfter(Token token);
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType,
+											int startOffset);
+
+
+	/**
+	 * Returns whether this language is a markup language.
+	 *
+	 * @return Whether this language is markup.
+	 */
+	public boolean isMarkupLanguage();
+
+
+	/**
+	 * Returns whether whitespace is visible.
+	 *
+	 * @return Whether whitespace is visible.
+	 * @see #setWhitespaceVisible(boolean)
+	 */
+	public boolean isWhitespaceVisible();
+
+
+	/**
+	 * Sets whether tokens are generated that "show" whitespace.
+	 *
+	 * @param visible Whether whitespace should be visible.
+	 * @see #isWhitespaceVisible()
+	 */
+	public void setWhitespaceVisible(boolean visible);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java	(revision 25584)
@@ -0,0 +1,246 @@
+/*
+ * 08/26/2004
+ *
+ * TokenMakerBase.java - A base class for token makers.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.Action;
+import javax.swing.text.Segment;
+
+
+/**
+ * Base class for token makers.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+abstract class TokenMakerBase implements TokenMaker {
+
+	/**
+	 * The first token in the returned linked list.
+	 */
+	protected Token firstToken;
+	
+	/**
+	 * Used in the creation of the linked list.
+	 */
+	protected Token currentToken;
+	
+	/**
+	 * Used in the creation of the linked list.
+	 */
+	protected Token previousToken;
+
+	/**
+	 * The factory that gives us our tokens to use.
+	 */
+	private TokenFactory tokenFactory;
+
+
+	/**
+	 * Constructor.
+	 */
+	public TokenMakerBase() {
+		firstToken = currentToken = previousToken = null;
+		tokenFactory = new DefaultTokenFactory();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addNullToken() {
+		if (firstToken==null) {
+			firstToken = tokenFactory.createToken();
+			currentToken = firstToken;
+		}
+		else {
+			currentToken.setNextToken(tokenFactory.createToken());
+			previousToken = currentToken;
+			currentToken = currentToken.getNextToken();
+		}
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param segment <code>Segment</code> to get text from.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *        occurs.
+	 */
+	public void addToken(Segment segment, int start, int end, int tokenType,
+							int startOffset) {
+		addToken(segment.array, start,end, tokenType, startOffset);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset) {
+		addToken(array, start, end, tokenType, startOffset, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *        occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+
+		if (firstToken==null) {
+			firstToken = tokenFactory.createToken(array, start, end,
+									startOffset, tokenType);
+			currentToken = firstToken; // previous token is still null.
+		}
+		else {
+			currentToken.setNextToken(tokenFactory.createToken(array,
+								start,end, startOffset, tokenType));
+			previousToken = currentToken;
+			currentToken = currentToken.getNextToken();
+		}
+
+		currentToken.setHyperlink(hyperlink);
+
+	}
+
+
+	/**
+	 * Returns whether this programming language uses curly braces
+	 * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.<p>
+	 *
+	 * The default implementation returns <code>false</code>; subclasses can
+	 * override this method if necessary.
+	 *
+	 * @return Whether curly braces denote code blocks.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return false;
+	}
+
+
+	/**
+	 * Returns an action to handle "insert break" key presses (i.e. Enter).
+	 * The default implementation returns <code>null</code>.  Subclasses
+	 * can override.
+	 *
+	 * @return The default implementation always returns <code>null</code>.
+	 */
+	public Action getInsertBreakAction() {
+		return null;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+
+		// Last parameter doesn't matter if we're not painting.
+		Token t = getTokenList(text, initialTokenType, 0);
+
+		while (t.getNextToken()!=null)
+			t = t.getNextToken();
+
+		return t.type;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.  The default
+	 * implementation returns true if <tt>type</tt> is {@link Token#IDENTIFIER}.
+	 * Subclasses can override this method to support other token types, such
+	 * as {@link Token#VARIABLE}.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER;
+	}
+
+
+	/**
+	 * The default implementation returns <code>false</code> always.  Languages
+	 * that wish to better support auto-indentation can override this method.
+	 *
+	 * @param token The token the previous line ends with.
+	 * @return Whether the next line should be indented.
+	 */
+	public boolean getShouldIndentNextLineAfter(Token token) {
+		return false;
+	}
+
+
+	/**
+	 * The default implementation returns <code>false</code> always.
+	 * Subclasses that are highlighting a markup language should override this
+	 * method to return <code>true</code>.
+	 *
+	 * @return <code>false</code> always.
+	 */
+	public boolean isMarkupLanguage() {
+		return false;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isWhitespaceVisible() {
+		return tokenFactory instanceof VisibleWhitespaceTokenFactory;
+	}
+
+
+	/**
+	 * Deletes the linked list of tokens so we can begin anew.  This should
+	 * never have to be called by the programmer, as it is automatically
+	 * called whenever the user calls
+	 * {@link #getLastTokenTypeOnLine(Segment, int)} or
+	 * {@link #getTokenList(Segment, int, int)}.
+	 */
+	protected void resetTokenList() {
+		firstToken = currentToken = previousToken = null;
+		tokenFactory.resetAllTokens();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setWhitespaceVisible(boolean visible) {
+		// FIXME:  Initialize with the proper sizes.
+		tokenFactory = visible ? new VisibleWhitespaceTokenFactory() :
+									new DefaultTokenFactory();
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java	(revision 25584)
@@ -0,0 +1,136 @@
+/*
+ * 12/12/2008
+ *
+ * TokenMakerFactory.java - A factory for TokenMakers.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.fife.ui.rsyntaxtextarea.modes.PlainTextTokenMaker;
+
+
+/**
+ * A factory that maps syntax styles to {@link TokenMaker}s capable of splitting
+ * text into tokens for those syntax styles.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class TokenMakerFactory {
+
+	/**
+	 * If this system property is set, a custom <code>TokenMakerFactory</code>
+	 * of the specified class will be used as the default token maker factory.
+	 */
+	public static final String PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY	=
+														"TokenMakerFactory";
+
+	/**
+	 * The singleton default <code>TokenMakerFactory</code> instance.
+	 */
+	private static TokenMakerFactory DEFAULT_INSTANCE;
+
+
+	/**
+	 * Creates and returns a mapping from keys to the names of
+	 * {@link TokenMaker} implementation classes.  When
+	 * {@link #getTokenMaker(String)} is called with a key defined in this
+	 * map, a <code>TokenMaker</code> of the corresponding type is returned.
+	 *
+	 * @return The map.
+	 */
+	protected abstract Map createTokenMakerKeyToClassNameMap();
+
+
+	/**
+	 * Returns the default <code>TokenMakerFactory</code> instance.  This is
+	 * the factory used by all {@link RSyntaxDocument}s by default.
+	 *
+	 * @return The factory.
+	 * @see #setDefaultInstance(TokenMakerFactory)
+	 */
+	public static synchronized TokenMakerFactory getDefaultInstance() {
+		if (DEFAULT_INSTANCE==null) {
+			String clazz = null;
+			try {
+				clazz= System.getProperty(PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY);
+			} catch (java.security.AccessControlException ace) {
+				clazz = null; // We're in an applet; take default.
+			}
+			if (clazz==null) {
+				clazz = "org.fife.ui.rsyntaxtextarea.DefaultTokenMakerFactory";
+			}
+			try {
+				DEFAULT_INSTANCE = (TokenMakerFactory)Class.forName(clazz).
+													newInstance();
+			} catch (RuntimeException re) { // FindBugs
+				throw re;
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new InternalError("Cannot find TokenMakerFactory: " +
+											clazz);
+			}
+		}
+		return DEFAULT_INSTANCE;
+	}
+
+
+	/**
+	 * Returns a {@link TokenMaker} for the specified key.
+	 *
+	 * @param key The key.
+	 * @return The corresponding <code>TokenMaker</code>, or
+	 *         {@link PlainTextTokenMaker} if none matches the specified key.
+	 */
+	public final TokenMaker getTokenMaker(String key) {
+		TokenMaker tm = getTokenMakerImpl(key);
+		if (tm==null) {
+			tm = new PlainTextTokenMaker();
+		}
+		return tm;
+	}
+
+
+	/**
+	 * Returns a {@link TokenMaker} for the specified key.
+	 *
+	 * @param key The key.
+	 * @return The corresponding <code>TokenMaker</code>, or <code>null</code>
+	 *         if none matches the specified key.
+	 */
+	protected abstract TokenMaker getTokenMakerImpl(String key);
+
+
+	/**
+	 * Returns the set of keys that this factory maps to token makers.
+	 *
+	 * return The set of keys.
+	 */
+	public abstract Set keySet();
+
+
+	/**
+	 * Sets the default <code>TokenMakerFactory</code> instance.  This is
+	 * the factory used by all future {@link RSyntaxDocument}s by default.
+	 * <code>RSyntaxDocument</code>s that have already been created are not
+	 * affected.
+	 *
+	 * @param tmf The factory.
+	 * @throws IllegalArgumentException If <code>tmf</code> is
+	 *         <code>null</code>.
+	 * @see #getDefaultInstance()
+	 */
+	public static synchronized void setDefaultInstance(TokenMakerFactory tmf) {
+		if (tmf==null) {
+			throw new IllegalArgumentException("tmf cannot be null");
+		}
+		DEFAULT_INSTANCE = tmf;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMap.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMap.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenMap.java	(revision 25584)
@@ -0,0 +1,276 @@
+/*
+ * 08/26/2004
+ *
+ * TokenMap.java - Similar to a Map in Java, only designed specifically for
+ * org.fife.ui.rsyntaxtextarea.Tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * A hash table for reserved words, etc. defined by a {@link TokenMaker}.
+ * This class is designed for the quick lookup of tokens, as it can compare
+ * <code>Segment</code>s without the need to allocate a new string.<p>
+ *
+ * The <code>org.fife.ui.rsyntaxtextarea</code> package uses this class to help
+ * identify reserved words in programming languages.  An instance of
+ * {@link TokenMaker} will create and initialize an instance of this class
+ * containing all reserved words, data types, and all other words that need to
+ * be syntax-highlighted for that particular language.  When the token maker
+ * parses a line and identifies an individual token, it is looked up in the
+ * <code>TokenMap</code> to see if it should be syntax-highlighted.
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class TokenMap {
+
+	private int size;
+	private TokenMapToken[] tokenMap;
+	private boolean ignoreCase;
+
+	private static final int DEFAULT_TOKEN_MAP_SIZE = 52;
+
+
+	/**
+	 * Constructs a new token map that is case-sensitive.
+	 */
+	public TokenMap() {
+		this(DEFAULT_TOKEN_MAP_SIZE);
+	}
+
+
+	/**
+	 * Constructs a new token map that is case-sensitive.
+	 *
+	 * @param size The size of the token map.
+	 */
+	public TokenMap(int size) {
+		this(size, false);
+	}
+
+
+	/**
+	 * Constructs a new token map.
+	 *
+	 * @param ignoreCase Whether or not this token map should ignore case
+	 *        when comparing tokens.
+	 */
+	public TokenMap(boolean ignoreCase) {
+		this(DEFAULT_TOKEN_MAP_SIZE, ignoreCase);
+	}
+
+
+	/**
+	 * Constructs a new token map.
+	 *
+	 * @param size The size of the token map.
+	 * @param ignoreCase Whether or not this token map should ignore case
+	 *        when comparing tokens.
+	 */
+	public TokenMap(int size, boolean ignoreCase) {
+		this.size = size;
+		tokenMap = new TokenMapToken[size];
+		this.ignoreCase = ignoreCase;
+	}
+
+
+	/**
+	 * Adds a token to a specified bucket in the token map.
+	 *
+	 * @param bucket The bucket in which to add the token.
+	 * @param token The token to add.
+	 */
+	private void addTokenToBucket(int bucket, TokenMapToken token) {
+		TokenMapToken old = tokenMap[bucket];
+		token.nextToken = old;
+		tokenMap[bucket] = token;
+	}
+
+
+	/**
+	 * Returns the token type associated with the given text, if the given
+	 * text is in this token map.  If it isn't, <code>-1</code> is returned.
+	 *
+	 * @param text The segment from which to get the text to compare.
+	 * @param start The starting index in the segment of the text.
+	 * @param end The ending index in the segment of the text.
+	 * @return The token type associated with the given text, or
+	 *         <code>-1</code> if this token was not specified in this map.
+	 */
+	public int get(Segment text, int start, int end) {
+		return get(text.array, start, end);
+	}
+
+
+	/**
+	 * Returns the token type associated with the given text, if the given
+	 * text is in this token map.  If it isn't, <code>-1</code> is returned.
+	 *
+	 * @param array1 An array of characters containing the text.
+	 * @param start The starting index in the array of the text.
+	 * @param end The ending index in the array of the text.
+	 * @return The token type associated with the given text, or
+	 *         <code>-1</code> if this token was not specified in this map.
+	 */
+	public int get(char[] array1, int start, int end) {
+
+		int length1 = end - start + 1;
+
+		int hash = getHashCode(array1, start, length1);
+		TokenMapToken token = tokenMap[hash];
+
+		char[] array2;
+		int offset2;
+		int offset1;
+		int length;
+
+		/* We check whether or not to ignore case before doing any looping to
+		 * minimize the number of extraneous comparisons we do.  This makes
+		 * for slightly redundant code, but it'll be a little more efficient.
+		 */
+
+		// If matches are case-sensitive (C, C++, Java, etc.)...
+		if (ignoreCase==false) {
+
+		mainLoop:
+			while (token!=null) {
+				if (token.length==length1) {
+					array2  = token.text;
+					offset2 = token.offset;
+					offset1 = start;
+					length  = length1;
+					while (length-- > 0) {
+						if (array1[offset1++]!=array2[offset2++]) {
+							token = token.nextToken;
+							continue mainLoop;
+						}
+					}
+					return token.tokenType;
+				}
+				token = token.nextToken;
+			}
+
+		}
+
+		// If matches are NOT case-sensitive (HTML)...
+		// Note that all tokens saved in this map were converted to
+		// lower-case already.
+		else {
+
+		mainLoop2:
+			while (token!=null) {
+				if (token.length==length1) {
+					array2  = token.text;
+					offset2 = token.offset;
+					offset1 = start;
+					length  = length1;
+					while (length-- > 0) {
+						if (RSyntaxUtilities.toLowerCase(
+							array1[offset1++]) != array2[offset2++]) {
+							token = token.nextToken;
+							continue mainLoop2;
+						}
+					}
+					return token.tokenType;
+				}
+				token = token.nextToken;
+			}
+
+		}
+
+		// Didn't match any of the tokens in the bucket.
+		return -1;
+
+	}
+
+
+	/**
+	 * Returns the hash code for a given string.
+	 *
+	 * @param text The text to hash.
+	 * @param offset The offset into the text at which to start hashing.
+	 * @param length The last character in the text to hash.
+	 * @return The hash code.
+	 */
+	private final int getHashCode(char[] text, int offset, int length) {
+		return (RSyntaxUtilities.toLowerCase(text[offset]) +
+				RSyntaxUtilities.toLowerCase(text[offset+length-1])) % size;
+	}
+
+
+	/**
+	 * Returns whether this token map ignores case when checking for tokens.
+	 * This property is set in the constructor and cannot be changed, as this
+	 * is an intrinsic property of a particular programming language.
+	 *
+	 * @return Whether or not this token maker is ignoring case.
+	 */
+	protected boolean isIgnoringCase() {
+		return ignoreCase;
+	}
+
+
+	/**
+	 * Adds a string to this token map.
+	 *
+	 * @param string The string to add.
+	 * @param tokenType The type of token the string is.
+	 */
+	public void put(final String string, final int tokenType) {
+		if (isIgnoringCase())
+			put(string.toLowerCase().toCharArray(), tokenType);
+		else
+			put(string.toCharArray(), tokenType);
+	}
+
+
+	/**
+	 * Adds a string to this token map.  The char array passed-in will be used
+	 * as the actual data for the token, so it may well be modified (such as
+	 * lower-casing it if <code>ignoreCase</code> is <code>true</code>).  This
+	 * shouldn't be an issue though as this method is only called from the
+	 * public <code>put</code> method, which allocates a new char array.
+	 *
+	 * @param string The string to add.
+	 * @param tokenType The type of token the string is.
+	 */
+	private void put(char[] string, int tokenType) {
+		int hashCode = getHashCode(string, 0, string.length);
+		addTokenToBucket(hashCode, new TokenMapToken(string, tokenType));
+	}
+
+
+	/**
+	 * The "token" used by a token map.  Note that this isn't the same thing
+	 * as the {@link Token} class, but it's basically a 1-1 correspondence
+	 * for reserved words, etc.
+	 */
+	private static class TokenMapToken {
+
+		char[] text;
+		int offset;
+		int length;
+		int tokenType;
+		TokenMapToken nextToken;
+
+		TokenMapToken(char[] text, int tokenType) {
+			this.text = text;
+			this.offset = 0;
+			this.length = text.length;
+			this.tokenType = tokenType;
+		}
+
+		public String toString() {
+			return "[TokenMapToken: " + new String(text,offset,length) + "]";
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java	(revision 25584)
@@ -0,0 +1,61 @@
+/*
+ * 08/06/2004
+ *
+ * TokenOrientedView.java - An interface for the syntax-highlighting token-
+ * oriented views for token-oriented methods.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An interface for the syntax-highlighting token oriented views for
+ * token-oriented methods.  This way callers won't need to know what specific
+ * class a view is an instance of to access its tokens.<p>
+ *
+ * Currently, this interface is only useful for obtaining token lists for
+ * "physical lines" (i.e., a word-wrapped view's logical lines may be
+ * represented as several physical lines, thus getting the "physical line" above
+ * a given position may prove complicated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public interface TokenOrientedView {
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line above the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * a plain (non-wrapped) view, this is simply the token list for the
+	 * logical line above the line containing <code>offset</code>, since lines
+	 * are not wrapped.  For a wrapped view, this may or may not be tokens from
+	 * the same line.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         before this one.  If no physical line is above the one
+	 *         containing <code>offset</code>, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineAbove(int offset);
+
+
+	/**
+	 * Returns a token list for the <i>physical</i> line below the physical
+	 * line containing the specified offset into the document.  Note that for
+	 * a plain (non-wrapped) view, this is simply the token list for the
+	 * logical line below the line containing <code>offset</code>, since lines
+	 * are not wrapped.  For a wrapped view, this may or may not be tokens from
+	 * the same line.
+	 *
+	 * @param offset The offset in question.
+	 * @return A token list for the physical (and in this view, logical) line
+	 *         after this one.  If no physical line is after the one
+	 *         containing <code>offset</code>, <code>null</code> is returned.
+	 */
+	public Token getTokenListForPhysicalLineBelow(int offset);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenTypes.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenTypes.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/TokenTypes.java	(revision 25584)
@@ -0,0 +1,81 @@
+/*
+ * 12/04/2011
+ *
+ * TokenTypes.java - All token types supported by RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * All token types supported by RSyntaxTextArea.<p>
+ *
+ * Note that all valid token types are &gt;= 0, so extensions of the TokenMaker
+ * class are free to internally use all ints &lt; 0 ONLY for "end-of-line"
+ * style markers; they are ignored by painting implementations.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface TokenTypes {
+
+	/**
+	 * Tokens of type <code>NULL</code> mark the end of lines with no
+	 * multi-line token at the end (such as a block comment in C++).
+	 */
+	public static final int NULL							= 0;
+
+	public static final int COMMENT_EOL						= 1;
+	public static final int COMMENT_MULTILINE				= 2;
+	public static final int COMMENT_DOCUMENTATION			= 3;
+	public static final int COMMENT_KEYWORD					= 4;
+	public static final int COMMENT_MARKUP					= 5;
+
+	public static final int RESERVED_WORD					= 6;
+	public static final int RESERVED_WORD_2					= 7;
+
+	public static final int FUNCTION						= 8;
+
+	public static final int LITERAL_BOOLEAN					= 9;
+	public static final int LITERAL_NUMBER_DECIMAL_INT		= 10;
+	public static final int LITERAL_NUMBER_FLOAT			= 11;
+	public static final int LITERAL_NUMBER_HEXADECIMAL		= 12;
+	public static final int LITERAL_STRING_DOUBLE_QUOTE		= 13;
+	public static final int LITERAL_CHAR					= 14;
+	public static final int LITERAL_BACKQUOTE				= 15;
+
+	public static final int DATA_TYPE						= 16;
+
+	public static final int VARIABLE						= 17;
+
+	public static final int REGEX							= 18;
+
+	public static final int ANNOTATION						= 19;
+
+	public static final int IDENTIFIER						= 20;
+
+	public static final int WHITESPACE						= 21;
+
+	public static final int SEPARATOR						= 22;
+
+	public static final int OPERATOR						= 23;
+
+	public static final int PREPROCESSOR					= 24;
+
+	public static final int MARKUP_TAG_DELIMITER			= 25;
+	public static final int MARKUP_TAG_NAME					= 26;
+	public static final int MARKUP_TAG_ATTRIBUTE			= 27;
+	public static final int MARKUP_TAG_ATTRIBUTE_VALUE		= 28;
+	public static final int MARKUP_PROCESSING_INSTRUCTION	= 29;
+	public static final int MARKUP_CDATA					= 30;
+
+	public static final int ERROR_IDENTIFIER				= 31;
+	public static final int ERROR_NUMBER_FORMAT				= 32;
+	public static final int ERROR_STRING_DOUBLE 			= 33;
+	public static final int ERROR_CHAR						= 34;
+
+	public static final int NUM_TOKEN_TYPES					= 35;
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/URLFileLocation.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/URLFileLocation.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/URLFileLocation.java	(revision 25584)
@@ -0,0 +1,153 @@
+/*
+ * 11/13/2008
+ *
+ * URLFileLocation.java - The location of a file at a (remote) URL.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+
+
+/**
+ * The location of a file at a (remote) URL.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class URLFileLocation extends FileLocation {
+
+	/**
+	 * URL of the remote file.
+	 */
+	private URL url;
+
+	/**
+	 * A prettied-up full path of the URL (password removed, etc.).
+	 */
+	private String fileFullPath;
+
+	/**
+	 * A prettied-up filename (leading slash, and possibly "<code>%2F</code>",
+	 * removed).
+	 */
+	private String fileName;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param url The URL of the file.
+	 */
+	URLFileLocation(URL url) {
+		this.url = url;
+		fileFullPath = createFileFullPath();
+		fileName = createFileName();
+	}
+
+
+	/**
+	 * Creates a "prettied-up" URL to use.  This will be stripped of
+	 * sensitive information such as passwords.
+	 *
+	 * @return The full path to use.
+	 */
+	private String createFileFullPath() {
+		String fullPath = url.toString();
+		fullPath = fullPath.replaceFirst("://([^:]+)(?:.+)@", "://$1@");
+		return fullPath;
+	}
+
+
+	/**
+	 * Creates the "prettied-up" filename to use.
+	 *
+	 * @return The base name of the file of this URL.
+	 */
+	private String createFileName() {
+		String fileName = url.getPath();
+		if (fileName.startsWith("/%2F/")) { // Absolute path
+			fileName = fileName.substring(4);
+		}
+		else if (fileName.startsWith("/")) { // All others
+			fileName = fileName.substring(1);
+		}
+		return fileName;
+	}
+
+
+	/**
+	 * Returns the last time this file was modified, or
+	 * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be
+	 * computed (such as for a remote file).
+	 *
+	 * @return The last time this file was modified.  This will always be
+	 *         {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} for URL's.
+	 */
+	protected long getActualLastModified() {
+		return TextEditorPane.LAST_MODIFIED_UNKNOWN;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getFileFullPath() {
+		return fileFullPath;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getFileName() {
+		return fileName;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected InputStream getInputStream() throws IOException {
+		return url.openStream();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected OutputStream getOutputStream() throws IOException {
+		return url.openConnection().getOutputStream();
+	}
+
+
+	/**
+	 * Returns whether this file location is a local file.
+	 *
+	 * @return Whether this is a local file.
+	 * @see #isLocalAndExists()
+	 */
+	public boolean isLocal() {
+		return "file".equalsIgnoreCase(url.getProtocol());
+	}
+
+
+	/**
+	 * Returns whether this file location is a local file and already
+	 * exists.  This method always returns <code>false</code> since we
+	 * cannot check this value easily.
+	 *
+	 * @return <code>false</code> always.
+	 * @see #isLocal()
+	 */
+	public boolean isLocalAndExists() {
+		return false;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceToken.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceToken.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceToken.java	(revision 25584)
@@ -0,0 +1,241 @@
+/*
+ * 10/28/2004
+ *
+ * VisibleWhitespaceToken.java - Token that paints special symbols for its
+ * whitespace characters (space and tab).
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import javax.swing.text.Segment;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * This token class paints spaces and tabs with special symbols so the user
+ * can see the whitespace in his document.  Rendering hints are honored.<p>
+ *
+ * The current implementation paints as follows:
+ * <ul>
+ *   <li>The first tab or space, if any, is found in the token.</li>
+ *   <li>If a tab was found, all characters up to it are painted as a
+ *       group.</li>
+ *   <li>If a space was found, all characters up to and including it are
+ *       painted (it is painted with a special symbol to denote it as
+ *       a space).</li>
+ *   <li>If neither a tab nor a whitespace was found, all characters in the
+ *       token are painted.</li>
+ *   <li>Repeat until all characters are painted.</li>
+ * </ul>
+ * This means that rendering hints are applied to all groups of characters
+ * within a token, excluding whitespace and tabs.<p>
+ *
+ * A problem with this implementation is that FontMetrics.charsWidth() is still
+ * used to calculate the width of a group of chars painted.  Thus, the group of
+ * characters will be painted with the rendering hints specified, but the
+ * following tab (or group of characters if the current group was the end of a
+ * token) will not necessarily be painted at the proper x-coordinate (as
+ * FontMetrics.charsWidth() returns an <code>int</code> and not a
+ * <code>float</code>).  The way around this would be to calculate the token's
+ * width in such a way that a float is returned (Font.getStringBounds()?).
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ * @see Token
+ * @see DefaultToken
+ */
+public class VisibleWhitespaceToken extends DefaultToken {
+
+	private Rectangle2D.Float dotRect;
+
+
+	/**
+	 * Creates a "null token."  The token itself is not null; rather, it
+	 * signifies that it is the last token in a linked list of tokens and
+	 * that it is not part of a "multi-line token."
+	 */
+	public VisibleWhitespaceToken() {
+		super();
+		dotRect = new Rectangle2D.Float(0,0, 1,1);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param startOffset The offset into the document at which this
+	 *        token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public VisibleWhitespaceToken(final Segment line, final int beg,
+					final int end, final int startOffset, final int type) {
+		this(line.array, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param line The segment from which to get the token.
+	 * @param beg The first character's position in <code>line</code>.
+	 * @param end The last character's position in <code>line</code>.
+	 * @param startOffset The offset into the document at which this
+	 *        token begins.
+	 * @param type A token type listed as "generic" above.
+	 */
+	public VisibleWhitespaceToken(final char[] line, final int beg,
+					final int end, final int startOffset, final int type) {
+		super(line, beg,end, startOffset, type);
+	}
+
+
+	/**
+	 * Paints this token, using special symbols for whitespace characters.
+	 *
+	 * @param g The graphics context in which to paint.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 * @param host The text area this token is in.
+	 * @param e How to expand tabs.
+	 * @param clipStart The left boundary of the clip rectangle in which we're
+	 *        painting.  This optimizes painting by allowing us to not paint
+	 *        not paint when this token is "to the left" of the clip rectangle.
+	 * @return The x-coordinate representing the end of the painted text.
+	 */
+	public final float paint(Graphics2D g, float x, float y,
+						RSyntaxTextArea host, TabExpander e,
+						float clipStart) {
+
+		int origX = (int)x;
+		int end = textOffset + textCount;
+		float nextX = x;
+		int flushLen = 0;
+		int flushIndex = textOffset;
+		Color fg = host.getForegroundForToken(this);
+		Color bg = host.getBackgroundForTokenType(type);
+		g.setFont(host.getFontForTokenType(type));
+		FontMetrics fm = host.getFontMetricsForTokenType(type);
+
+		int ascent = fm.getAscent();
+		int height = fm.getHeight();
+
+		for (int i=textOffset; i<end; i++) {
+
+			switch (text[i]) {
+
+				case '\t':
+
+					// Fill in background.
+					nextX = x+fm.charsWidth(text, flushIndex,flushLen);
+					float nextNextX = e.nextTabStop(nextX, 0);
+					if (bg!=null) {
+						paintBackground(x,y, nextNextX-x,height, g,
+										ascent, host, bg);
+					}
+					g.setColor(fg);
+
+					// Paint chars cached before the tab.
+					if (flushLen > 0) {
+						g.drawChars(text, flushIndex, flushLen, (int)x,(int)y);
+						flushLen = 0;
+					}
+					flushIndex = i + 1;
+
+					// Draw an arrow representing the tab.
+					int halfHeight = height / 2;
+					int quarterHeight = halfHeight / 2;
+					int ymid = (int)y - ascent + halfHeight;
+					g.drawLine((int)nextX,ymid, (int)nextNextX,ymid);
+					g.drawLine((int)nextNextX,ymid, (int)nextNextX-4,ymid-quarterHeight);
+					g.drawLine((int)nextNextX,ymid, (int)nextNextX-4,ymid+quarterHeight);
+
+					x = nextNextX;
+					break;
+
+				case ' ':
+
+					// NOTE:  There is a little bit of a "fudge factor"
+					// here when "smooth text" is enabled, as "width"
+					// below may well not be the width given to the space
+					// by fm.charsWidth() (it depends on how it places the
+					// space with respect to the preceding character).
+					// But, we assume the approximation is close enough for
+					// our drawing a dot for the space.
+
+					// "flushLen+1" ensures text is aligned correctly (or,
+					// aligned the same as in getWidth()).
+					nextX = x+fm.charsWidth(text, flushIndex,flushLen+1);
+					int width = fm.charWidth(' ');
+
+					// Paint background.
+					if (bg!=null) {
+						paintBackground(x,y, nextX-x,height, g,
+										ascent, host, bg);
+					}
+					g.setColor(fg);
+
+					// Paint chars before space.
+					if (flushLen>0) {
+						g.drawChars(text, flushIndex, flushLen, (int)x,(int)y);
+						flushLen = 0;
+					}
+
+					// Paint a dot representing the space.
+					dotRect.x = nextX - width/2.0f; // "2.0f" for FindBugs
+					dotRect.y = y - ascent + height/2.0f; // Ditto
+					g.fill(dotRect);
+					flushIndex = i + 1;
+					x = nextX;
+					break;
+
+
+				case '\f':
+					// ???
+					// fall-through for now.
+
+				default:
+					flushLen += 1;
+					break;
+
+			}
+		}
+
+		nextX = x+fm.charsWidth(text, flushIndex,flushLen);
+
+		if (flushLen>0 && nextX>=clipStart) {
+			if (bg!=null) {
+				paintBackground(x,y, nextX-x,height, g,
+							ascent, host, bg);
+			}
+			g.setColor(fg);
+			g.drawChars(text, flushIndex, flushLen, (int)x,(int)y);
+		}
+
+		if (host.getUnderlineForToken(this)) {
+			g.setColor(fg);
+			int y2 = (int)(y+1);
+			g.drawLine(origX,y2, (int)nextX,y2);
+		}
+
+		// Don't check if it's whitespace - some TokenMakers may return types
+		// other than Token.WHITESPACE for spaces (such as Token.IDENTIFIER).
+		// This also allows us to paint tab lines for MLC's.
+		if (host.getPaintTabLines() && origX==host.getMargin().left) {// && isWhitespace()) {
+			paintTabLines(origX, (int)y, (int)nextX, g, e, host);
+		}
+
+		return nextX;
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenFactory.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenFactory.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenFactory.java	(revision 25584)
@@ -0,0 +1,56 @@
+/*
+ * 10/28/2004
+ *
+ * VisibleWhitespaceTokenFactory.java - Visible whitespace token factory.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * Token factory that generates tokens that display special symbols for the
+ * whitespace characters space and tab.<p>
+ *
+ * NOTE:  This class should only be used by {@link TokenMaker}; nobody else
+ * needs it!
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+class VisibleWhitespaceTokenFactory extends DefaultTokenFactory {
+
+
+	/**
+	 * Cosnstructor.
+	 */
+	public VisibleWhitespaceTokenFactory() {
+		this(DEFAULT_START_SIZE, DEFAULT_INCREMENT);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param size The initial number of tokens in this factory.
+	 * @param increment How many tokens to increment by when the stack gets
+	 *        empty.
+	 */
+	public VisibleWhitespaceTokenFactory(int size, int increment) {
+		super(size, increment);
+	}
+
+	/**
+	 * Creates a token for use internally by this token factory.  This method
+	 * should NOT be called externally; only by this class and possibly
+	 * subclasses.
+	 *
+	 * @return A token to add to this token factory's internal stack.
+	 */
+	protected Token createInternalUseOnlyToken() {
+		return new VisibleWhitespaceToken();
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java	(revision 25584)
@@ -0,0 +1,1167 @@
+/*
+ * 08/06/2004
+ *
+ * WrappedSyntaxView.java - Test implementation of WrappedSyntaxView that
+ * is also aware of RSyntaxTextArea's different fonts per token type.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import javax.swing.text.*;
+import javax.swing.text.Position.Bias;
+import javax.swing.event.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.Gutter;
+
+
+/**
+ * The view used by {@link RSyntaxTextArea} when word wrap is enabled.
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public class WrappedSyntaxView extends BoxView implements TabExpander,
+												RSTAView {
+
+	boolean widthChanging;
+	int tabBase;
+	int tabSize;
+    
+	/**
+	 * This is reused to keep from allocating/deallocating.
+	 */
+	private Segment s, drawSeg;
+	
+	/**
+	 * Another variable initialized once to keep from allocating/deallocating.
+	 */
+	private Rectangle tempRect;
+
+	/**
+	 * Cached for each paint() call so each drawView() call has access to it.
+	 */
+	private RSyntaxTextArea host;
+	private FontMetrics metrics;
+
+//	/**
+//	 * The end-of-line marker.
+//	 */
+//	private static final char[] eolMarker = { '.' };
+
+	/**
+	 * The width of this view cannot be below this amount, as if the width
+	 * is ever 0 (really a bug), we'll go into an infinite loop.
+	 */
+	private static final int MIN_WIDTH		= 20;
+
+
+	/**
+	 * Creates a new WrappedSyntaxView.  Lines will be wrapped
+	 * on character boundaries.
+	 *
+	 * @param elem the element underlying the view
+	 */
+	public WrappedSyntaxView(Element elem) {
+		super(elem, Y_AXIS);
+		s = new Segment();
+		drawSeg = new Segment();
+		tempRect = new Rectangle();
+	}
+
+
+
+	/**
+	 * This is called by the nested wrapped line
+	 * views to determine the break location.  This can
+	 * be reimplemented to alter the breaking behavior.
+	 * It will either break at word or character boundaries
+	 * depending upon the break argument given at
+	 * construction.
+	 */
+	protected int calculateBreakPosition(int p0, Token tokenList, float x0) {
+//System.err.println("------ beginning calculateBreakPosition() --------");
+		int p = p0;
+		RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+		float currentWidth = getWidth();
+		if (currentWidth==Integer.MAX_VALUE)
+			currentWidth = getPreferredSpan(X_AXIS);
+		// Make sure width>0; this is a huge hack to fix a bug where
+		// loading text into an RTextArea before it is visible if word wrap
+		// is enabled causes an infinite loop in calculateBreakPosition()
+		// because of the 0-width!  We cannot simply check in setSize()
+		// because the width is set to 0 somewhere else too somehow...
+		currentWidth = Math.max(currentWidth, MIN_WIDTH);
+		Token t = tokenList;
+		while (t!=null && t.isPaintable()) {
+// FIXME:  Replace the code below with the commented-out line below.  This will
+// allow long tokens to be broken at embedded spaces (such as MLC's).  But it
+// currently throws BadLocationExceptions sometimes...
+			float tokenWidth = t.getWidth(textArea, this, x0);
+			if (tokenWidth>currentWidth) {
+				// If the current token alone is too long for this line,
+				// break at a character boundary.
+				if (p==p0) {
+					return t.getOffsetBeforeX(textArea, this, 0, currentWidth);
+				}
+				// Return the first non-whitespace char (i.e., don't start
+				// off the continuation of a wrapped line with whitespace).
+				return t.isWhitespace() ? p+t.textCount : p;
+//return getBreakLocation(t, fm, x0, currentWidth, this);
+			}
+			currentWidth -= tokenWidth;
+			x0 += tokenWidth;
+			p += t.textCount;
+//System.err.println("*** *** *** token fit entirely (width==" + tokenWidth + "), adding " + t.textCount + " to p, now p==" + p);
+			t = t.getNextToken();
+		}
+//System.err.println("... ... whole line fits; returning p==" + p);
+//System.err.println("------ ending calculateBreakPosition() --------");
+
+//		return p;
+return p + 1;
+	}
+
+//private int getBreakLocation(Token t, FontMetrics fm, int x0, int x,
+//								TabExpander e) {
+//	Segment s = new Segment();
+//	s.array = t.text;
+//	s.offset = t.textOffset;
+//	s.count = t.textCount;
+//	return t.offset + Utilities.getBreakLocation(s, fm, x0, x, e, t.offset);
+//}
+
+	/**
+	 * Gives notification from the document that attributes were changed
+	 * in a location that this view is responsible for.
+	 *
+	 * @param e the change information from the associated document
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#changedUpdate
+	 */
+	public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+		updateChildren(e, a);
+	}
+
+
+	/**
+	 * Sets the allocation rectangle for a given line's view, but sets the
+	 * y value to the passed-in value.  This should be used instead of
+	 * {@link #childAllocation(int, Rectangle)} since it allows you to account
+	 * for hidden lines in collapsed fold regions.
+	 *
+	 * @param line
+	 * @param y
+	 * @param alloc
+	 */
+	private void childAllocation2(int line, int y, Rectangle alloc) {
+		alloc.x += getOffset(X_AXIS, line);
+		alloc.y += y;
+		alloc.width = getSpan(X_AXIS, line);
+		alloc.height = getSpan(Y_AXIS, line);
+	}
+
+
+	/**
+	 * Draws a single view (i.e., a line of text for a wrapped view),
+	 * wrapping the text onto multiple lines if necessary.
+	 *
+	 * @param g The graphics context in which to paint.
+	 * @param r The rectangle in which to paint.
+	 * @param view The <code>View</code> to paint.
+	 * @param fontHeight The height of the font being used.
+	 * @param y The y-coordinate at which to begin painting.
+	 */
+	protected void drawView(Graphics2D g, Rectangle r, View view,
+						int fontHeight, int y) {
+
+		float x = r.x;
+
+		LayeredHighlighter h = (LayeredHighlighter)host.getHighlighter();
+
+		RSyntaxDocument document = (RSyntaxDocument)getDocument();
+		Element map = getElement();
+
+		int p0 = view.getStartOffset();
+		int lineNumber = map.getElementIndex(p0);
+		int p1 = view.getEndOffset();// - 1;
+
+		setSegment(p0,p1-1, document, drawSeg);
+		//System.err.println("drawSeg=='" + drawSeg + "' (p0/p1==" + p0 + "/" + p1 + ")");
+		int start = p0 - drawSeg.offset;
+		Token token = document.getTokenListForLine(lineNumber);
+
+		// If this line is an empty line, then the token list is simply a
+		// null token.  In this case, the line highlight will be skipped in
+		// the loop below, so unfortunately we must manually do it here.
+		if (token!=null && token.type==Token.NULL) {
+			h.paintLayeredHighlights(g, p0,p1, r, host, this);
+			return;
+		}
+
+		// Loop through all tokens in this view and paint them!
+		while (token!=null && token.isPaintable()) {
+
+			int p = calculateBreakPosition(p0, token, x);
+			x = r.x;
+
+			h.paintLayeredHighlights(g, p0,p, r, host, this);
+
+			while (token!=null && token.isPaintable() && token.offset+token.textCount-1<p) {//<=p) {
+				x = token.paint(g, x,y, host, this);
+				token = token.getNextToken();
+			}
+			
+			if (token!=null && token.isPaintable() && token.offset<p) {
+				int tokenOffset = token.offset;
+				Token temp = new DefaultToken(drawSeg, tokenOffset-start,
+									p-1-start, tokenOffset,
+									token.type);
+				temp.paint(g, x,y, host, this);
+				temp = null;
+				token.makeStartAt(p);
+			}
+
+			p0 = (p==p0) ? p1 : p;
+			y += fontHeight;
+			
+		} // End of while (token!=null && token.isPaintable()).
+
+		// NOTE: We should re-use code from Token (paintBackground()) here,
+		// but don't because I'm just too lazy.
+		if (host.getEOLMarkersVisible()) {
+			g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+			g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+			g.drawString("\u00B6", x, y-fontHeight);
+		}
+
+	}
+
+
+	/**
+	 * Fetches the allocation for the given child view.<p>
+	 * Overridden to account for code folding.
+	 * 
+	 * @param index The index of the child, >= 0 && < getViewCount().
+	 * @param a The allocation to this view
+	 * @return The allocation to the child; or <code>null</code> if
+	 *         <code>a</code> is <code>null</code>; or <code>null</code> if the
+	 *         layout is invalid
+	 */
+	public Shape getChildAllocation(int index, Shape a) {
+		if (a != null) {
+			Shape ca = getChildAllocationImpl(index, a);
+			if ((ca != null) && (!isAllocationValid())) {
+				// The child allocation may not have been set yet.
+				Rectangle r = (ca instanceof Rectangle) ? (Rectangle) ca : ca
+						.getBounds();
+				if ((r.width == 0) && (r.height == 0)) {
+					return null;
+				}
+			}
+			return ca;
+		}
+		return null;
+	}
+
+	/**
+	 * Fetches the allocation for the given child view to render into.<p>
+	 * Overridden to account for lines hidden by collapsed folded regions.
+	 * 
+	 * @param line The index of the child, >= 0 && < getViewCount()
+	 * @param a The allocation to this view
+	 * @return The allocation to the child
+	 */
+	public Shape getChildAllocationImpl(int line, Shape a) {
+
+		Rectangle alloc = getInsideAllocation(a);
+		host = (RSyntaxTextArea)getContainer();
+		FoldManager fm = host.getFoldManager();
+		int y = alloc.y;
+
+		// TODO: Make cached getOffset() calls for Y_AXIS valid even for
+		// folding, to speed this up!
+		for (int i=0; i<line; i++) {
+			y += getSpan(Y_AXIS, i);
+			Fold fold = fm.getFoldForLine(i);
+			if (fold!=null && fold.isCollapsed()) {
+				i += fold.getCollapsedLineCount();
+			}
+		}
+
+		childAllocation2(line, y, alloc);
+		return alloc;
+
+	}
+
+
+	/**
+	 * Determines the maximum span for this view along an
+	 * axis.  This is implemented to provide the superclass
+	 * behavior after first making sure that the current font
+	 * metrics are cached (for the nested lines which use
+	 * the metrics to determine the height of the potentially
+	 * wrapped lines).
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return  the span the view would like to be rendered into.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @see View#getMaximumSpan
+	 */
+	public float getMaximumSpan(int axis) {
+		updateMetrics();
+		float span = super.getPreferredSpan(axis);
+		if (axis==View.X_AXIS) { // EOL marker
+			span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+		}
+		return span;
+	}
+
+
+	/**
+	 * Determines the minimum span for this view along an
+	 * axis.  This is implemented to provide the superclass
+	 * behavior after first making sure that the current font
+	 * metrics are cached (for the nested lines which use
+	 * the metrics to determine the height of the potentially
+	 * wrapped lines).
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return  the span the view would like to be rendered into.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @see View#getMinimumSpan
+	 */
+	public float getMinimumSpan(int axis) {
+		updateMetrics();
+		float span = super.getPreferredSpan(axis);
+		if (axis==View.X_AXIS) { // EOL marker
+			span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+		}
+		return span;
+	}
+
+
+	/**
+	 * Determines the preferred span for this view along an
+	 * axis.  This is implemented to provide the superclass
+	 * behavior after first making sure that the current font
+	 * metrics are cached (for the nested lines which use
+	 * the metrics to determine the height of the potentially
+	 * wrapped lines).
+	 *
+	 * @param axis may be either View.X_AXIS or View.Y_AXIS
+	 * @return  the span the view would like to be rendered into.
+	 *           Typically the view is told to render into the span
+	 *           that is returned, although there is no guarantee.  
+	 *           The parent may choose to resize or break the view.
+	 * @see View#getPreferredSpan
+	 */
+	public float getPreferredSpan(int axis) {
+		updateMetrics();
+		float span = 0;
+		if (axis==View.X_AXIS) { // Add EOL marker
+			span = super.getPreferredSpan(axis);
+			span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+		}
+		else {
+			span = super.getPreferredSpan(axis);
+			host = (RSyntaxTextArea)getContainer();
+			if (host.isCodeFoldingEnabled()) {
+				// TODO: Cache y-offsets again to speed this up
+				//System.out.println("y-axis baby");
+				int lineCount = host.getLineCount();
+				FoldManager fm = host.getFoldManager();
+				for (int i=0; i<lineCount; i++) {
+					if (fm.isLineHidden(i)) {
+						span -= getSpan(View.Y_AXIS, i);
+					}
+				}
+			}
+		}
+		return span;
+	}
+
+
+	/**
+	 * Returns the tab size set for the document, defaulting to 5.
+	 *
+	 * @return the tab size
+	 */
+	protected int getTabSize() {
+		Integer i = (Integer) getDocument().
+							getProperty(PlainDocument.tabSizeAttribute);
+		int size = (i != null) ? i.intValue() : 5;
+		return size;
+	}
+
+
+	/**
+	 * Overridden to allow for folded regions.
+	 */
+	protected View getViewAtPoint(int x, int y, Rectangle alloc) {
+
+		int lineCount = getViewCount();
+		int curY = alloc.y + getOffset(Y_AXIS, 0); // Always at least 1 line
+		host = (RSyntaxTextArea)getContainer();
+		FoldManager fm = host.getFoldManager();
+
+		for (int line=1; line<lineCount; line++) {
+			int span = getSpan(Y_AXIS, line-1);
+			if (y<curY+span) {
+				childAllocation2(line-1, curY, alloc);
+				return getView(line-1);
+			}
+			curY += span;
+			Fold fold = fm.getFoldForLine(line-1);
+			if (fold!=null && fold.isCollapsed()) {
+				line += fold.getCollapsedLineCount();
+			}
+		}
+
+		// Not found - return last line's view.
+		childAllocation2(lineCount - 1, curY, alloc);
+		return getView(lineCount - 1);
+
+	}
+
+
+	/**
+	 * Gives notification that something was inserted into the 
+	 * document in a location that this view is responsible for.
+	 * This is implemented to simply update the children.
+	 *
+	 * @param changes The change information from the associated document.
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#insertUpdate
+	 */
+	public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+		updateChildren(changes, a);
+		Rectangle alloc = ((a != null) && isAllocationValid()) ? 
+									getInsideAllocation(a) : null;
+		int pos = changes.getOffset();
+		View v = getViewAtPosition(pos, alloc);
+		if (v != null)
+			v.insertUpdate(changes, alloc, f);
+	}
+
+
+	/**
+	 * Loads all of the children to initialize the view.
+	 * This is called by the <code>setParent</code> method.
+	 * Subclasses can re-implement this to initialize their
+	 * child views in a different manner.  The default
+	 * implementation creates a child view for each 
+	 * child element.
+	 *
+	 * @param f the view factory
+	 */
+	protected void loadChildren(ViewFactory f) {
+		Element e = getElement();
+		int n = e.getElementCount();
+		if (n > 0) {
+			View[] added = new View[n];
+			for (int i = 0; i < n; i++)
+				added[i] = new WrappedLine(e.getElement(i));
+			replace(0, 0, added);
+		}
+	}
+
+
+	public Shape modelToView(int pos, Shape a, Position.Bias b)
+			throws BadLocationException {
+
+		if (! isAllocationValid()) {
+			Rectangle alloc = a.getBounds();
+			setSize(alloc.width, alloc.height);
+		}
+
+		boolean isBackward = (b == Position.Bias.Backward);
+		int testPos = (isBackward) ? Math.max(0, pos - 1) : pos;
+		if(isBackward && testPos < getStartOffset()) {
+			return null;
+		}
+
+		int vIndex = getViewIndexAtPosition(testPos);
+		if ((vIndex != -1) && (vIndex < getViewCount())) {
+			View v = getView(vIndex);
+			if(v != null && testPos >= v.getStartOffset() &&
+					testPos < v.getEndOffset()) {
+				Shape childShape = getChildAllocation(vIndex, a);
+				if (childShape == null) {
+					// We are likely invalid, fail.
+					return null;
+				}
+				Shape retShape = v.modelToView(pos, childShape, b);
+				if(retShape == null && v.getEndOffset() == pos) {
+					if(++vIndex < getViewCount()) {
+						v = getView(vIndex);
+						retShape = v.modelToView(pos, getChildAllocation(vIndex, a), b);
+					}
+				}
+				return retShape;
+			}
+		}
+
+		throw new BadLocationException("Position not represented by view", pos);
+
+	}
+
+
+	/**
+	 * Provides a mapping, for a given region, from the document model
+	 * coordinate space to the view coordinate space. The specified region is
+	 * created as a union of the first and last character positions.<p>
+	 *
+	 * This is implemented to subtract the width of the second character, as
+	 * this view's <code>modelToView</code> actually returns the width of the
+	 * character instead of "1" or "0" like the View implementations in
+	 * <code>javax.swing.text</code>.  Thus, if we don't override this method,
+	 * the <code>View</code> implementation will return one character's width
+	 * too much for its consumers (implementations of
+	 * <code>javax.swing.text.Highlighter</code>).
+	 *
+	 * @param p0 the position of the first character (>=0)
+	 * @param b0 The bias of the first character position, toward the previous
+	 *        character or the next character represented by the offset, in
+	 *        case the position is a boundary of two views; <code>b0</code>
+	 *        will have one of these values:
+	 * <ul>
+	 *    <li> <code>Position.Bias.Forward</code>
+	 *    <li> <code>Position.Bias.Backward</code>
+	 * </ul>
+	 * @param p1 the position of the last character (>=0)
+	 * @param b1 the bias for the second character position, defined
+	 *		one of the legal values shown above
+	 * @param a the area of the view, which encompasses the requested region
+	 * @return the bounding box which is a union of the region specified
+	 *		by the first and last character positions
+	 * @exception BadLocationException  if the given position does
+	 *   not represent a valid location in the associated document
+	 * @exception IllegalArgumentException if <code>b0</code> or
+	 *		<code>b1</code> are not one of the
+	 *		legal <code>Position.Bias</code> values listed above
+	 * @see View#viewToModel
+	 */
+	public Shape modelToView(int p0, Position.Bias b0,
+							int p1, Position.Bias b1,
+							Shape a) throws BadLocationException {
+
+		Shape s0 = modelToView(p0, a, b0);
+		Shape s1;
+		if (p1 ==getEndOffset()) {
+			try {
+				s1 = modelToView(p1, a, b1);
+			} catch (BadLocationException ble) {
+				s1 = null;
+			}
+			if (s1 == null) {
+				// Assume extends left to right.
+				Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+				s1 = new Rectangle(alloc.x + alloc.width - 1, alloc.y,
+								1, alloc.height);
+			}
+		}
+		else {
+			s1 = modelToView(p1, a, b1);
+		}
+		Rectangle r0 = s0.getBounds();
+		Rectangle r1 = (s1 instanceof Rectangle) ? (Rectangle) s1 :
+													s1.getBounds();
+		if (r0.y != r1.y) {
+			// If it spans lines, force it to be the width of the view.
+			Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+								a.getBounds();
+			r0.x = alloc.x;
+			r0.width = alloc.width;
+		}
+
+		r0.add(r1);
+		// The next line is the only difference between this method and
+		// View's implementation.  We're subtracting the width of the second
+		// character.  This is because this method is used by Highlighter
+		// implementations to get the area to "highlight", and if we don't do
+		// this, one character too many is highlighted thanks to our
+		// modelToView() implementation returning the actual width of the
+		// character requested!
+		if (p1>p0) r0.width -= r1.width;
+		return r0;
+
+	}
+
+
+	/**
+	 * Returns the next tab stop position after a given reference position.
+	 * This implementation does not support things like centering so it
+	 * ignores the tabOffset argument.
+	 *
+	 * @param x the current position >= 0
+	 * @param tabOffset the position within the text stream
+	 *   that the tab occurred at >= 0.
+	 * @return the tab stop, measured in points >= 0
+	 */
+	public float nextTabStop(float x, int tabOffset) {
+		if (tabSize == 0)
+			return x;
+		int ntabs = ((int) x - tabBase) / tabSize;
+		return tabBase + ((ntabs + 1) * tabSize);
+	}
+
+
+	/**
+	 * Paints the word-wrapped text.
+	 *
+	 * @param g The graphics context in which to paint.
+	 * @param a The shape (usually a rectangle) in which to paint.
+	 */
+	public void paint(Graphics g, Shape a) {
+
+		Rectangle alloc = (a instanceof Rectangle) ?
+							(Rectangle)a : a.getBounds();
+		tabBase = alloc.x;
+
+		Graphics2D g2d = (Graphics2D)g;
+		host = (RSyntaxTextArea)getContainer();
+		int ascent = host.getMaxAscent();
+		int fontHeight = host.getLineHeight();
+		FoldManager fm = host.getFoldManager();
+
+		int n = getViewCount();	// Number of lines.
+		int x = alloc.x + getLeftInset();
+		tempRect.y = alloc.y + getTopInset();
+		Rectangle clip = g.getClipBounds();
+		for (int i = 0; i < n; i++) {
+			tempRect.x = x + getOffset(X_AXIS, i);
+			//tempRect.y = y + getOffset(Y_AXIS, i);
+			tempRect.width = getSpan(X_AXIS, i);
+			tempRect.height = getSpan(Y_AXIS, i);
+			//System.err.println("For line " + i + ": tempRect==" + tempRect);
+			if (tempRect.intersects(clip)) {
+				View view = getView(i);
+				drawView(g2d, alloc, view, fontHeight, tempRect.y+ascent);
+			}
+			tempRect.y += tempRect.height;
+			Fold possibleFold = fm.getFoldForLine(i);
+			if (possibleFold!=null && possibleFold.isCollapsed()) {
+				i += possibleFold.getCollapsedLineCount();
+				// Visible indicator of collapsed lines
+				Color c = RSyntaxUtilities.getFoldedLineBottomColor(host);
+				if (c!=null) {
+					g.setColor(c);
+					g.drawLine(x,tempRect.y-1, alloc.width,tempRect.y-1);
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Gives notification that something was removed from the 
+	 * document in a location that this view is responsible for.
+	 * This is implemented to simply update the children.
+	 *
+	 * @param changes The change information from the associated document.
+	 * @param a the current allocation of the view
+	 * @param f the factory to use to rebuild if the view has children
+	 * @see View#removeUpdate
+	 */
+	public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+
+		updateChildren(changes, a);
+
+		Rectangle alloc = ((a != null) && isAllocationValid()) ? 
+									getInsideAllocation(a) : null;
+		int pos = changes.getOffset();
+		View v = getViewAtPosition(pos, alloc);
+		if (v != null)
+            v.removeUpdate(changes, alloc, f);
+
+	}
+
+
+	/**
+	 * Makes a <code>Segment</code> point to the text in our
+	 * document between the given positions.  Note that the positions MUST be
+	 * valid positions in the document.
+	 *
+	 * @param p0 The first position in the document.
+	 * @param p1 The second position in the document.
+	 * @param document The document from which you want to get the text.
+	 * @param seg The segment in which to load the text.
+	 */
+	private void setSegment(int p0, int p1, Document document,
+							Segment seg) {
+		try {
+//System.err.println("... in setSharedSegment, p0/p1==" + p0 + "/" + p1);
+			document.getText(p0, p1-p0, seg);
+			//System.err.println("... in setSharedSegment: s=='" + s + "'; line/numLines==" + line + "/" + numLines);
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * Sets the size of the view.  This should cause layout of the view along
+	 * the given axis, if it has any layout duties.
+	 *
+	 * @param width the width >= 0
+	 * @param height the height >= 0
+	 */
+	public void setSize(float width, float height) {
+		updateMetrics();
+		if ((int) width != getWidth()) {
+			// invalidate the view itself since the childrens
+			// desired widths will be based upon this views width.
+			preferenceChanged(null, true, true);
+			widthChanging = true;
+		}
+		super.setSize(width, height);
+		widthChanging = false;
+	}
+
+
+	/**
+	 * Update the child views in response to a 
+	 * document event.
+	 */
+	void updateChildren(DocumentEvent e, Shape a) {
+
+		Element elem = getElement();
+		DocumentEvent.ElementChange ec = e.getChange(elem);
+
+		// This occurs when syntax highlighting only changes on lines
+		// (i.e. beginning a multiline comment).
+		if (e.getType()==DocumentEvent.EventType.CHANGE) {
+			//System.err.println("Updating the damage due to a CHANGE event...");
+			// FIXME:  Make me repaint more intelligently.
+			getContainer().repaint();
+			//damageLineRange(startLine,endLine, a, host);
+		}
+
+		else if (ec != null) {
+
+			// the structure of this element changed.
+			Element[] removedElems = ec.getChildrenRemoved();
+			Element[] addedElems = ec.getChildrenAdded();
+			View[] added = new View[addedElems.length];
+
+			for (int i = 0; i < addedElems.length; i++)
+				added[i] = new WrappedLine(addedElems[i]);
+			//System.err.println("Replacing " + removedElems.length +
+			// " children with " + addedElems.length);
+			replace(ec.getIndex(), removedElems.length, added);
+
+			// should damge a little more intelligently.
+			if (a != null) {
+				preferenceChanged(null, true, true);
+				getContainer().repaint();
+			}
+
+		}
+
+		// update font metrics which may be used by the child views
+		updateMetrics();
+
+	}
+
+
+	final void updateMetrics() {
+		Component host = getContainer();
+		Font f = host.getFont();
+		metrics = host.getFontMetrics(f); // Metrics for the default font.
+		tabSize = getTabSize() * metrics.charWidth('m');
+	}
+
+
+	public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
+
+		int offs = -1;
+
+		if (! isAllocationValid()) {
+			Rectangle alloc = a.getBounds();
+			setSize(alloc.width, alloc.height);
+		}
+
+		// Get the child view for the line at (x,y), and ask it for the
+		// specific offset.
+		Rectangle alloc = getInsideAllocation(a);
+		View v = getViewAtPoint((int) x, (int) y, alloc);
+		if (v != null) {
+			offs = v.viewToModel(x, y, alloc, bias);
+		}
+
+		// Code folding may have hidden the last line.  If so, return the last
+		// visible offset instead of the last offset.
+		if (host.isCodeFoldingEnabled() && v==getView(getViewCount()-1) &&
+				offs==v.getEndOffset()-1) {
+			offs = host.getLastVisibleOffset();
+		}
+
+		return offs;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLine(Rectangle alloc, int line) throws BadLocationException {
+		return yForLineContaining(alloc,
+				getElement().getElement(line).getStartOffset());
+//return alloc.y + getOffset(Y_AXIS, line);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int yForLineContaining(Rectangle alloc, int offs)
+								throws BadLocationException {
+		if (isAllocationValid()) {
+			// TODO: make cached Y_AXIS offsets valid even with folding enabled
+			// to speed this back up!
+			Rectangle r = (Rectangle)modelToView(offs, alloc, Bias.Forward);
+			if (r!=null) {
+				if (host.isCodeFoldingEnabled()) {
+					int line = host.getLineOfOffset(offs);
+					FoldManager fm = host.getFoldManager();
+					if (fm.isLineHidden(line)) {
+						return -1;
+					}
+				}
+				return r.y;
+			}
+		}
+		return -1;
+	}
+
+
+	/**
+	 * Simple view of a line that wraps if it doesn't
+	 * fit withing the horizontal space allocated.
+	 * This class tries to be lightweight by carrying little 
+	 * state of it's own and sharing the state of the outer class 
+	 * with it's siblings.
+	 */
+	class WrappedLine extends View {
+
+		int nlines;
+
+		WrappedLine(Element elem) {
+			super(elem);
+		}
+
+		/**
+		 * Calculate the number of lines that will be rendered
+		 * by logical line when it is wrapped.
+		 */
+		final int calculateLineCount() {
+
+			int nlines = 0;
+			int startOffset = getStartOffset();
+			int p1 = getEndOffset();
+
+			// Get the token list for this line so we don't have to keep
+			// recomputing it if this logical line spans multiple physical
+			// lines.
+			RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			Element map = doc.getDefaultRootElement();
+			int line = map.getElementIndex(startOffset);
+			Token tokenList = doc.getTokenListForLine(line);
+			float x0 = 0;// FIXME:  should be alloc.x!! alloc.x;//0;
+
+
+//System.err.println(">>> calculateLineCount: " + startOffset + "-" + p1);
+			for (int p0=startOffset; p0<p1; ) {
+//System.err.println("... ... " + p0 + ", " + p1);
+				nlines += 1;
+				x0 = RSyntaxUtilities.makeTokenListStartAt(tokenList, p0,
+							WrappedSyntaxView.this, textArea, x0);
+				int p = calculateBreakPosition(p0, tokenList, x0);
+
+//System.err.println("... ... ... break position p==" + p);
+				p0 = (p == p0) ? ++p : p; // this is the fix of #4410243
+									// we check on situation when
+									// width is too small and
+									// break position is calculated
+									// incorrectly.
+//System.err.println("... ... ... new p0==" + p0);
+			}
+/*
+int numLines = 0;
+try {
+	numLines = textArea.getLineCount();
+} catch (BadLocationException ble) {
+	ble.printStackTrace();
+}
+System.err.println(">>> >>> calculated number of lines for this view (line " + line + "/" + numLines + ": " + nlines);
+*/
+			return nlines;
+		}
+
+		/**
+		 * Determines the preferred span for this view along an
+		 * axis.
+		 *
+		 * @param axis may be either X_AXIS or Y_AXIS
+		 * @return   the span the view would like to be rendered into.
+		 *           Typically the view is told to render into the span
+		 *           that is returned, although there is no guarantee.  
+		 *           The parent may choose to resize or break the view.
+		 * @see View#getPreferredSpan
+		 */
+		public float getPreferredSpan(int axis) {
+			switch (axis) {
+				case View.X_AXIS:
+					float width = getWidth();
+					if (width == Integer.MAX_VALUE) {
+						// We have been initially set to MAX_VALUE, but we don't
+						// want this as our preferred.
+						return 100f;
+					}
+					return width;
+				case View.Y_AXIS:
+					if (nlines == 0 || widthChanging)
+						nlines = calculateLineCount();
+					int h = nlines * ((RSyntaxTextArea)getContainer()).getLineHeight();
+					return h;
+				default:
+					throw new IllegalArgumentException("Invalid axis: " + axis);
+			}
+		}
+
+		/**
+		 * Renders using the given rendering surface and area on that
+		 * surface.  The view may need to do layout and create child
+		 * views to enable itself to render into the given allocation.
+		 *
+		 * @param g the rendering surface to use
+		 * @param a the allocated region to render into
+		 * @see View#paint
+		 */
+		public void paint(Graphics g, Shape a) {
+			// This is done by drawView() above.
+		}
+
+		/**
+		 * Provides a mapping from the document model coordinate space
+		 * to the coordinate space of the view mapped to it.
+		 *
+		 * @param pos the position to convert
+		 * @param a the allocated region to render into
+		 * @return the bounding box of the given position is returned
+		 * @exception BadLocationException  if the given position does not
+		 *            represent a valid location in the associated document.
+		 */
+		public Shape modelToView(int pos, Shape a, Position.Bias b)
+										throws BadLocationException {
+
+			//System.err.println("--- begin modelToView ---");
+			Rectangle alloc = a.getBounds();
+			RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+			alloc.height = textArea.getLineHeight();//metrics.getHeight();
+			alloc.width = 1;
+			int p0 = getStartOffset();
+			int p1 = getEndOffset();
+			int testP = (b == Position.Bias.Forward) ? pos :
+											Math.max(p0, pos - 1);
+
+			// Get the token list for this line so we don't have to keep
+			// recomputing it if this logical line spans multiple physical
+			// lines.
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			Element map = doc.getDefaultRootElement();
+			int line = map.getElementIndex(p0);
+			Token tokenList = doc.getTokenListForLine(line);
+			float x0 = alloc.x;//0;
+
+			while (p0 < p1) {
+				x0 = RSyntaxUtilities.makeTokenListStartAt(tokenList, p0,
+							WrappedSyntaxView.this, textArea, x0);
+				int p = calculateBreakPosition(p0, tokenList, x0);
+				if ((pos >= p0) && (testP<p)) {//pos < p)) {
+					// it's in this line
+					alloc = RSyntaxUtilities.getLineWidthUpTo(
+									textArea, s, p0, pos,
+									WrappedSyntaxView.this,
+									alloc, alloc.x);
+					//System.err.println("--- end modelToView ---");
+					return alloc;
+				}
+				//if (p == p1 && pos == p1) {
+				if (p==p1-1 && pos==p1-1) {
+					// Wants end.
+					if (pos > p0) {
+						alloc = RSyntaxUtilities.getLineWidthUpTo(
+									textArea, s, p0, pos,
+									WrappedSyntaxView.this,
+									alloc, alloc.x);
+					}
+					//System.err.println("--- end modelToView ---");
+					return alloc;
+				}
+
+				p0 = (p == p0) ? p1 : p;
+				//System.err.println("... ... Incrementing y");
+				alloc.y += alloc.height;
+
+			}
+
+			throw new BadLocationException(null, pos);
+
+		}
+
+		/**
+		 * Provides a mapping from the view coordinate space to the logical
+		 * coordinate space of the model.
+		 *
+		 * @param fx the X coordinate
+		 * @param fy the Y coordinate
+		 * @param a the allocated region to render into
+		 * @return the location within the model that best represents the
+		 *  given point in the view
+		 * @see View#viewToModel
+		 */
+		public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
+
+			// PENDING(prinz) implement bias properly
+			bias[0] = Position.Bias.Forward;
+
+			Rectangle alloc = (Rectangle) a;
+			RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+			int x = (int) fx;
+			int y = (int) fy;
+			if (y < alloc.y) {
+				// above the area covered by this icon, so the the position
+				// is assumed to be the start of the coverage for this view.
+				return getStartOffset();
+			}
+			else if (y > alloc.y + alloc.height) {
+				// below the area covered by this icon, so the the position
+				// is assumed to be the end of the coverage for this view.
+				return getEndOffset() - 1;
+			}
+			else {
+
+				// positioned within the coverage of this view vertically,
+				// so we figure out which line the point corresponds to.
+				// if the line is greater than the number of lines
+				// contained, then simply use the last line as it represents
+				// the last possible place we can position to.
+
+				RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+				alloc.height = textArea.getLineHeight();
+				int p1 = getEndOffset();
+
+				// Get the token list for this line so we don't have to keep
+				// recomputing it if this logical line spans multiple
+				// physical lines.
+				Element map = doc.getDefaultRootElement();
+				int p0 = getStartOffset();
+				int line = map.getElementIndex(p0);
+				Token tlist = doc.getTokenListForLine(line);
+
+				// Look at each physical line-chunk of this logical line.
+				while (p0<p1) {
+
+					// We can always use alloc.x since we always break
+					// lines so they start at the beginning of a physical
+					// line.
+					RSyntaxUtilities.makeTokenListStartAt(tlist, p0,
+						WrappedSyntaxView.this, textArea, alloc.x);
+					int p = calculateBreakPosition(p0, tlist, alloc.x);
+
+					// If desired view position is in this physical chunk.
+					if ((y>=alloc.y) && (y<(alloc.y+alloc.height))) {
+
+						// Point is to the left of the line
+						if (x < alloc.x) {
+							return p0;
+						}
+
+						// Point is to the right of the line
+						else if (x > alloc.x + alloc.width) {
+							return p - 1;
+						}
+
+						// Point is in this physical line!
+						else {
+
+							// Start at alloc.x since this chunk starts
+							// at the beginning of a physical line.
+							int n = tlist.getListOffset(textArea,
+										WrappedSyntaxView.this,
+										alloc.x, x);
+
+							// NOTE:  We needed to add the max() with
+							// p0 as getTokenListForLine returns -1
+							// for empty lines (just a null token).
+							// How did this work before?
+							// FIXME:  Have null tokens have their
+							// offset but a -1 length.
+							return Math.max(Math.min(n, p1-1), p0);
+
+						}  // End of else.
+
+					} // End of if ((y>=alloc.y) && ...
+
+					p0 = (p == p0) ? p1 : p;
+					alloc.y += alloc.height;
+
+				} // End of while (p0<p1).
+
+				return getEndOffset() - 1;
+
+			} // End of else.
+
+		}
+
+		private void handleDocumentEvent(DocumentEvent e, Shape a,
+											ViewFactory f) {
+			int n = calculateLineCount();
+			if (this.nlines != n) {
+				this.nlines = n;
+				WrappedSyntaxView.this.preferenceChanged(this, false, true);
+				// have to repaint any views after the receiver.
+				RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+				textArea.repaint();
+				// Must also revalidate container so gutter components, such
+				// as line numbers, get updated for this line's new height
+				Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+				if (gutter!=null) {
+					gutter.revalidate();
+					gutter.repaint();
+				}
+			}
+			else if (a != null) {
+				Component c = getContainer();
+				Rectangle alloc = (Rectangle) a;
+				c.repaint(alloc.x, alloc.y, alloc.width, alloc.height);
+			}
+		}
+
+		public void insertUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+			handleDocumentEvent(e, a, f);
+		}
+
+		public void removeUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+			handleDocumentEvent(e, a, f);
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java	(revision 25584)
@@ -0,0 +1,157 @@
+package org.fife.ui.rsyntaxtextarea;
+
+//import java.awt.Graphics;
+//import java.awt.Rectangle;
+//import java.awt.Shape;
+
+//import javax.swing.text.CompositeView;
+import javax.swing.text.Element;
+//import javax.swing.text.View;
+
+
+/**
+ * Replacement for the old <code>WrappedSyntaxView</code> class, designed to
+ * be faster with large wrapped documents.  Heavily based off of
+ * <code>BoxView</code>, but streamlined to only care about the y-axis, and
+ * takes code folding into account.<p>
+ *
+ * This class is not currently used.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class WrappedSyntaxView2 {//extends CompositeView {
+
+//	private Rectangle tempRect;
+//	private int[] cachedOffsets;
+//	private int[] cachedSpans;
+//	private boolean sizeRequirementsValid;
+
+
+	public WrappedSyntaxView2(Element root) {
+		//super(root);
+//		tempRect = new Rectangle();
+//		cachedOffsets = new int[0];
+//		cachedSpans = new int[0];
+//		sizeRequirementsValid = false;
+	}
+
+
+//	protected void childAllocation(int index, Rectangle alloc) {
+//		alloc.y += getOffset(index);
+//		alloc.height = getHeight(index);
+//	}
+//
+//
+//	private int getHeight(int childIndex) {
+//		return cachedSpans[childIndex];
+//	}
+//
+//
+//	private int getOffset(int childIndex) {
+//		return cachedOffsets[childIndex]; 
+//	}
+//
+//
+//	protected View getViewAtPoint(int x, int y, Rectangle alloc) {
+//		// TODO Auto-generated method stub
+//		return null;
+//	}
+//
+//
+//	/**
+//	 * @param alloc The allocated region; this is the area inside of the insets
+//	 * @return Whether the point lies after the region.
+//	 */
+//	protected boolean isAfter(int x, int y, Rectangle alloc) {
+//		return y > (alloc.y + alloc.height);
+//	}
+//
+//
+//	/**
+//	 * @param alloc The allocated region; this is the area inside of the insets
+//	 * @return Whether the point lies before the region.
+//	 */
+//	protected boolean isBefore(int x, int y, Rectangle alloc) {
+//		return y < alloc.y;
+//	}
+//
+//
+//	public float getPreferredSpan(int axis) {
+//		if (axis==X_AXIS) {
+//			return preferredWidth + getLeftInset() + getRightInset();
+//		}
+//		else {
+//			return preferredHeight + getTopInset() + getBottomInset();
+//		}
+//	}
+//
+//
+//	public void paint(Graphics g, Shape allocation) {
+//
+//		Rectangle alloc = (allocation instanceof Rectangle) ?
+//				(Rectangle)allocation : allocation.getBounds();
+//		int n = getViewCount();
+//
+//		int x = alloc.x + getLeftInset();
+//		int y = alloc.y + getTopInset();
+//		Rectangle clip = g.getClipBounds();
+//		int preferredWidth = (int)getPreferredSpan(X_AXIS);
+//
+//		for (int i = 0; i < n; i++) {
+//			tempRect.x = x;
+//			tempRect.y = y + getOffset(i);
+//			tempRect.width = preferredWidth;
+//			tempRect.height = getHeight(i);
+//			if (tempRect.intersects(clip)) {
+//				paintChild(g, tempRect, i);
+//			}
+//		}
+//
+//	}
+//
+//
+//	/**
+//	 * Called when a child view's preferred span changes.  This invalidates
+//	 * our layout cache and calls the super implementation.
+//	 */
+//	public void preferenceChanged(View child, boolean widthPreferenceChanged,
+//								boolean heightPreferenceChanged) {
+//
+//		if (heightPreferenceChanged) {
+//			sizeRequirementsValid = false;
+////			majorAllocValid = false;
+//		}
+////		if (width) {
+////			minorReqValid = false;
+////			minorAllocValid = false;
+////		}
+//
+//		super.preferenceChanged(child, widthPreferenceChanged, heightPreferenceChanged);
+//
+//	}
+//
+//	public void replace(int index, int length, View[] elems) {
+//
+//		super.replace(index, length, elems);
+//
+//		// Invalidate cache
+//		int insertCount = elems==null ? 0 : elems.length;
+//		cachedOffsets = updateLayoutArray(cachedOffsets, index, insertCount);
+//		majorReqValid = false;
+//		majorAllocValid = false;
+//
+//	}
+//
+//
+//	private int[] updateLayoutArray(int[] oldArray, int offset, int nInserted) {
+//		int n = getViewCount(); // Called after super.replace() so this is accurate
+//		int[] newArray = new int[n];
+//		System.arraycopy(oldArray, 0, newArray, 0, offset);
+//		System.arraycopy(oldArray, offset, 
+//				newArray, offset + nInserted, n - nInserted - offset);
+//		return newArray;
+//	}
+//
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java	(revision 25584)
@@ -0,0 +1,344 @@
+/*
+ * 07/29/2009
+ *
+ * FocusableTip.java - A focusable tool tip, like those in Eclipse.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.net.URL;
+import java.util.ResourceBundle;
+import javax.swing.*;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.event.MouseInputAdapter;
+
+import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
+
+
+/**
+ * A focusable tool tip, similar to those found in Eclipse.  The user
+ * can click in the tip and it becomes a "real," resizable window.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FocusableTip {
+
+	private JTextArea textArea;
+	private TipWindow tipWindow;
+	private URL imageBase;
+	private TextAreaListener textAreaListener;
+	private HyperlinkListener hyperlinkListener;
+	private String lastText;
+
+	/**
+	 * The screen bounds in which the mouse has to stay for the currently
+	 * displayed tip to stay visible.
+	 */
+	private Rectangle tipVisibleBounds;
+
+	/**
+	 * Margin from mouse cursor at which to draw focusable tip.
+	 */
+	private static final int X_MARGIN = 18;
+
+	/**
+	 * Margin from mouse cursor at which to draw focusable tip.
+	 */
+	private static final int Y_MARGIN = 12;
+
+	private static final String MSG =
+		"org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip";
+	private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+	public FocusableTip(JTextArea textArea, HyperlinkListener listener) {
+		setTextArea(textArea);
+		this.hyperlinkListener = listener;
+		textAreaListener = new TextAreaListener();
+		tipVisibleBounds = new Rectangle();
+	}
+
+
+	/**
+	 * Compute the bounds in which the user can move the mouse without the
+	 * tip window disappearing.
+	 */
+	private void computeTipVisibleBounds() {
+		// Compute area that the mouse can move in without hiding the
+		// tip window. Note that Java 1.4 can only detect mouse events
+		// in Java windows, not globally.
+		Rectangle r = tipWindow.getBounds();
+		Point p = r.getLocation();
+		SwingUtilities.convertPointFromScreen(p, textArea);
+		r.setLocation(p);
+		tipVisibleBounds.setBounds(r.x,r.y-15, r.width,r.height+15*2);
+	}
+
+
+	private void createAndShowTipWindow(final MouseEvent e, final String text) {
+
+		Window owner = SwingUtilities.getWindowAncestor(textArea);
+		tipWindow = new TipWindow(owner, this, text);
+		tipWindow.setHyperlinkListener(hyperlinkListener);
+
+		// Give apps a chance to decorate us with drop shadows, etc.
+		PopupWindowDecorator decorator = PopupWindowDecorator.get();
+		if (decorator!=null) {
+			decorator.decorate(tipWindow);
+		}
+
+		// TODO: Position tip window better (handle RTL, edges of screen, etc.).
+		// Wrap in an invokeLater() to work around a JEditorPane issue where it
+		// doesn't return its proper preferred size until after it is displayed.
+		// See http://forums.sun.com/thread.jspa?forumID=57&threadID=574810
+		// for a discussion.
+		SwingUtilities.invokeLater(new Runnable() {
+			public void run() {
+
+				// If a new FocusableTip is requested while another one is
+				// *focused* and visible, the focused tip (i.e. "tipWindow")
+				// will be disposed of.  If this Runnable is run after the
+				// dispose(), tipWindow will be null.  All of this is done on
+				// the EDT so no synchronization should be necessary.
+				if (tipWindow==null) {
+					return;
+				}
+
+				tipWindow.fixSize();
+				ComponentOrientation o = textArea.getComponentOrientation();
+
+				Point p = e.getPoint();
+				SwingUtilities.convertPointToScreen(p, textArea);
+
+				// Ensure tool tip is in the window bounds.
+				// Multi-monitor support - make sure the completion window (and
+				// description window, if applicable) both fit in the same
+				// window in a multi-monitor environment.  To do this, we decide
+				// which monitor the rectangle "p" is in, and use that one.
+				Rectangle sb = TipUtil.getScreenBoundsForPoint(p.x, p.y);
+				//Dimension ss = tipWindow.getToolkit().getScreenSize();
+
+				// Try putting our stuff "below" the mouse first.
+				int y = p.y + Y_MARGIN;
+				if (y+tipWindow.getHeight()>=sb.y+sb.height) {
+					y = p.y - Y_MARGIN - tipWindow.getHeight();
+				}
+
+				// Get x-coordinate of completions.  Try to align left edge
+				// with the mouse first (with a slight margin).
+				int x = p.x - X_MARGIN; // ltr
+				if (!o.isLeftToRight()) {
+					x = p.x - tipWindow.getWidth() + X_MARGIN;
+				}
+				if (x<sb.x) {
+					x = sb.x;
+				}
+				else if (x+tipWindow.getWidth()>sb.x+sb.width) { // completions don't fit
+					x = sb.x + sb.width - tipWindow.getWidth();
+				}
+
+				tipWindow.setLocation(x, y);
+				tipWindow.setVisible(true);
+
+				computeTipVisibleBounds(); // Do after tip is visible
+				textAreaListener.install(textArea);
+				lastText = text;
+
+			}
+		});
+
+	}
+
+
+	/**
+	 * Returns the base URL to use when loading images in this focusable tip.
+	 *
+	 * @return The base URL to use.
+	 * @see #setImageBase(URL)
+	 */
+	public URL getImageBase() {
+		return imageBase;
+	}
+
+
+	/**
+	 * Returns localized text for the given key.
+	 *
+	 * @param key The key into the resource bundle.
+	 * @return The localized text.
+	 */
+	static String getString(String key) {
+		return msg.getString(key);
+	}
+
+
+	/**
+	 * Disposes of the focusable tip currently displayed, if any.
+	 */
+	public void possiblyDisposeOfTipWindow() {
+		if (tipWindow != null) {
+			tipWindow.dispose();
+			tipWindow = null;
+			textAreaListener.uninstall();
+			tipVisibleBounds.setBounds(-1, -1, 0, 0);
+			lastText = null;
+			textArea.requestFocus();
+		}
+	}
+
+
+	void removeListeners() {
+		//System.out.println("DEBUG: Removing text area listeners");
+		textAreaListener.uninstall();
+	}
+
+
+	/**
+	 * Sets the base URL to use when loading images in this focusable tip.
+	 * 
+	 * @param url The base URL to use.
+	 * @see #getImageBase()
+	 */
+	public void setImageBase(URL url) {
+		imageBase = url;
+	}
+
+
+	private void setTextArea(JTextArea textArea) {
+		this.textArea = textArea;
+		// Is okay to do multiple times.
+		ToolTipManager.sharedInstance().registerComponent(textArea);
+	}
+
+
+	public void toolTipRequested(MouseEvent e, String text) {
+
+		if (text==null || text.length()==0) {
+			possiblyDisposeOfTipWindow();
+			lastText = text;
+			return;
+		}
+
+		if (lastText==null || text.length()!=lastText.length()
+				|| !text.equals(lastText)) {
+			possiblyDisposeOfTipWindow();
+			createAndShowTipWindow(e, text);
+		}
+
+	}
+
+
+	private class TextAreaListener extends MouseInputAdapter implements
+			CaretListener, ComponentListener, FocusListener, KeyListener {
+
+		public void caretUpdate(CaretEvent e) {
+			Object source = e.getSource();
+			if (source == textArea) {
+				possiblyDisposeOfTipWindow();
+			}
+		}
+
+		public void componentHidden(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void componentMoved(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void componentResized(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void componentShown(ComponentEvent e) {
+			handleComponentEvent(e);
+		}
+
+		public void focusGained(FocusEvent e) {
+		}
+
+		public void focusLost(FocusEvent e) {
+			// Only dispose of tip if it wasn't the TipWindow that was clicked
+			// "c" can be null, at least on OS X, so we must check that before
+			// calling SwingUtilities.getWindowAncestor() to guard against an
+			// NPE.
+			Component c = e.getOppositeComponent();
+			boolean tipClicked = (c instanceof TipWindow) ||
+				(c!=null &&
+					SwingUtilities.getWindowAncestor(c) instanceof TipWindow);
+			if (!tipClicked) {
+				possiblyDisposeOfTipWindow();
+			}
+		}
+
+		private void handleComponentEvent(ComponentEvent e) {
+			possiblyDisposeOfTipWindow();
+		}
+
+		public void install(JTextArea textArea) {
+			textArea.addCaretListener(this);
+			textArea.addComponentListener(this);
+			textArea.addFocusListener(this);
+			textArea.addKeyListener(this);
+			textArea.addMouseListener(this);
+			textArea.addMouseMotionListener(this);
+		}
+
+		public void keyPressed(KeyEvent e) {
+			if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
+				possiblyDisposeOfTipWindow();
+			}
+			else if (e.getKeyCode()==KeyEvent.VK_F2) {
+				if (tipWindow!=null && !tipWindow.getFocusableWindowState()) {
+					tipWindow.actionPerformed(null);
+					e.consume(); // Don't do bookmarking stuff
+				}
+			}
+		}
+
+		public void keyReleased(KeyEvent e) {
+		}
+
+		public void keyTyped(KeyEvent e) {
+		}
+
+		public void mouseExited(MouseEvent e) {
+			// possiblyDisposeOfTipWindow();
+		}
+
+		public void mouseMoved(MouseEvent e) {
+			if (tipVisibleBounds==null ||
+					!tipVisibleBounds.contains(e.getPoint())) {
+				possiblyDisposeOfTipWindow();
+			}
+		}
+
+		public void uninstall() {
+			textArea.removeCaretListener(this);
+			textArea.removeComponentListener(this);
+			textArea.removeFocusListener(this);
+			textArea.removeKeyListener(this);
+			textArea.removeMouseListener(this);
+			textArea.removeMouseMotionListener(this);
+		}
+
+	}
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java	(revision 25584)
@@ -0,0 +1,252 @@
+/*
+ * 12/23/2008
+ *
+ * SizeGrip.java - A size grip component that sits at the bottom of the window,
+ * allowing the user to easily resize that window.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.imageio.ImageIO;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.MouseInputAdapter;
+
+
+/**
+ * A component that allows its parent window to be resizable, similar to the
+ * size grip seen on status bars.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class SizeGrip extends JPanel {
+
+	/**
+	 * The size grip to use if we're on OS X.
+	 */
+	private Image osxSizeGrip;
+
+
+	public SizeGrip() {
+		MouseHandler adapter = new MouseHandler();
+		addMouseListener(adapter);
+		addMouseMotionListener(adapter);
+		setPreferredSize(new Dimension(16, 16));
+	}
+
+
+	/**
+	 * Overridden to ensure that the cursor for this component is appropriate
+	 * for the orientation.
+	 *
+	 * @param o The new orientation.
+	 */
+	public void applyComponentOrientation(ComponentOrientation o) {
+		possiblyFixCursor(o.isLeftToRight());
+		super.applyComponentOrientation(o);
+	}
+
+
+	/**
+	 * Creates and returns the OS X size grip image.
+	 *
+	 * @return The OS X size grip.
+	 */
+	private Image createOSXSizeGrip() {
+		ClassLoader cl = getClass().getClassLoader();
+		URL url = cl.getResource("org/fife/ui/autocomplete/osx_sizegrip.png");
+		if (url==null) {
+			// We're not running in a jar - we may be debugging in Eclipse,
+			// for example
+			File f = new File("../AutoComplete/src/org/fife/ui/autocomplete/osx_sizegrip.png");
+			if (f.isFile()) {
+				try {
+					url = f.toURI().toURL();
+				} catch (MalformedURLException mue) { // Never happens
+					mue.printStackTrace();
+					return null;
+				}
+			}
+			else {
+				return null; // Can't find resource or image file
+			}
+		}
+		Image image = null;
+		try {
+			image = ImageIO.read(url);
+		} catch (IOException ioe) { // Never happens
+			ioe.printStackTrace();
+		}
+		return image;
+	}
+
+
+	/**
+	 * Paints this panel.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintComponent(Graphics g) {
+
+		super.paintComponent(g);
+
+		Dimension dim = getSize();
+		Color c1 = UIManager.getColor("Label.disabledShadow");
+		Color c2 = UIManager.getColor("Label.disabledForeground");
+
+		if (osxSizeGrip!=null) {
+			g.drawImage(osxSizeGrip, dim.width-16, dim.height-16, null);
+			return;
+		}
+
+		ComponentOrientation orientation = getComponentOrientation();
+
+		if (orientation.isLeftToRight()) {
+			int width = dim.width  -= 3;
+			int height = dim.height -= 3;
+			g.setColor(c1);
+			g.fillRect(width-9,height-1, 3,3);
+			g.fillRect(width-5,height-1, 3,3);
+			g.fillRect(width-1,height-1, 3,3);
+			g.fillRect(width-5,height-5, 3,3);
+			g.fillRect(width-1,height-5, 3,3);
+			g.fillRect(width-1,height-9, 3,3);
+			g.setColor(c2);
+			g.fillRect(width-9,height-1, 2,2);
+			g.fillRect(width-5,height-1, 2,2);
+			g.fillRect(width-1,height-1, 2,2);
+			g.fillRect(width-5,height-5, 2,2);
+			g.fillRect(width-1,height-5, 2,2);
+			g.fillRect(width-1,height-9, 2,2);
+		}
+		else {
+			int height = dim.height -= 3;
+			g.setColor(c1);
+			g.fillRect(10,height-1, 3,3);
+			g.fillRect(6,height-1, 3,3);
+			g.fillRect(2,height-1, 3,3);
+			g.fillRect(6,height-5, 3,3);
+			g.fillRect(2,height-5, 3,3);
+			g.fillRect(2,height-9, 3,3);
+			g.setColor(c2);
+			g.fillRect(10,height-1, 2,2);
+			g.fillRect(6,height-1, 2,2);
+			g.fillRect(2,height-1, 2,2);
+			g.fillRect(6,height-5, 2,2);
+			g.fillRect(2,height-5, 2,2);
+			g.fillRect(2,height-9, 2,2);
+		}
+
+	}
+
+
+	/**
+	 * Ensures that the cursor for this component is appropriate for the
+	 * orientation.
+	 *
+	 * @param ltr Whether the current component orientation is LTR.
+	 */
+	protected void possiblyFixCursor(boolean ltr) {
+		int cursor = Cursor.NE_RESIZE_CURSOR;
+		if (ltr) {
+			cursor = Cursor.NW_RESIZE_CURSOR;
+		}
+		if (cursor!=getCursor().getType()) {
+			setCursor(Cursor.getPredefinedCursor(cursor));
+		}
+	}
+
+
+	public void updateUI() {
+		super.updateUI();
+		// TODO: Key off of Aqua LaF, not just OS X, as this size grip looks
+		// bad on other LaFs on Mac such as Nimbus.
+		if (System.getProperty("os.name").indexOf("OS X")>-1) {
+			if (osxSizeGrip==null) {
+				osxSizeGrip = createOSXSizeGrip();
+			}
+		}
+		else { // Clear memory in case of runtime LaF change.
+			osxSizeGrip = null;
+		}
+
+	}
+
+
+	/**
+	 * Listens for mouse events on this panel and resizes the parent window
+	 * appropriately.
+	 *
+	 * @author Robert Futrell
+	 * @version 1.0
+	 */
+	/*
+	 * NOTE: We use SwingUtilities.convertPointToScreen() instead of just using
+	 * the locations relative to the corner component because the latter proved
+	 * buggy - stretch the window too wide and some kind of arithmetic error
+	 * started happening somewhere - our window would grow way too large.
+	 */
+	private class MouseHandler extends MouseInputAdapter {
+
+		private Point origPos;
+
+		public void mouseDragged(MouseEvent e) {
+			Point newPos = e.getPoint();
+			SwingUtilities.convertPointToScreen(newPos, SizeGrip.this);
+			int xDelta = newPos.x - origPos.x;
+			int yDelta = newPos.y - origPos.y;
+			Window wind = SwingUtilities.getWindowAncestor(SizeGrip.this);
+			if (wind!=null) { // Should always be true
+				if (getComponentOrientation().isLeftToRight()) {
+					int w = wind.getWidth();
+					if (newPos.x>=wind.getX()) {
+						w += xDelta;
+					}
+					int h = wind.getHeight();
+					if (newPos.y>=wind.getY()) {
+						h += yDelta;
+					}
+					wind.setSize(w,h);
+				}
+				else { // RTL
+					int newW = Math.max(1, wind.getWidth()-xDelta);
+					int newH = Math.max(1, wind.getHeight()+yDelta);
+					wind.setBounds(newPos.x, wind.getY(), newW, newH);
+				}
+				// invalidate()/validate() needed pre-1.6.
+				wind.invalidate();
+				wind.validate();
+			}
+			origPos.setLocation(newPos);
+		}
+
+		public void mousePressed(MouseEvent e) {
+			origPos = e.getPoint();
+			SwingUtilities.convertPointToScreen(origPos, SizeGrip.this);
+		}
+
+		public void mouseReleased(MouseEvent e) {
+			origPos = null;
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java	(revision 25584)
@@ -0,0 +1,225 @@
+/*
+ * 08/13/2009
+ *
+ * TipUtil.java - Utility methods for homemade tool tips.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Rectangle;
+import java.awt.SystemColor;
+import javax.swing.BorderFactory;
+import javax.swing.JEditorPane;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.text.html.HTMLDocument;
+
+
+/**
+ * Static utility methods for focusable tips.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class TipUtil {
+
+
+	private TipUtil() {
+	}
+
+
+	/**
+	 * Returns a hex string for the specified color, suitable for HTML.
+	 *
+	 * @param c The color.
+	 * @return The string representation, in the form "<code>#rrggbb</code>",
+	 *         or <code>null</code> if <code>c</code> is <code>null</code>.
+	 */
+	private static final String getHexString(Color c) {
+
+		if (c==null) {
+			return null;
+		}
+
+		StringBuffer sb = new StringBuffer("#");
+		int r = c.getRed();
+		if (r<16) {
+			sb.append('0');
+		}
+		sb.append(Integer.toHexString(r));
+		int g = c.getGreen();
+		if (g<16) {
+			sb.append('0');
+		}
+		sb.append(Integer.toHexString(g));
+		int b = c.getBlue();
+		if (b<16) {
+			sb.append('0');
+		}
+		sb.append(Integer.toHexString(b));
+
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Returns the screen coordinates for the monitor that contains the
+	 * specified point.  This is useful for setups with multiple monitors,
+	 * to ensure that popup windows are positioned properly.
+	 *
+	 * @param x The x-coordinate, in screen coordinates.
+	 * @param y The y-coordinate, in screen coordinates.
+	 * @return The bounds of the monitor that contains the specified point.
+	 */
+	public static Rectangle getScreenBoundsForPoint(int x, int y) {
+		GraphicsEnvironment env = GraphicsEnvironment.
+										getLocalGraphicsEnvironment();
+		GraphicsDevice[] devices = env.getScreenDevices();
+		for (int i=0; i<devices.length; i++) {
+			GraphicsConfiguration[] configs = devices[i].getConfigurations();
+			for (int j=0; j<configs.length; j++) {
+				Rectangle gcBounds = configs[j].getBounds();
+				if (gcBounds.contains(x, y)) {
+					return gcBounds;
+				}
+			}
+		}
+		// If point is outside all monitors, default to default monitor (?)
+		return env.getMaximumWindowBounds();
+	}
+
+
+	/**
+	 * Returns the default background color to use for tool tip windows.
+	 *
+	 * @return The default background color.
+	 */
+	public static Color getToolTipBackground() {
+
+		Color c = UIManager.getColor("ToolTip.background");
+
+		// Tooltip.background is wrong color on Nimbus (!)
+		if (c==null || isNimbusLookAndFeel()) {
+			c = UIManager.getColor("info"); // Used by Nimbus (and others)
+			if (c==null) {
+				c = SystemColor.info; // System default
+			}
+		}
+
+		// Workaround for a bug (?) with Nimbus - calling JLabel.setBackground()
+		// with a ColorUIResource does nothing, must be a normal Color
+		if (c instanceof ColorUIResource) {
+			c = new Color(c.getRGB());
+		}
+
+		return c;
+
+	}
+
+
+	/**
+	 * Returns the border used by tool tips in this look and feel.
+	 *
+	 * @return The border.
+	 */
+	public static Border getToolTipBorder() {
+
+		Border border = UIManager.getBorder("ToolTip.border");
+
+		if (border==null || isNimbusLookAndFeel()) {
+			border = UIManager.getBorder("nimbusBorder");
+			if (border==null) {
+				border = BorderFactory.createLineBorder(SystemColor.controlDkShadow);
+			}
+		}
+
+		return border;
+
+	}
+
+
+	/**
+	 * Returns whether a color is a Nimbus DerivedColor, which is troublesome
+	 * in that it doesn't use its RGB values (uses HSB instead?) and so
+	 * querying them is useless.
+	 *
+	 * @param c The color to check.
+	 * @return Whether it is a DerivedColor
+	 */
+	private static final boolean isDerivedColor(Color c) {
+		return c!=null && c.getClass().getName().endsWith(".DerivedColor");
+	}
+
+
+	/**
+	 * Returns whether the Nimbus Look and Feel is installed.
+	 *
+	 * @return Whether the current LAF is Nimbus.
+	 */
+	private static final boolean isNimbusLookAndFeel() {
+		return UIManager.getLookAndFeel().getName().equals("Nimbus");
+	}
+
+
+	/**
+	 * Tweaks a <code>JEditorPane</code> so it can be used to render the
+	 * content in a focusable pseudo-tool tip.  It is assumed that the editor
+	 * pane is using an <code>HTMLDocument</code>.
+	 *
+	 * @param textArea The editor pane to tweak.
+	 */
+	public static void tweakTipEditorPane(JEditorPane textArea) {
+
+		// Jump through a few hoops to get things looking nice in Nimbus
+		boolean isNimbus = isNimbusLookAndFeel();
+		if (isNimbus) {
+			Color selBG = textArea.getSelectionColor();
+			Color selFG = textArea.getSelectedTextColor();
+			textArea.setUI(new javax.swing.plaf.basic.BasicEditorPaneUI());
+			textArea.setSelectedTextColor(selFG);
+			textArea.setSelectionColor(selBG);
+		}
+
+		textArea.setEditable(false); // Required for links to work!
+		textArea.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+		// Make selection visible even though we are not (initially) focusable.
+		textArea.getCaret().setSelectionVisible(true);
+
+		// Set the foreground color.  Important because when rendering HTML,
+		// default foreground becomes black, which may not match all LAF's
+		// (e.g. Substance).
+		Color fg = UIManager.getColor("Label.foreground");
+		if (fg==null || (isNimbus && isDerivedColor(fg))) {
+			fg = SystemColor.textText;
+		}
+		textArea.setForeground(fg);
+
+		// Make it use the "tool tip" background color.
+		textArea.setBackground(TipUtil.getToolTipBackground());
+
+		// Force JEditorPane to use a certain font even in HTML.
+		// All standard LookAndFeels, even Nimbus (!), define Label.font.
+		Font font = UIManager.getFont("Label.font");
+		if (font == null) { // Try to make a sensible default
+			font = new Font("SansSerif", Font.PLAIN, 12);
+		}
+		HTMLDocument doc = (HTMLDocument) textArea.getDocument();
+		doc.getStyleSheet().addRule(
+				"body { font-family: " + font.getFamily() +
+						"; font-size: " + font.getSize() + "pt" +
+						"; color: " + getHexString(fg) + "; }");
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java	(revision 25584)
@@ -0,0 +1,334 @@
+/*
+ * 07/29/2009
+ *
+ * TipWindow.java - The actual window component representing the tool tip.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import javax.swing.BorderFactory;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JWindow;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.event.MouseInputAdapter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.html.HTMLDocument;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * The actual tool tip component.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class TipWindow extends JWindow implements ActionListener {
+
+	private FocusableTip ft;
+	private JEditorPane textArea;
+	private String text;
+	private TipListener tipListener;
+	private HyperlinkListener userHyperlinkListener;
+
+	private static TipWindow visibleInstance;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param owner The parent window.
+	 * @param msg The text of the tool tip.  This can be HTML.
+	 */
+	public TipWindow(Window owner, FocusableTip ft, String msg) {
+
+		super(owner);
+		this.ft = ft;
+		// Render plain text tool tips correctly.
+		if (msg!=null && msg.length()>=6 &&
+				!msg.substring(0,6).toLowerCase().equals("<html>")) {
+			msg = "<html>" + RSyntaxUtilities.escapeForHtml(msg, "<br>", false);
+		}
+		this.text = msg;
+		tipListener = new TipListener();
+
+		JPanel cp = new JPanel(new BorderLayout());
+		cp.setBorder(TipUtil.getToolTipBorder());
+		cp.setBackground(TipUtil.getToolTipBackground());
+		textArea = new JEditorPane("text/html", text);
+		TipUtil.tweakTipEditorPane(textArea);
+		if (ft.getImageBase()!=null) { // Base URL for images
+			((HTMLDocument)textArea.getDocument()).setBase(ft.getImageBase());
+		}
+		textArea.addMouseListener(tipListener);
+		textArea.addHyperlinkListener(new HyperlinkListener() {
+			public void hyperlinkUpdate(HyperlinkEvent e) {
+				if (e.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
+					TipWindow.this.ft.possiblyDisposeOfTipWindow();
+				}
+			}
+		});
+		cp.add(textArea);
+
+		setFocusableWindowState(false);
+		setContentPane(cp);
+		setBottomPanel(); // Must do after setContentPane()
+		pack();
+
+		// InputMap/ActionMap combo doesn't work for JWindows (even when
+		// using the JWindow's JRootPane), so we'll resort to KeyListener
+		KeyAdapter ka = new KeyAdapter() {
+			public void keyPressed(KeyEvent e) {
+				if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
+					TipWindow.this.ft.possiblyDisposeOfTipWindow();
+				}
+			}
+		};
+		addKeyListener(ka);
+		textArea.addKeyListener(ka);
+
+		// Ensure only 1 TipWindow is ever visible.  If the caller does what
+		// they're supposed to and only creates these on the EDT, the
+		// synchronization isn't necessary, but we'll be extra safe.
+		synchronized (TipWindow.class) {
+			if (visibleInstance!=null) {
+				visibleInstance.dispose();
+			}
+			visibleInstance = this;
+		}
+
+	}
+
+
+	public void actionPerformed(ActionEvent e) {
+
+		if (!getFocusableWindowState()) {
+			setFocusableWindowState(true);
+			setBottomPanel();
+			textArea.removeMouseListener(tipListener);
+			pack();
+			addWindowFocusListener(new WindowAdapter() {
+				public void windowLostFocus(WindowEvent e) {
+					ft.possiblyDisposeOfTipWindow();
+				}
+			});
+			ft.removeListeners();
+			if (e==null) { // Didn't get here via our mouseover timer
+				requestFocus();
+			}
+		}
+
+	}
+
+
+	/**
+	 * Disposes of this window.
+	 */
+	public void dispose() {
+		//System.out.println("[DEBUG]: Disposing...");
+		Container cp = getContentPane();
+		for (int i=0; i<cp.getComponentCount(); i++) {
+			// Okay if listener is already removed
+			cp.getComponent(i).removeMouseListener(tipListener);
+		}
+		ft.removeListeners();
+		super.dispose();
+	}
+
+
+	/**
+	 * Workaround for JEditorPane not returning its proper preferred size
+	 * when rendering HTML until after layout already done.  See
+	 * http://forums.sun.com/thread.jspa?forumID=57&threadID=574810 for a
+	 * discussion.
+	 */
+	void fixSize() {
+
+		Dimension d = textArea.getPreferredSize();
+		Rectangle r = null;
+		try {
+
+			// modelToView call is required for this hack, never remove!
+			r = textArea.modelToView(textArea.getDocument().getLength()-1);
+
+			// Ensure the text area doesn't start out too tall or wide.
+			d = textArea.getPreferredSize();
+			d.width += 25; // Just a little extra space
+			final int MAX_WINDOW_W = 600;
+			d.width = Math.min(d.width, MAX_WINDOW_W);
+			d.height = Math.min(d.height, 400);
+
+			// Both needed for modelToView() calculation below...
+			textArea.setPreferredSize(d);
+			textArea.setSize(d);
+
+			// if the new textArea width causes our text to wrap, we must
+			// compute a new preferred size to get all our physical lines.
+			r = textArea.modelToView(textArea.getDocument().getLength()-1);
+			if (r.y+r.height>d.height) {
+				d.height = r.y + r.height + 5;
+				textArea.setPreferredSize(d);
+			}
+
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+		}
+
+		pack(); // Must re-pack to calculate proper size.
+
+	}
+
+
+	public String getText() {
+		return text;
+	}
+
+
+	private void setBottomPanel() {
+
+		final JPanel panel = new JPanel(new BorderLayout());
+		panel.add(new JSeparator(), BorderLayout.NORTH);
+
+		boolean focusable = getFocusableWindowState();
+		if (focusable) {
+			SizeGrip sg = new SizeGrip();
+			sg.applyComponentOrientation(sg.getComponentOrientation()); // Workaround
+			panel.add(sg, BorderLayout.LINE_END);
+			MouseInputAdapter adapter = new MouseInputAdapter() {
+				private Point lastPoint;
+				public void mouseDragged(MouseEvent e) {
+					Point p = e.getPoint();
+					SwingUtilities.convertPointToScreen(p, panel);
+					if (lastPoint==null) {
+						lastPoint = p;
+					}
+					else {
+						int dx = p.x - lastPoint.x;
+						int dy = p.y - lastPoint.y;
+						setLocation(getX()+dx, getY()+dy);
+						lastPoint = p;
+					}
+				}
+				public void mousePressed(MouseEvent e) {
+					lastPoint = e.getPoint();
+					SwingUtilities.convertPointToScreen(lastPoint, panel);
+				}
+			};
+			panel.addMouseListener(adapter);
+			panel.addMouseMotionListener(adapter);
+			// Don't add tipListener to the panel or SizeGrip
+		}
+		else {
+			panel.setOpaque(false);
+			JLabel label = new JLabel(FocusableTip.getString("FocusHotkey"));
+			Color fg = UIManager.getColor("Label.disabledForeground");
+			Font font = textArea.getFont();
+			font = font.deriveFont(font.getSize2D() - 1.0f);
+			label.setFont(font);
+			if (fg==null) { // Non BasicLookAndFeel-derived Looks
+				fg = Color.GRAY;
+			}
+			label.setOpaque(true);
+			Color bg = TipUtil.getToolTipBackground();
+			label.setBackground(bg);
+			label.setForeground(fg);
+			label.setHorizontalAlignment(SwingConstants.TRAILING);
+			label.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
+			panel.add(label);
+			panel.addMouseListener(tipListener);
+		}
+
+		// Replace the previous SOUTH Component with the new one.
+		Container cp = getContentPane();
+		if (cp.getComponentCount()==2) { // Skip first time through
+			Component comp = cp.getComponent(0);
+			cp.remove(0);
+			JScrollPane sp = new JScrollPane(comp);
+			Border emptyBorder = BorderFactory.createEmptyBorder();
+			sp.setBorder(emptyBorder);
+			sp.setViewportBorder(emptyBorder);
+			sp.setBackground(textArea.getBackground());
+			sp.getViewport().setBackground(textArea.getBackground());
+			cp.add(sp);
+			// What was component 1 is now 0.
+			cp.getComponent(0).removeMouseListener(tipListener);
+			cp.remove(0);
+		}
+
+		cp.add(panel, BorderLayout.SOUTH);
+
+	}
+
+
+	/**
+	 * Sets the listener for hyperlink events in this tip window.
+	 *
+	 * @param listener The new listener.  The old listener (if any) is
+	 *        removed.  A value of <code>null</code> means "no listener."
+	 */
+	public void setHyperlinkListener(HyperlinkListener listener) {
+		// We've added a separate listener, so remove only the user's.
+		if (userHyperlinkListener!=null) {
+			textArea.removeHyperlinkListener(userHyperlinkListener);
+		}
+		userHyperlinkListener = listener;
+		if (userHyperlinkListener!=null) {
+			textArea.addHyperlinkListener(userHyperlinkListener);
+		}
+	}
+
+
+	/**
+	 * Listens for events in this window.
+	 */
+	private class TipListener extends MouseAdapter {
+
+		public TipListener() {
+		}
+
+		public void mousePressed(MouseEvent e) {
+			actionPerformed(null); // Manually create "real" window
+		}
+
+		public void mouseExited(MouseEvent e) {
+			// Since we registered this listener on the child components of
+			// the JWindow, not the JWindow iteself, we have to be careful.
+			Component source = (Component)e.getSource();
+			Point p = e.getPoint();
+			SwingUtilities.convertPointToScreen(p, source);
+			if (!TipWindow.this.getBounds().contains(p)) {
+				ft.possiblyDisposeOfTipWindow();
+			}
+		}
+
+	}
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/focusabletip/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	An implementation of a focusable tooltip. 
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java	(revision 25584)
@@ -0,0 +1,320 @@
+/*
+ * 10/08/2011
+ *
+ * CurlyFoldParser.java - Fold parser for languages with C-style syntax.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMaker;
+
+
+/**
+ * A basic fold parser that can be used for languages such as C, that use
+ * curly braces to denote code blocks.  This parser searches for curly brace
+ * pairs and creates code folds out of them.  It can also optionally find
+ * C-style multi-line comments ("<code>/* ... *&#47;</code>") and make them
+ * foldable as well.<p>
+ * 
+ * This parser knows nothing about language semantics; it uses
+ * <code>RSyntaxTextArea</code>'s syntax highlighting tokens to identify
+ * curly braces.  By default, it looks for single-char tokens of type
+ * {@link Token#SEPARATOR}, with lexemes '<code>{</code>' or '<code>}</code>'.
+ * If your {@link TokenMaker} uses a different token type for curly braces, you
+ * should override the {@link #isLeftCurly(Token)} and
+ * {@link #isRightCurly(Token)} methods with your own definitions.  In theory,
+ * you could extend this fold parser to parse languages that use completely
+ * different tokens than curly braces to denote foldable regions by overriding
+ * those two methods.<p>
+ *
+ * Note also that this class may impose somewhat of a performance penalty on
+ * large source files, since it re-parses the entire document each time folds
+ * are reevaluated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class CurlyFoldParser implements FoldParser {
+
+	/**
+	 * Whether to scan for C-style multi-line comments and make them foldable.
+	 */
+	private boolean foldableMultiLineComments;
+
+	/**
+	 * Whether this parser is folding Java.
+	 */
+	private boolean java;
+
+	/**
+	 * Used to find import statements when folding Java code.
+	 */
+	private static final char[] KEYWORD_IMPORT = "import".toCharArray();
+
+	/**
+	 * Ending of a multi-line comment in C, C++, Java, etc.
+	 */
+	protected static final char[] C_MLC_END = "*/".toCharArray();
+
+
+	/**
+	 * Creates a fold parser that identifies foldable regions via curly braces
+	 * as well as C-style multi-line comments.
+	 */
+	public CurlyFoldParser() {
+		this(true, false);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cStyleMultiLineComments Whether to scan for C-style multi-line
+	 *        comments and make them foldable.
+	 * @param java Whether this parser is folding Java.  This adds extra
+	 *        parsing rules, such as grouping all import statements into a
+	 *        fold section.
+	 */
+	public CurlyFoldParser(boolean cStyleMultiLineComments, boolean java) {
+		this.foldableMultiLineComments = cStyleMultiLineComments;
+		this.java = java;
+	}
+
+
+	/**
+	 * Returns whether multi-line comments are foldable with this parser.
+	 *
+	 * @return Whether multi-line comments are foldable.
+	 * @see #setFoldableMultiLineComments(boolean)
+	 */
+	public boolean getFoldableMultiLineComments() {
+		return foldableMultiLineComments;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+		boolean inMLC = false;
+		int mlcStart = 0;
+		int importStartLine = -1;
+		int lastSeenImportLine = -1;
+		int importGroupStartOffs = -1;
+		int importGroupEndOffs = -1;
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (getFoldableMultiLineComments() && t.isComment()) {
+
+						// Java-specific stuff
+						if (java) {
+
+							if (importStartLine>-1) {
+								if (lastSeenImportLine>importStartLine) {
+									Fold fold = null;
+									// Any imports found *should* be a top-level fold,
+									// but we're extra lenient here and allow groups
+									// of them anywhere to keep our parser better-behaved
+									// if they have random "imports" throughout code.
+									if (currentFold==null) {
+										fold = new Fold(FoldType.IMPORTS,
+												textArea, importGroupStartOffs);
+										folds.add(fold);
+									}
+									else {
+										fold = currentFold.createChild(FoldType.IMPORTS,
+												importGroupStartOffs);
+									}
+									fold.setEndOffset(importGroupEndOffs);
+								}
+								importStartLine = lastSeenImportLine =
+								importGroupStartOffs = importGroupEndOffs = -1;
+							}
+
+						}
+
+						if (inMLC) {
+							// If we found the end of an MLC that started
+							// on a previous line...
+							if (t.endsWith(C_MLC_END)) {
+								int mlcEnd = t.offset + t.textCount - 1;
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									folds.add(currentFold);
+									currentFold = null;
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									currentFold = currentFold.getParent();
+								}
+								//System.out.println("Ending MLC at: " + mlcEnd + ", parent==" + currentFold);
+								inMLC = false;
+								mlcStart = 0;
+							}
+							// Otherwise, this MLC is continuing on to yet
+							// another line.
+						}
+						else {
+							// If we're an MLC that ends on a later line...
+							if (t.type!=Token.COMMENT_EOL && !t.endsWith(C_MLC_END)) {
+								//System.out.println("Starting MLC at: " + t.offset);
+								inMLC = true;
+								mlcStart = t.offset;
+							}
+						}
+
+					}
+
+					else if (isLeftCurly(t)) {
+
+						// Java-specific stuff
+						if (java) {
+
+							if (importStartLine>-1) {
+								if (lastSeenImportLine>importStartLine) {
+									Fold fold = null;
+									// Any imports found *should* be a top-level fold,
+									// but we're extra lenient here and allow groups
+									// of them anywhere to keep our parser better-behaved
+									// if they have random "imports" throughout code.
+									if (currentFold==null) {
+										fold = new Fold(FoldType.IMPORTS,
+												textArea, importGroupStartOffs);
+										folds.add(fold);
+									}
+									else {
+										fold = currentFold.createChild(FoldType.IMPORTS,
+												importGroupStartOffs);
+									}
+									fold.setEndOffset(importGroupEndOffs);
+								}
+								importStartLine = lastSeenImportLine =
+								importGroupStartOffs = importGroupEndOffs = -1;
+							}
+
+						}
+
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+
+					}
+
+					else if (isRightCurly(t)) {
+
+						if (currentFold!=null) {
+							currentFold.setEndOffset(t.offset);
+							Fold parentFold = currentFold.getParent();
+							//System.out.println("... Adding regular fold at " + t.offset + ", parent==" + parentFold);
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								if (parentFold!=null) {
+									currentFold.removeFromParent();
+								}
+								else {
+									folds.remove(folds.size()-1);
+								}
+							}
+							currentFold = parentFold;
+						}
+
+					}
+
+					// Java-specific folding rules
+					else if (java) {
+
+						if (t.is(Token.RESERVED_WORD, KEYWORD_IMPORT)) {
+							if (importStartLine==-1) {
+								importStartLine = line;
+								importGroupStartOffs = t.offset;
+								importGroupEndOffs = t.offset;
+							}
+							lastSeenImportLine = line;
+						}
+
+						else if (importStartLine>-1 &&
+								t.isIdentifier() &&//SEPARATOR &&
+								t.isSingleChar(';')) {
+							importGroupEndOffs = t.offset;
+						}
+
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) { // Should never happen
+			ble.printStackTrace();
+		}
+
+		return folds;
+
+	}
+
+
+	/**
+	 * Returns whether the token is a left curly brace.  This method exists
+	 * so subclasses can provide their own curly brace definition.
+	 *
+	 * @param t The token.
+	 * @return Whether it is a left curly brace.
+	 * @see #isRightCurly(Token)
+	 */
+	public boolean isLeftCurly(Token t) {
+		return t.isLeftCurly();
+	}
+
+
+	/**
+	 * Returns whether the token is a right curly brace.  This method exists
+	 * so subclasses can provide their own curly brace definition.
+	 *
+	 * @param t The token.
+	 * @return Whether it is a right curly brace.
+	 * @see #isLeftCurly(Token)
+	 */
+	public boolean isRightCurly(Token t) {
+		return t.isRightCurly();
+	}
+
+
+	/**
+	 * Sets whether multi-line comments are foldable with this parser.
+	 *
+	 * @param foldable Whether multi-line comments are foldable.
+	 * @see #getFoldableMultiLineComments()
+	 */
+	public void setFoldableMultiLineComments(boolean foldable) {
+		this.foldableMultiLineComments = foldable;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/Fold.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/Fold.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/Fold.java	(revision 25584)
@@ -0,0 +1,559 @@
+/*
+ * 10/08/2011
+ *
+ * Fold.java - A foldable region of text in an RSyntaxTextArea instance.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * Information about a foldable region.<p>
+ * 
+ * A <code>Fold</code> has zero or more children, and <code>Folds</code> thus
+ * form a hierarchical structure, with "parent" folds containing the info about
+ * any "child" folds they contain.<p>
+ *
+ * Fold regions are denoted by a starting and ending offset, but the actual
+ * folding is done on a per-line basis, so <code>Fold</code> instances provide
+ * methods for retrieving both starting and ending offsets and lines.  The
+ * starting and ending offsets/lines are "sticky" and correctly track their
+ * positions even as the document is modified.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class Fold implements Comparable {
+
+	private int type;
+	private RSyntaxTextArea textArea;
+	private Position startOffs;
+	private Position endOffs;
+	private Fold parent;
+	private List children;
+	private boolean collapsed;
+	private int childCollapsedLineCount;
+
+	private int lastStartOffs = -1;
+	private int cachedStartLine;
+
+	private int lastEndOffs = -1;
+	private int cachedEndLine;
+
+
+	public Fold(int type, RSyntaxTextArea textArea, int startOffs)
+					throws BadLocationException {
+		this.type = type;
+		this.textArea = textArea;
+		this.startOffs = textArea.getDocument().createPosition(startOffs);
+	}
+
+
+	/**
+	 * Creates a fold that is a child of this one.
+	 *
+	 * @param type The type of fold.
+	 * @param startOffs The starting offset of the fold.
+	 * @return The child fold.
+	 * @throws BadLocationException If <code>startOffs</code> is invalid.
+	 */
+	public Fold createChild(int type, int startOffs) throws BadLocationException {
+		Fold child = new Fold(type, textArea, startOffs);
+		child.parent = this;
+		if (children==null) {
+			children = new ArrayList();
+		}
+		children.add(child);
+		return child;
+	}
+
+
+	/**
+	 * Two folds are considered equal if they start at the same offset.
+	 *
+	 * @param otherFold Another fold to compare this one to.
+	 * @return How this fold compares to the other.
+	 */
+	public int compareTo(Object otherFold) {
+		int result = -1;
+		if (otherFold instanceof Fold) {
+			result = startOffs.getOffset() - ((Fold)otherFold).startOffs.getOffset();
+			//result = getStartLine() - ((Fold)otherFold).getStartLine();
+		}
+		return result;
+	}
+
+
+	/**
+	 * Returns whether the specified line would be hidden in this fold.  Since
+	 * RSTA displays the "first" line in a fold, this means that the line must
+	 * must be between <code>(getStartLine()+1)</code> and
+	 * <code>getEndLine()</code>, inclusive.
+	 * 
+	 * @param line The line to check.
+	 * @return Whether the line would be hidden if this fold is collapsed.
+	 * @see #containsOffset(int)
+	 * @see #containsOrStartsOnLine(int)
+	 */
+	public boolean containsLine(int line) {
+		return line>getStartLine() && line<=getEndLine();
+	}
+
+
+	/**
+	 * Returns whether the given line is in the range
+	 * <code>[getStartLine(), getEndLine()]</code>, inclusive.
+	 *
+	 * @param line The line to check.
+	 * @return Whether this fold contains, or starts on, the line.
+	 * @see #containsLine(int)
+	 */
+	public boolean containsOrStartsOnLine(int line) {
+		return line>=getStartLine() && line<=getEndLine();
+	}
+
+
+	/**
+	 * Returns whether the specified offset is "inside" the fold.  This method
+	 * returns <code>true</code> if the offset is greater than the fold start
+	 * offset, and no further than the last offset of the last folded line.
+	 *
+	 * @param offs The offset to check.
+	 * @return Whether the offset is "inside" the fold.
+	 * @see #containsLine(int)
+	 */
+	public boolean containsOffset(int offs) {
+		boolean contained = false;
+		if (offs>getStartOffset()) {
+			// Use Elements to avoid BadLocationExceptions
+			Element root = textArea.getDocument().getDefaultRootElement();
+			int line = root.getElementIndex(offs);
+			contained = line<=getEndLine();
+		}
+		return contained;
+	}
+
+
+	/**
+	 * Two folds are considered equal if they have the same starting offset.
+	 *
+	 * @param otherFold Another fold to compare this one to.
+	 * @return Whether the two folds are equal.
+	 * @see #compareTo(Object)
+	 */
+	public boolean equals(Object otherFold) {
+		return compareTo(otherFold)==0;
+	}
+
+
+	/**
+	 * Returns a specific child fold.
+	 *
+	 * @param index The index of the child fold.
+	 * @return The child fold.
+	 * @see #getChildCount()
+	 */
+	public Fold getChild(int index) {
+		return (Fold)children.get(index);
+	}
+
+
+	/**
+	 * Returns the number of child folds.
+	 *
+	 * @return The number of child folds.
+	 * @see #getChild(int)
+	 */
+	public int getChildCount() {
+		return children==null ? 0 : children.size();
+	}
+
+
+	/**
+	 * Returns the array of child folds.
+	 *
+	 * @return The array of child folds.
+	 */
+	List getChildren() {
+		return children;
+	}
+
+
+	/**
+	 * Returns the number of collapsed lines under this fold.  If this fold
+	 * is collapsed, this method returns {@link #getLineCount()}, otherwise
+	 * it returns the sum of all collapsed lines of all child folds of this
+	 * one.<p>
+	 *
+	 * The value returned is cached, so this method returns quickly and
+	 * shouldn't affect performance.
+	 *
+	 * @return The number of collapsed lines under this fold.
+	 */
+	public int getCollapsedLineCount() {
+		return collapsed ? getLineCount() : childCollapsedLineCount;
+	}
+
+
+	/**
+	 * Returns the "deepest" fold containing the specified offset.  It is
+	 * assumed that it's already been verified that <code>offs</code> is indeed
+	 * contained in this fold.
+	 *
+	 * @param offs The offset.
+	 * @return The fold, or <code>null</code> if no child fold also contains
+	 *         the offset.
+	 * @see FoldManager#getDeepestFoldContaining(int)
+	 */
+	Fold getDeepestFoldContaining(int offs) {
+		Fold deepestFold = this;
+		for (int i=0; i<getChildCount(); i++) {
+			Fold fold = getChild(i);
+			if (fold.containsOffset(offs)) {
+				deepestFold = fold.getDeepestFoldContaining(offs);
+				break;
+			}
+		}
+		return deepestFold;
+	}
+
+
+	/**
+	 * Returns the "deepest" open fold containing the specified offset.  It
+	 * is assumed that it's already been verified that <code>offs</code> is
+	 * indeed contained in this fold.
+	 *
+	 * @param offs The offset.
+	 * @return The fold, or <code>null</code> if no open fold contains the
+	 *         offset.
+	 * @see FoldManager#getDeepestOpenFoldContaining(int)
+	 */
+	Fold getDeepestOpenFoldContaining(int offs) {
+
+		Fold deepestFold = this;
+
+		for (int i=0; i<getChildCount(); i++) {
+			Fold fold = getChild(i);
+			if (fold.containsOffset(offs)) {
+				if (fold.isCollapsed()) {
+					break;
+				}
+				deepestFold = fold.getDeepestOpenFoldContaining(offs);
+				break;
+			}
+		}
+
+		return deepestFold;
+
+	}
+
+
+	/**
+	 * Returns the end line of this fold.  For example, in languages such as
+	 * C and Java, this might be the line containing the closing curly brace of
+	 * a code block.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the ending line of the
+	 * code block.
+	 *
+	 * @return The end line of this code block.
+	 * @see #getEndOffset()
+	 * @see #getStartLine()
+	 */
+	public int getEndLine() {
+		int endOffs = getEndOffset();
+		if (lastEndOffs==endOffs) {
+			return cachedEndLine;
+		}
+		lastEndOffs = endOffs;
+		Element root = textArea.getDocument().getDefaultRootElement();
+		return cachedEndLine = root.getElementIndex(endOffs);
+	}
+
+
+	/**
+	 * Returns the end offset of this fold.  For example, in languages such as
+	 * C and Java, this might be the offset of the closing curly brace of a
+	 * code block.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the ending offset of the
+	 * code block.
+	 *
+	 * @return The end offset of this code block, or {@link Integer#MAX_VALUE}
+	 *         if this fold region isn't closed properly.  The latter causes
+	 *         this fold to collapsed all lines through the end of the file.
+	 * @see #getEndLine()
+	 * @see #getStartOffset()
+	 */
+	public int getEndOffset() {
+		return endOffs!=null ? endOffs.getOffset() : Integer.MAX_VALUE;
+	}
+
+
+	/**
+	 * Returns the type of fold this is.  This will be one of the values in
+	 * {@link FoldType}, or a user-defined value.
+	 *
+	 * @return The type of fold this is.
+	 */
+	public int getFoldType() {
+		return type;
+	}
+
+
+	/**
+	 * Returns whether this fold has any child folds.
+	 *
+	 * @return Whether this fold has any children.
+	 * @see #getChildCount()
+	 */
+	public boolean getHasChildFolds() {
+		return getChildCount()>0;
+	}
+
+
+	/**
+	 * Returns the last child fold.
+	 *
+	 * @return The last child fold, or <code>null</code> if this fold does not
+	 *         have any children.
+	 * @see #getChild(int)
+	 * @see #getHasChildFolds()
+	 */
+	public Fold getLastChild() {
+		int childCount = getChildCount();
+		return childCount==0 ? null : getChild(childCount-1);
+	}
+
+
+	/**
+	 * Returns the number of lines that are hidden when this fold is
+	 * collapsed.
+	 *
+	 * @return The number of lines hidden.
+	 * @see #getStartLine()
+	 * @see #getEndLine()
+	 */
+	public int getLineCount() {
+		return getEndLine() - getStartLine();
+	}
+
+
+	/**
+	 * Returns the parent fold of this one.
+	 *
+	 * @return The parent fold, or <code>null</code> if this is a top-level
+	 *         fold.
+	 */
+	public Fold getParent() {
+		return parent;
+	}
+
+
+	/**
+	 * Returns the starting line of this fold region.  This is the only line
+	 * in the fold region that is not hidden when a fold is collapsed.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the starting line of the
+	 * code block.
+	 *
+	 * @return The starting line of the code block.
+	 * @see #getEndLine()
+	 * @see #getStartOffset()
+	 */
+	public int getStartLine() {
+		int startOffs = getStartOffset();
+		if (lastStartOffs==startOffs) {
+			return cachedStartLine;
+		}
+		lastStartOffs = startOffs;
+		Element root = textArea.getDocument().getDefaultRootElement();
+		return cachedStartLine = root.getElementIndex(startOffs);
+	}
+
+
+	/**
+	 * Returns the starting offset of this fold region.  For example, for
+	 * languages such as C and Java, this would be the offset of the opening
+	 * curly brace of a code block.<p>
+	 *
+	 * The value returned by this method will automatically update as the
+	 * text area's contents are modified, to track the starting offset of the
+	 * code block.
+	 *
+	 * @return The start offset of this fold.
+	 * @see #getStartLine()
+	 * @see #getEndOffset()
+	 */
+	public int getStartOffset() {
+		return startOffs.getOffset();
+	}
+
+
+	public int hashCode() {
+		return getStartLine();
+	}
+
+
+	/**
+	 * Returns whether this fold is collapsed.
+	 *
+	 * @return Whether this fold is collapsed.
+	 * @see #setCollapsed(boolean)
+	 * @see #toggleCollapsedState()
+	 */
+	public boolean isCollapsed() {
+		return collapsed;
+	}
+
+
+	/**
+	 * Returns whether this fold is entirely on a single line.  In general,
+	 * a {@link FoldParser} should not remember fold regions all on a single
+	 * line, since there's really nothing to fold.
+	 *
+	 * @return Whether this fold is on a single line.
+	 * @see #removeFromParent()
+	 */
+	public boolean isOnSingleLine() {
+		return getStartLine()==getEndLine();
+	}
+
+
+	/**
+	 * Removes this fold from its parent.  This should only be called by
+	 * {@link FoldParser} implementations if they determine that a fold is all
+	 * on a single line (and thus shouldn't be remembered) after creating it.
+	 *
+	 * @see #isOnSingleLine()
+	 */
+	public void removeFromParent() {
+		if (parent!=null) {
+			parent.removeMostRecentChild();
+			this.parent = null;
+		}
+	}
+
+
+	private void removeMostRecentChild() {
+		children.remove(children.size()-1);
+	}
+
+
+	/**
+	 * Sets whether this <code>Fold</code> is collapsed.  Calling this method
+	 * will update both the text area and all <code>Gutter</code> components.
+	 *
+	 * @param collapsed Whether this fold should be collapsed.
+	 * @see #isCollapsed()
+	 * @see #toggleCollapsedState()
+	 */
+	public void setCollapsed(boolean collapsed) {
+
+		if (collapsed!=this.collapsed) {
+
+			// Change our fold state and cached info about folded line count.
+			int lineCount = getLineCount();
+			int linesToCollapse = lineCount - childCollapsedLineCount;
+			if (!collapsed) { // If we're expanding
+				linesToCollapse = -linesToCollapse;
+			}
+			//System.out.println("Hiding lines: " + linesToCollapse +
+			//		" (" + lineCount + ", " + linesToCollapse + ")");
+			this.collapsed = collapsed;
+			if (parent!=null) {
+				parent.updateChildCollapsedLineCount(linesToCollapse);
+			}
+
+			// If an end point of the selection is being hidden, move the caret
+			// "out" of the fold.
+			if (collapsed) {
+				int dot = textArea.getSelectionStart(); // Forgive variable name
+				Element root = textArea.getDocument().getDefaultRootElement();
+				int dotLine = root.getElementIndex(dot);
+				boolean updateCaret = containsLine(dotLine);
+				if (!updateCaret) {
+					int mark = textArea.getSelectionEnd();
+					if (mark!=dot) {
+						int markLine = root.getElementIndex(mark);
+						updateCaret = containsLine(markLine);
+					}
+				}
+				if (updateCaret) {
+					dot = root.getElement(getStartLine()).getEndOffset() - 1;
+					textArea.setCaretPosition(dot);
+				}
+			}
+
+			textArea.foldToggled(this);
+
+		}
+
+	}
+
+
+	/**
+	 * Sets the ending offset of this fold, such as the closing curly brace
+	 * of a code block in C or Java. {@link FoldParser} implementations should
+	 * call this on an existing <code>Fold</code> upon finding its end.  If
+	 * this method isn't called, then this <code>Fold</code> is considered to
+	 * have no end, i.e., it will collapse everything to the end of the file.
+	 * 
+	 * @param endOffs The end offset of this fold.
+	 * @throws BadLocationException If <code>endOffs</code> is not a valid
+	 *         location in the text area.
+	 */
+	public void setEndOffset(int endOffs) throws BadLocationException {
+		this.endOffs = textArea.getDocument().createPosition(endOffs);
+	}
+
+
+	/**
+	 * Toggles the collapsed state of this fold.
+	 *
+	 * @see #setCollapsed(boolean)
+	 */
+	public void toggleCollapsedState() {
+		setCollapsed(!collapsed);
+	}
+
+
+	private void updateChildCollapsedLineCount(int count) {
+		childCollapsedLineCount += count;
+		//if (childCollapsedLineCount>getLineCount()) {
+		//	Thread.dumpStack();
+		//}
+		if (!collapsed && parent!=null) {
+			parent.updateChildCollapsedLineCount(count);
+		}
+	}
+
+
+	/**
+	 * Overridden for debugging purposes.
+	 *
+	 * @return A string representation of this <code>Fold</code>.
+	 */
+	public String toString() {
+		return "[Fold: " +
+				"startOffs=" + getStartOffset() +
+				", endOffs=" + getEndOffset() +
+				", collapsed=" + collapsed +
+				"]";
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java	(revision 25584)
@@ -0,0 +1,106 @@
+/*
+ * 10/23/2011
+ *
+ * FoldCollapser.java - Goes through an RSTA instance and collapses folds of
+ * specific types, such as comments.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Collapses folds based on their type.  You can create an instance of this
+ * class to collapse all comment blocks when opening a new file, for example.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldCollapser {
+
+	private List typesToCollapse;
+
+
+	/**
+	 * Creates an instance that collapses all comment blocks.
+	 */
+	public FoldCollapser() {
+		this(FoldType.COMMENT);
+	}
+
+
+	/**
+	 * Creates an instance that collapses all blocks of the specified
+	 * type.
+	 *
+	 * @param typeToCollapse The type to collapse.
+	 * @see FoldType
+	 */
+	public FoldCollapser(int typeToCollapse) {
+		typesToCollapse = new ArrayList();
+		addTypeToCollapse(typeToCollapse);
+	}
+
+
+	/**
+	 * Adds a type of fold to collapse.
+	 *
+	 * @param typeToCollapse The type of fold to collapse.
+	 */
+	public void addTypeToCollapse(int typeToCollapse) {
+		typesToCollapse.add(new Integer(typeToCollapse));
+	}
+
+
+	/**
+	 * Collapses any relevant folds known by the fold manager.
+	 *
+	 * @param fm The fold manager.
+	 */
+	public void collapseFolds(FoldManager fm) {
+		for (int i=0; i<fm.getFoldCount(); i++) {
+			Fold fold = fm.getFold(i);
+			collapseImpl(fold);
+		}
+	}
+
+
+	/**
+	 * Collapses the specified fold, and any of its child folds, as
+	 * appropriate.
+	 *
+	 * @param fold The fold to examine.
+	 * @see #getShouldCollapse(Fold)
+	 */
+	protected void collapseImpl(Fold fold) {
+		if (getShouldCollapse(fold)) {
+			fold.setCollapsed(true);
+		}
+		for (int i=0; i<fold.getChildCount(); i++) {
+			collapseImpl(fold.getChild(i));
+		}
+	}
+
+
+	/**
+	 * Returns whether a specific fold should be collapsed.
+	 *
+	 * @param fold The fold to examine.
+	 * @return Whether the fold should be collapsed.
+	 */
+	public boolean getShouldCollapse(Fold fold) {
+		int type = fold.getFoldType();
+		for (int i=0; i<typesToCollapse.size(); i++) {
+			if (type==((Integer)typesToCollapse.get(i)).intValue()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java	(revision 25584)
@@ -0,0 +1,684 @@
+/*
+ * 10/08/2011
+ *
+ * FoldManager.java - Manages code folding in an RSyntaxTextArea instance.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.parser.AbstractParser;
+import org.fife.ui.rsyntaxtextarea.parser.DefaultParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.ParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+
+
+/**
+ * Manages code folding in an instance of RSyntaxTextArea.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldManager {
+
+	private RSyntaxTextArea textArea;
+	private FoldParser parser;
+	private List folds;
+	private boolean codeFoldingEnabled;
+	private PropertyChangeSupport support;
+
+
+	/**
+	 * Property fired when folds have been updated.
+	 */
+	public static final String PROPERTY_FOLDS_UPDATED = "FoldsUpdated";
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area whose folds we are managing.
+	 */
+	public FoldManager(RSyntaxTextArea textArea) {
+		this.textArea = textArea;
+		support = new PropertyChangeSupport(this);
+		Listener l = new Listener();
+		textArea.getDocument().addDocumentListener(l);
+		textArea.addPropertyChangeListener(RSyntaxTextArea.SYNTAX_STYLE_PROPERTY, l);
+		folds = new ArrayList();
+		updateFoldParser(); 
+	}
+
+
+	/**
+	 * Adds a property change listener to this fold manager.
+	 *
+	 * @param l The new listener.
+	 * @see #removePropertyChangeListener(PropertyChangeListener)
+	 */
+	public void addPropertyChangeListener(PropertyChangeListener l) {
+		support.addPropertyChangeListener(l);
+	}
+
+
+	/**
+	 * Removes all folds.
+	 */
+	public void clear() {
+		folds.clear();
+	}
+
+
+	/**
+	 * Ensures that the specified offset is not hidden in a collapsed fold.
+	 * Any folds containing this offset that are collapsed will be expanded.
+	 *
+	 * @param offs The offset.
+	 * @return Whether any folds had to be opened.
+	 * @see #getDeepestFoldContaining(int)
+	 */
+	public boolean ensureOffsetNotInClosedFold(int offs) {
+		boolean foldsOpened = false;
+		Fold fold = getDeepestFoldContaining(offs);
+		while (fold!=null) {
+			if (fold.isCollapsed()) {
+				fold.setCollapsed(false);
+				foldsOpened = true;
+			}
+			fold = fold.getParent();
+		}
+		return foldsOpened;
+	}
+
+
+	/**
+	 * Returns the "deepest" nested fold containing the specified offset.
+	 *
+	 * @param offs The offset.
+	 * @return The deepest fold containing the offset, or <code>null</code> if
+	 *         no fold contains the offset.
+	 */
+	public Fold getDeepestFoldContaining(int offs) {
+		Fold deepestFold = null;
+		if (offs>-1) {
+			for (int i=0; i<folds.size(); i++) {
+				Fold fold = getFold(i);
+				if (fold.containsOffset(offs)) {
+					deepestFold = fold.getDeepestFoldContaining(offs);
+					break;
+				}
+			}
+		}
+		return deepestFold;
+	}
+
+
+	/**
+	 * Returns the "deepest" open fold containing the specified offset.
+	 *
+	 * @param offs The offset.
+	 * @return The fold, or <code>null</code> if no open fold contains the
+	 *         offset.
+	 */
+	public Fold getDeepestOpenFoldContaining(int offs) {
+
+		Fold deepestFold = null;
+
+		if (offs>-1) {
+			for (int i=0; i<folds.size(); i++) {
+				Fold fold = getFold(i);
+				if (fold.containsOffset(offs)) {
+					if (fold.isCollapsed()) {
+						return null;
+					}
+					deepestFold = fold.getDeepestOpenFoldContaining(offs);
+					break;
+				}
+			}
+		}
+
+		return deepestFold;
+
+	}
+
+
+	/**
+	 * Returns a specific top-level fold, which may have child folds.
+	 *
+	 * @param index The index of the fold.
+	 * @return The fold.
+	 * @see #getFoldCount()
+	 */
+	public Fold getFold(int index) {
+		return (Fold)folds.get(index);
+	}
+
+
+	/**
+	 * Returns the number of top-level folds.
+	 *
+	 * @return The number of top-level folds.
+	 * @see #getFold(int)
+	 */
+	public int getFoldCount() {
+		return folds.size();
+	}
+
+
+	/**
+	 * Returns the fold region that starts at the specified line.
+	 *
+	 * @param line The line number.
+	 * @return The fold, or <code>null</code> if the line is not the start
+	 *         of a fold region.
+	 * @see #isFoldStartLine(int)
+	 */
+	public Fold getFoldForLine(int line) {
+		return getFoldForLineImpl(null, folds, line);
+	}
+
+
+private Fold getFoldForLineImpl(Fold parent, List folds, int line) {
+
+	int low = 0;
+	int high = folds.size() - 1;
+
+	while (low <= high) {
+		int mid = (low + high) >> 1;
+		Fold midFold = (Fold)folds.get(mid);
+		int startLine = midFold.getStartLine();
+		if (line==startLine) {
+			return midFold;
+		}
+		else if (line<startLine) {
+			high = mid - 1;
+		}
+		else {
+			int endLine = midFold.getEndLine();
+			if (line>=endLine) {
+				low = mid + 1;
+			}
+			else { // line>startLine && line<=endLine
+				List children = midFold.getChildren();
+				return children!=null ? getFoldForLineImpl(midFold, children, line) : null;
+			}
+		}
+	}
+
+	return null; // No fold for this line
+}
+
+
+	/**
+	 * Returns the total number of hidden (folded) lines.
+	 *
+	 * @return The total number of hidden (folded) lines.
+	 * @see #getHiddenLineCountAbove(int)
+	 */
+	public int getHiddenLineCount() {
+		int count = 0;
+		for (int i=0; i<folds.size(); i++) {
+			count += ((Fold)folds.get(i)).getCollapsedLineCount();
+		}
+		return count;
+	}
+
+
+	/**
+	 * Returns the number of lines "hidden" by collapsed folds above the
+	 * specified line.
+	 *
+	 * @param line The line.  This is the line number for a logical line.
+	 *        For the line number of a physical line (i.e. visible, not folded),
+	 *        use <code>getHiddenLineCountAbove(int, true)</code>.
+	 * @return The number of lines hidden in folds above <code>line</code>.
+	 * @see #getHiddenLineCountAbove(int, boolean)
+	 */
+	public int getHiddenLineCountAbove(int line) {
+		return getHiddenLineCountAbove(line, false);
+	}
+	
+
+	/**
+	 * Returns the number of lines "hidden" by collapsed folds above the
+	 * specified line.
+	 *
+	 * @param line The line.
+	 * @param physical Whether <code>line</code> is the number of a physical
+	 *        line (i.e. visible, not code-folded), or a logical one (i.e. any
+	 *        line from the model).  If <code>line</code> was determined by a
+	 *        raw line calculation (i.e. <code>(visibleTopY / lineHeight)</code>),
+	 *        this value should be <code>true</code>.  It should be
+	 *        <code>false</code> when it was calculated from an offset in the
+	 *        document (for example).
+	 * @return The number of lines hidden in folds above <code>line</code>.
+	 */
+	public int getHiddenLineCountAbove(int line, boolean physical) {
+
+		int count = 0;
+
+		for (int i=0; i<folds.size(); i++) {
+			Fold fold = (Fold)folds.get(i);
+			int comp = physical ? line+count : line;
+			if (fold.getStartLine()>=comp) {
+				break;
+			}
+			count += getHiddenLineCountAboveImpl(fold, comp, physical);
+		}
+
+		return count;
+
+	}
+
+
+	/**
+	 * Returns the number of lines "hidden" by collapsed folds above the
+	 * specified line.
+	 *
+	 * @param fold The current fold in the recursive algorithm.  It and its
+	 *        children are examined.
+	 * @param line The line.
+	 * @param physical Whether <code>line</code> is the number of a physical
+	 *        line (i.e. visible, not code-folded), or a logical one (i.e. any
+	 *        line from the model).  If <code>line</code> was determined by a
+	 *        raw line calculation (i.e. <code>(visibleTopY / lineHeight)</code>),
+	 *        this value should be <code>true</code>.  It should be
+	 *        <code>false</code> when it was calculated from an offset in the
+	 *        document (for example).
+	 * @return The number of lines hidden in folds that are descendants of
+	 *         <code>fold</code>, or <code>fold</code> itself, above
+	 *         <code>line</code>.
+	 */
+	private int getHiddenLineCountAboveImpl(Fold fold, int line, boolean physical) {
+
+		int count = 0;
+
+		if (fold.getEndLine()<line ||
+				(fold.isCollapsed() && fold.getStartLine()<line)) {
+			count = fold.getCollapsedLineCount();
+		}
+		else {
+			int childCount = fold.getChildCount();
+			for (int i=0; i<childCount; i++) {
+				Fold child = fold.getChild(i);
+				int comp = physical ? line+count : line;
+				if (child.getStartLine()>=comp) {
+					break;
+				}
+				count += getHiddenLineCountAboveImpl(child, comp, physical);
+			}
+		}
+
+		return count;
+
+	}
+
+
+	/**
+	 * Returns the last visible line in the text area, taking into account
+	 * folds.
+	 *
+	 * @return The last visible line.
+	 */
+	public int getLastVisibleLine() {
+
+		int lastLine = textArea.getLineCount() - 1;
+
+		if (isCodeFoldingSupportedAndEnabled()) {
+			int foldCount = getFoldCount();
+			if (foldCount>0) {
+				Fold lastFold = getFold(foldCount-1);
+				if (lastFold.containsLine(lastLine)) {
+					if (lastFold.isCollapsed()) {
+						lastLine = lastFold.getStartLine();
+					}
+					else { // Child fold may end on the same line as parent
+						while (lastFold.getHasChildFolds()) {
+							lastFold = lastFold.getLastChild();
+							if (lastFold.containsLine(lastLine)) {
+								if (lastFold.isCollapsed()) {
+									lastLine = lastFold.getStartLine();
+									break;
+								}
+							}
+							else { // Higher up
+								break;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return lastLine;
+
+	}
+
+
+	public int getVisibleLineAbove(int line) {
+
+		if (line<=0 || line>=textArea.getLineCount()) {
+			return -1;
+		}
+
+		do {
+			line--;
+		} while (line>=0 && isLineHidden(line));
+
+		return line;
+
+	}
+
+
+	public int getVisibleLineBelow(int line) {
+
+		int lineCount = textArea.getLineCount();
+		if (line<0 || line>=lineCount-1) {
+			return -1;
+		}
+
+		do {
+			line++;
+		} while (line<lineCount && isLineHidden(line));
+
+		return line==lineCount ? -1 : line;
+
+	}
+
+
+//	private static int binaryFindFoldContainingLine(int line) {
+//
+//List allFolds;
+//
+//		int low = 0;
+//		int high = allFolds.size() - 1;
+//
+//		while (low <= high) {
+//			int mid = (low + high) >> 1;
+//			Fold midVal = (Fold)allFolds.get(mid);
+//			if (midVal.containsLine(line)) {
+//				return mid;
+//			}
+//			if (line<=midVal.getStartLine()) {
+//				high = mid - 1;
+//			}
+//			else { // line > midVal.getEndLine()
+//				low = mid + 1;
+//			}
+//		}
+//
+//		return -(low + 1); // key not found
+//
+//	}
+
+
+    /**
+	 * Returns whether code folding is enabled.  Note that only certain
+	 * languages support code folding; those that do not will ignore this
+	 * property.
+	 *
+	 * @return Whether code folding is enabled.
+	 * @see #setCodeFoldingEnabled(boolean)
+	 */
+	public boolean isCodeFoldingEnabled() {
+		return codeFoldingEnabled;
+	}
+
+
+	/**
+	 * Returns <code>true</code> if and only if code folding is enabled for
+	 * this text area, AND folding is supported for the language it is editing.
+	 * Whether or not folding is supported for a language depends on whether
+	 * a fold parser is registered for that language with the
+	 * <code>FoldParserManager</code>.
+	 *
+	 * @return Whether folding is supported and enabled for this text area.
+	 * @see FoldParserManager
+	 */
+	public boolean isCodeFoldingSupportedAndEnabled() {
+		return codeFoldingEnabled && parser!=null;
+	}
+
+
+	/**
+	 * Returns whether the specified line contains the start of a fold region.
+	 *
+	 * @param line The line.
+	 * @return Whether the line contains the start of a fold region.
+	 * @see #getFoldForLine(int)
+	 */
+	public boolean isFoldStartLine(int line) {
+		return getFoldForLine(line)!=null;
+	}
+
+
+	/**
+	 * Returns whether a line is hidden in a collapsed fold.
+	 *
+	 * @param line The line to check.
+	 * @return Whether the line is hidden in a collapsed fold.
+	 */
+	public boolean isLineHidden(int line) {
+		for (int i=0; i<folds.size(); i++) {
+			Fold fold = (Fold)folds.get(i);
+			if (fold.containsLine(line)) {
+				if (fold.isCollapsed()) {
+					return true;
+				}
+				else {
+					return isLineHiddenImpl(fold, line);
+				}
+			}
+		}
+		return false;
+	}
+
+
+	private boolean isLineHiddenImpl(Fold parent, int line) {
+		for (int i=0; i<parent.getChildCount(); i++) {
+			Fold child = parent.getChild(i);
+			if (child.containsLine(line)) {
+				if (child.isCollapsed()) {
+					return true;
+				}
+				else {
+					return isLineHiddenImpl(child, line);
+				}
+			}
+		}
+		return false;
+	}
+
+
+	private void keepFoldState(Fold newFold, List oldFolds) {
+		int previousLoc = Collections.binarySearch(oldFolds, newFold);
+		//System.out.println(newFold + " => " + previousLoc);
+		if (previousLoc>=0) {
+			Fold prevFold = (Fold)oldFolds.get(previousLoc);
+			newFold.setCollapsed(prevFold.isCollapsed());
+		}
+		else {
+			//previousLoc = -(insertion point) - 1;
+			int insertionPoint = -(previousLoc + 1);
+			if (insertionPoint>0) {
+				Fold possibleParentFold = (Fold)oldFolds.get(insertionPoint-1);
+				List children = possibleParentFold.getChildren();
+				if (children!=null) {
+					keepFoldState(newFold, children);
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Removes a property change listener from this fold manager.
+	 *
+	 * @param l The listener to remove.
+	 * @see #addPropertyChangeListener(PropertyChangeListener)
+	 */
+	public void removePropertyChangeListener(PropertyChangeListener l) {
+		support.removePropertyChangeListener(l);
+	}
+
+
+	/**
+	 * Forces an immediate reparsing for folds, if folding is enabled.  This
+	 * usually does not need to be called by the programmer, since fold
+	 * parsing is done automatically by RSTA.
+	 */
+	public void reparse() {
+
+		if (codeFoldingEnabled && parser!=null) {
+
+			// Re-calculate folds.  Keep the fold state of folds that are
+			// still around.
+			List newFolds = parser.getFolds(textArea);
+			if (newFolds==null) {
+				newFolds = Collections.EMPTY_LIST;
+			}
+			else {
+				for (int i=0; i<newFolds.size(); i++) {
+					Fold newFold = (Fold)newFolds.get(i);
+					keepFoldState(newFold, folds);
+					for (int j=0; j<newFold.getChildCount(); j++) {
+						keepFoldState(newFold.getChild(j), folds);
+					}
+				}
+			}
+			folds = newFolds;
+
+			// Let folks (gutter, etc.) know that folds have been updated.
+			support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, folds);
+			textArea.repaint();
+
+		}
+		else {
+			folds.clear();
+		}
+
+	}
+
+	/**
+	 * Sets whether code folding is enabled.  Note that only certain
+	 * languages will support code folding out of the box.  Those languages
+	 * which do not support folding will ignore this property.
+	 *
+	 * @param enabled Whether code folding should be enabled.
+	 * @see #isCodeFoldingEnabled()
+	 */
+	public void setCodeFoldingEnabled(boolean enabled) {
+		if (enabled!=codeFoldingEnabled) {
+			codeFoldingEnabled = enabled;
+			if (tempParser!=null) {
+				textArea.removeParser(tempParser);
+			}
+			if (enabled) {
+				tempParser = new AbstractParser() {
+					public ParseResult parse(RSyntaxDocument doc, String style) {
+						reparse();
+						return new DefaultParseResult(this);
+					}
+				};
+				textArea.addParser(tempParser);
+				support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, null);
+				//reparse();
+			}
+			else {
+				folds = Collections.EMPTY_LIST;
+				textArea.repaint();
+				support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, null);
+			}
+		}
+	}
+private Parser tempParser;
+
+
+	/**
+	 * Sets the folds for this fold manager.
+	 *
+	 * @param folds The new folds.  This should not be <code>null</code>.
+	 */
+	public void setFolds(List folds) {
+		this.folds = folds;
+	}
+
+
+	/**
+	 * Updates the fold parser to be the one appropriate for the language
+	 * currently being highlighted.
+	 */
+	private void updateFoldParser() {
+		parser = FoldParserManager.get().getFoldParser(
+											textArea.getSyntaxEditingStyle());
+	}
+
+
+	/**
+	 * Listens for events in the text editor.
+	 */
+	private class Listener implements DocumentListener, PropertyChangeListener {
+
+		public void changedUpdate(DocumentEvent e) {
+		}
+
+		public void insertUpdate(DocumentEvent e) {
+			// Adding text containing a newline to the visible line of a folded
+			// Fold causes that Fold to unfold.  Check only start offset of
+			// insertion since that's the line that was "modified".
+			int startOffs = e.getOffset();
+			int endOffs = startOffs + e.getLength();
+			Document doc = e.getDocument();
+			Element root = doc.getDefaultRootElement();
+			int startLine = root.getElementIndex(startOffs);
+			int endLine = root.getElementIndex(endOffs);
+			if (startLine!=endLine) { // Inserted text covering > 1 line...
+				Fold fold = getFoldForLine(startLine);
+				if (fold!=null && fold.isCollapsed()) {
+					fold.toggleCollapsedState();
+				}
+			}
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+			// Syntax style changed in editor.
+			updateFoldParser();
+			reparse(); // Even if no fold parser change, highlighting did
+		}
+		public void removeUpdate(DocumentEvent e) {
+			// Removing text from the visible line of a folded Fold causes that
+			// Fold to unfold.  We only need to check the removal offset since
+			// that's the new caret position.
+			int offs = e.getOffset();
+			try {
+				int lastLineModified = textArea.getLineOfOffset(offs);
+				//System.out.println(">>> " + lastLineModified);
+				Fold fold = getFoldForLine(lastLineModified);
+				//System.out.println("&&& " + fold);
+				if (fold!=null && fold.isCollapsed()) {
+					fold.toggleCollapsedState();
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java	(revision 25584)
@@ -0,0 +1,41 @@
+/*
+ * 10/08/2011
+ *
+ * FoldParser.java - Locates folds in an RSyntaxTextArea instance.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.List;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * Locates folds in a document.  If you are implementing a language that has
+ * sections of source code that can be logically "folded," you can create an
+ * instance of this interface that locates those regions and represents them
+ * as {@link Fold}s.  <code>RSyntaxTextArea</code> knows how to take it from
+ * there and implement code folding in the editor.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see CurlyFoldParser
+ * @see XmlFoldParser
+ */
+public interface FoldParser {
+
+
+	/**
+	 * Returns a list of all folds in the text area.
+	 *
+	 * @param textArea The text area whose contents should be analyzed.
+	 * @return The list of folds.  If this method returns <code>null</code>,
+	 *         it is treated as if no folds were found.
+	 */
+	public List getFolds(RSyntaxTextArea textArea);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java	(revision 25584)
@@ -0,0 +1,112 @@
+/*
+ * 10/08/2011
+ *
+ * FoldParserManager.java - Used by RSTA to determine what fold parser to use
+ * for each language it supports.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+
+
+/**
+ * Manages fold parsers.  Instances of <code>RSyntaxTextArea</code> call into
+ * this class to retrieve fold parsers for whatever language they're editing.
+ * Folks implementing custom languages can add a {@link FoldParser}
+ * implementation for their language to this manager and it will be used by
+ * RSTA.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldParserManager implements SyntaxConstants {
+
+	/**
+	 * Map from syntax styles to fold parsers.
+	 */
+	private Map foldParserMap;
+
+	private static final FoldParserManager INSTANCE = new FoldParserManager();
+
+
+	/**
+	 * Private constructor to prevent instantiation.
+	 */
+	private FoldParserManager() {
+		foldParserMap = createFoldParserMap();
+	}
+
+
+	/**
+	 * Adds a mapping from a syntax style to a fold parser.  The parser
+	 * specified will be shared among all RSTA instances editing that language,
+	 * so it should be stateless (which should not be difficult for a fold
+	 * parser).  You can also override the fold parser for built-in languages,
+	 * such as <code>SYNTAX_STYLE_JAVA</code>, with your own parser
+	 * implementations.
+	 *
+	 * @param syntaxStyle The syntax style.
+	 * @param parser The parser.
+	 * @see SyntaxConstants
+	 */
+	public void addFoldParserMapping(String syntaxStyle, FoldParser parser) {
+		foldParserMap.put(syntaxStyle, parser);
+	}
+
+
+	/**
+	 * Creates the syntax style-to-fold parser mapping for built-in languages.
+	 * @return
+	 */
+	private Map createFoldParserMap() {
+
+		Map map = new HashMap();
+
+		map.put(SYNTAX_STYLE_C,					new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_CPLUSPLUS,			new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_CSHARP,			new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_CSS,				new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_GROOVY,			new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_JAVA,				new CurlyFoldParser(true, true));
+		map.put(SYNTAX_STYLE_JAVASCRIPT,		new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_LATEX,				new LatexFoldParser());
+		map.put(SYNTAX_STYLE_MXML,				new XmlFoldParser());
+		map.put(SYNTAX_STYLE_PERL,				new CurlyFoldParser());
+		map.put(SYNTAX_STYLE_XML,				new XmlFoldParser());
+
+		return map;
+
+	}
+
+
+	/**
+	 * Returns the singleton instance of this class.
+	 *
+	 * @return The singleton instance.
+	 */
+	public static FoldParserManager get() {
+		return INSTANCE;
+	}
+
+
+	/**
+	 * Returns a fold parser to use for an editor highlighting code of a
+	 * specific language.
+	 *
+	 * @param syntaxStyle A value from {@link SyntaxConstants}, such as
+	 *        <code>SYNTAX_STYLE_JAVA</code>.
+	 * @return A fold parser to use, or <code>null</code> if none is registered
+	 *         for the language.
+	 */
+	public FoldParser getFoldParser(String syntaxStyle) {
+		return (FoldParser)foldParserMap.get(syntaxStyle);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldType.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldType.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/FoldType.java	(revision 25584)
@@ -0,0 +1,59 @@
+/*
+ * 10/08/2011
+ *
+ * FoldType.java - Types of folds found in many programming languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+
+/**
+ * Constants representing the "type" of a folded region.  Implementations of
+ * {@link FoldParser} can also define their own folded region types, provided
+ * they give them values of at least {@link #FOLD_TYPE_USER_DEFINED_MIN}.  This
+ * allows you to identify and auto-fold specific regions of source code when
+ * opening files; for example, a Java editor could identify all import
+ * statements in a file as a foldable region, and give it a user-defined value
+ * for fold type.  Then, the UI could provide a means for the user to specify
+ * that they always want the import region folded when opening a new file.<p>
+ * 
+ * The majority of the time, however, code editors won't need to be that fancy,
+ * and can simply use the standard <code>CODE</code> and <code>COMMENT</code>
+ * fold types.
+ * 
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Fold
+ */
+public interface FoldType {
+
+	/**
+	 * Denotes a <code>Fold</code> as being a region of code.
+	 */
+	public static final int CODE							= 0;
+
+	/**
+	 * Denotes a <code>Fold</code> as being a multi-line comment.
+	 */
+	public static final int COMMENT							= 1;
+
+	/**
+	 * Denotes a <code>Fold</code> as being a section of import statements
+	 * (Java), include statements (C), etc.
+	 */
+	public static final int IMPORTS							= 2;
+
+	/**
+	 * Users building advanced editors such as IDE's, that want to allow their
+	 * users to auto-expand/collapse foldable regions of a specific type other
+	 * than comments, should define their custom fold types using values
+	 * <code>FOLD_TYPE_USER_DEFINED_MIN + <em>n</em></code>.  That way, if
+	 * new default fold types are added to this interface in the future, your
+	 * code won't suddenly break when upgrading to a new version of RSTA.
+	 */
+	public static final int FOLD_TYPE_USER_DEFINED_MIN		= 1000;
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java	(revision 25584)
@@ -0,0 +1,111 @@
+/*
+ * 04/24/2012
+ *
+ * LatexFoldParser.java - Fold parser for LaTeX.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * A fold parser for LaTeX documents.  This is likely incomplete and/or not
+ * quite right; feedback is appreciated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LatexFoldParser implements FoldParser {
+
+	private static final char[] BEGIN = "\\begin".toCharArray();
+	private static final char[] END = "\\end".toCharArray();
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+		Stack expectedStack = new Stack();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.is(Token.RESERVED_WORD, BEGIN)) {
+						Token temp = t.getNextToken();
+						if (temp!=null && temp.isLeftCurly()) {
+							temp = temp.getNextToken();
+							if (temp!=null && temp.type==Token.RESERVED_WORD) {
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+									folds.add(currentFold);
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+								}
+								expectedStack.push(temp.getLexeme());
+								t = temp;
+							}
+						}
+					}
+
+					else if (t.is(Token.RESERVED_WORD, END) &&
+							currentFold!=null && !expectedStack.isEmpty()) {
+						Token temp = t.getNextToken();
+						if (temp!=null && temp.isLeftCurly()) {
+							temp = temp.getNextToken();
+							if (temp!=null && temp.type==Token.RESERVED_WORD) {
+								String value = temp.getLexeme();
+								if (expectedStack.peek().equals(value)) {
+									expectedStack.pop();
+									currentFold.setEndOffset(t.offset);
+									Fold parentFold = currentFold.getParent();
+									// Don't add fold markers for single-line blocks
+									if (currentFold.isOnSingleLine()) {
+										if (parentFold!=null) {
+											currentFold.removeFromParent();
+										}
+										else {
+											folds.remove(folds.size()-1);
+										}
+									}
+									t = temp;
+									currentFold = parentFold;
+								}
+							}
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Never happens
+		}
+
+		return folds;
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java	(revision 25584)
@@ -0,0 +1,133 @@
+/*
+ * 10/23/2011
+ *
+ * XmlFoldParser.java - Fold parser for XML.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Fold parser for XML.  Any tags that span more than one line, as well as
+ * comment regions spanning more than one line, are identified as foldable
+ * regions.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class XmlFoldParser implements FoldParser {
+
+	private static final char[] MARKUP_CLOSING_TAG_START = { '<', '/' };
+	private static final char[] MARKUP_SHORT_TAG_END = { '/', '>' };
+	private static final char[] MLC_END = { '-', '-', '>' };
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getFolds(RSyntaxTextArea textArea) {
+
+		List folds = new ArrayList();
+
+		Fold currentFold = null;
+		int lineCount = textArea.getLineCount();
+		boolean inMLC = false;
+		int mlcStart = 0;
+
+		try {
+
+			for (int line=0; line<lineCount; line++) {
+
+				Token t = textArea.getTokenListForLine(line);
+				while (t!=null && t.isPaintable()) {
+
+					if (t.isComment()) {
+
+						// Continuing an MLC from a previous line
+						if (inMLC) {
+							// Found the end of the MLC starting on a previous line...
+							if (t.endsWith(MLC_END)) {
+								int mlcEnd = t.offset + t.textCount - 1;
+								if (currentFold==null) {
+									currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									folds.add(currentFold);
+									currentFold = null;
+								}
+								else {
+									currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+									currentFold.setEndOffset(mlcEnd);
+									currentFold = currentFold.getParent();
+								}
+								inMLC = false;
+								mlcStart = 0;
+							}
+							// Otherwise, this MLC is continuing on to yet
+							// another line.
+						}
+
+						else {
+							// If we're an MLC that ends on a later line...
+							if (t.type==Token.COMMENT_MULTILINE && !t.endsWith(MLC_END)) {
+								inMLC = true;
+								mlcStart = t.offset;
+							}
+						}
+
+					}
+
+					else if (t.type==Token.MARKUP_TAG_DELIMITER && t.isSingleChar('<')) {
+						if (currentFold==null) {
+							currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+							folds.add(currentFold);
+						}
+						else {
+							currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+						}
+					}
+
+					else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_SHORT_TAG_END)) {
+						if (currentFold!=null) {
+							Fold parentFold = currentFold.getParent();
+							currentFold.removeFromParent();
+							currentFold = parentFold;
+						}
+					}
+
+					else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_CLOSING_TAG_START)) {
+						if (currentFold!=null) {
+							currentFold.setEndOffset(t.offset);
+							Fold parentFold = currentFold.getParent();
+							// Don't add fold markers for single-line blocks
+							if (currentFold.isOnSingleLine()) {
+								currentFold.removeFromParent();
+							}
+							currentFold = parentFold;
+						}
+					}
+
+					t = t.getNextToken();
+
+				}
+
+			}
+
+		} catch (BadLocationException ble) { // Should never happen
+			ble.printStackTrace();
+		}
+
+		return folds;
+	
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/folding/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Code folding functionality.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java	(revision 25584)
@@ -0,0 +1,54 @@
+/*
+ * 10/03/2009
+ *
+ * AbstractMarkupTokenMaker.java - Base class for token makers for markup
+ * languages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+
+
+/**
+ * Base class for token makers for markup languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractMarkupTokenMaker extends AbstractJFlexTokenMaker {
+
+
+	/**
+	 * Returns whether markup close tags should be completed.
+	 *
+	 * @return Whether closing markup tags are to be completed.
+	 */
+	public abstract boolean getCompleteCloseTags();
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "<!--", "-->" };
+	}
+
+
+	/**
+	 * Overridden to return <code>true</code>.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public final boolean isMarkupLanguage() {
+		return true;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex	(revision 25584)
@@ -0,0 +1,498 @@
+/*
+ * 04/27/2010
+ *
+ * ActionScriptTokenMaker.java - Scanner for ActionScript.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the ActionScript.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ActionScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class ActionScriptTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ActionScriptTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= [A-Za-z]
+LetterOrUnderscore				= ({Letter}|"_")
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+AnyCharacterButApostropheOrBackSlash	= ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash	= ([^\\\"\n])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape							= ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+CharLiteral				= ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+UnclosedCharLiteral			= ([\'][^\'\n]*)
+ErrorCharLiteral			= ({UnclosedCharLiteral}[\'])
+StringLiteral				= ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+
+MLCBegin					= ("/*")
+MLCEnd						= ("*/")
+LineCommentBegin			= ("//")
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral				= ("true"|"false")
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"add" |
+	"and" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"continue" |
+	"default" |
+	"delete" |
+	"do" |
+	"dynamic" |
+	"else" |
+	"eq" |
+	"extends" |
+	"final" |
+	"finally" |
+	"for" |
+	"for each" |
+	"function" |
+	"ge" |
+	"get" |
+	"gt" |
+	"if" |
+	"ifFrameLoaded" |
+	"implements" |
+	"import" |
+	"in" |
+	"include" |
+	"interface" |
+	"internal" |
+	"label" |
+	"le" |
+	"lt" |
+	"namespace" |
+	"native" |
+	"ne" |
+	"new" |
+	"not" |
+	"on" |
+	"onClipEvent" |
+	"or" |
+	"override" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"return" |
+	"set" |
+	"static" |
+	"super" |
+	"switch" |
+	"tellTarget" |
+	"this" |
+	"throw" |
+	"try" |
+	"typeof" |
+	"use" |
+	"var" |
+	"void" |
+	"while" |
+	"with" |
+
+	"null" |
+	"undefined"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Built-in objects (good idea not to use these names!) */
+	"Array" |
+	"Boolean" |
+	"Color" |
+	"Date" |
+	"Function" |
+	"int" |
+	"Key" |
+	"MovieClip" |
+	"Math" |
+	"Mouse" |
+	"Null" |
+	"Number" |
+	"Object" |
+	"Selection" |
+	"Sound" |
+	"String" |
+	"uint" |
+	"Vector" |
+	"void" |
+	"XML" |
+	"XMLNode" |
+	"XMLSocket"			{ addToken(Token.DATA_TYPE); }
+
+	/* Global functions */
+	"call" |
+	"escape" |
+	"eval" |
+	"fscommand" |
+	"getProperty" |
+	"getTimer" |
+	"getURL" |
+	"getVersion" |
+	"gotoAndPlay" |
+	"gotoAndStop" |
+	"#include" |
+	"int" |
+	"isFinite" |
+	"isNaN" |
+	"loadMovie" |
+	"loadMovieNum" |
+	"loadVariables" |
+	"loadVariablesNum" |
+	"maxscroll" |
+	"newline" |
+	"nextFrame" |
+	"nextScene" |
+	"Number" |
+	"parseFloat" |
+	"parseInt" |
+	"play" |
+	"prevFrame" |
+	"prevScene" |
+	"print" |
+	"printAsBitmap" |
+	"printAsBitmapNum" |
+	"printNum" |
+	"random" |
+	"removeMovieClip" |
+	"scroll" |
+	"setProperty" |
+	"startDrag" |
+	"stop" |
+	"stopAllSounds" |
+	"stopDrag" |
+	"String" |
+	"targetPath" |
+	"tellTarget" |
+	"toggleHighQuality" |
+	"trace" |
+	"unescape" |
+	"unloadMovie" |
+	"unloadMovieNum" |
+	"updateAfterEvent"			{ addToken(Token.FUNCTION); }
+
+	/* Booleans. */
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java	(revision 25584)
@@ -0,0 +1,2071 @@
+/* The following code was generated by JFlex 1.4.1 on 5/12/10 4:49 PM */
+
+/*
+ * 04/27/2010
+ *
+ * ActionScriptTokenMaker.java - Scanner for ActionScript.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the ActionScript.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ActionScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class ActionScriptTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\21\1\10\1\0\1\21\1\17\22\0\1\72\1\50\1\15"+
+    "\1\20\1\1\1\50\1\52\1\7\2\55\1\23\1\43\1\42\1\31"+
+    "\1\32\1\22\1\4\3\16\4\6\2\3\1\53\1\42\1\44\1\45"+
+    "\1\47\1\51\1\54\1\100\1\5\1\76\1\26\1\30\1\74\1\1"+
+    "\1\114\1\113\1\1\1\101\1\25\1\102\1\103\1\104\1\110\1\115"+
+    "\1\112\1\106\1\77\1\111\1\107\1\1\1\24\2\1\1\55\1\11"+
+    "\1\55\1\46\1\2\1\0\1\36\1\14\1\64\1\62\1\35\1\27"+
+    "\1\73\1\56\1\60\1\105\1\63\1\37\1\67\1\13\1\65\1\57"+
+    "\1\70\1\34\1\40\1\33\1\12\1\75\1\61\1\71\1\66\1\1"+
+    "\1\41\1\46\1\41\1\51\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\3\0\1\1\1\2\2\3\1\2\1\4\1\5\3\2"+
+    "\1\6\2\1\1\7\2\10\3\2\1\10\7\2\1\11"+
+    "\1\2\5\10\22\2\1\12\1\13\5\12\1\14\3\12"+
+    "\1\1\1\15\1\3\1\16\1\15\1\16\1\15\1\17"+
+    "\1\15\1\2\1\4\1\20\1\0\1\4\5\2\1\21"+
+    "\3\2\2\6\1\22\1\1\1\23\1\24\21\2\1\21"+
+    "\12\2\1\0\1\10\4\2\2\21\11\2\1\21\2\2"+
+    "\1\21\17\2\1\25\10\0\1\1\1\16\1\0\2\17"+
+    "\1\2\1\4\1\26\2\4\1\20\1\4\6\2\1\21"+
+    "\4\2\1\6\1\27\1\6\1\1\1\0\1\30\5\2"+
+    "\1\21\23\2\1\21\11\2\1\30\20\2\1\21\4\2"+
+    "\1\30\12\2\10\0\1\1\1\2\1\4\10\2\1\6"+
+    "\1\1\1\31\5\2\1\0\1\32\13\2\1\33\3\2"+
+    "\1\33\40\2\2\0\1\34\2\0\1\35\1\1\1\2"+
+    "\1\4\7\2\1\6\1\1\4\2\1\21\1\0\17\2"+
+    "\1\33\23\2\4\0\1\1\1\2\1\4\6\2\1\6"+
+    "\1\1\4\2\1\0\35\2\1\1\2\2\1\0\24\2"+
+    "\1\33\1\2\1\21\25\2\1\33\40\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[531];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+    "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u02be\0\u0444"+
+    "\0\u0492\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4"+
+    "\0\u0702\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u02be\0\u02be"+
+    "\0\u08d6\0\u0924\0\u0972\0\u02be\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa"+
+    "\0\u0af8\0\u0b46\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc\0\u0d1a"+
+    "\0\u0d68\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0eee\0\u0f3c\0\u0f8a"+
+    "\0\u02be\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110\0\u02be\0\u115e"+
+    "\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u1296\0\u1296\0\u12e4\0\u1332"+
+    "\0\u1380\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u02be\0\u1506\0\u1554"+
+    "\0\u15a2\0\u15f0\0\u163e\0\u168c\0\u16da\0\u1728\0\u1776\0\u17c4"+
+    "\0\u1812\0\u1860\0\u18ae\0\u02be\0\u18fc\0\u02be\0\u194a\0\u1998"+
+    "\0\u19e6\0\u1a34\0\u1a82\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08"+
+    "\0\u1c56\0\u1ca4\0\u1cf2\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78"+
+    "\0\u0138\0\u1ec6\0\u1f14\0\u1f62\0\u1fb0\0\u1ffe\0\u204c\0\u209a"+
+    "\0\u20e8\0\u2136\0\u2184\0\u052e\0\u21d2\0\u2220\0\u226e\0\u22bc"+
+    "\0\u230a\0\u2358\0\u23a6\0\u23f4\0\u2442\0\u2490\0\u24de\0\u252c"+
+    "\0\u257a\0\u25c8\0\u2616\0\u2664\0\u26b2\0\u2700\0\u274e\0\u279c"+
+    "\0\u27ea\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c"+
+    "\0\u2a5a\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u02be"+
+    "\0\u2c7c\0\u2cca\0\u2d18\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e"+
+    "\0\u2eec\0\u2f3a\0\u2f88\0\u1296\0\u2fd6\0\u3024\0\u3072\0\u02be"+
+    "\0\u30c0\0\u310e\0\u1506\0\u315c\0\u31aa\0\u31f8\0\u3246\0\u3294"+
+    "\0\u32e2\0\u3330\0\u337e\0\u33cc\0\u341a\0\u3468\0\u34b6\0\u3504"+
+    "\0\u02be\0\u3552\0\u35a0\0\u35ee\0\u363c\0\u368a\0\u36d8\0\u3726"+
+    "\0\u3774\0\u37c2\0\u3810\0\u385e\0\u38ac\0\u38fa\0\u3948\0\u3996"+
+    "\0\u39e4\0\u3a32\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06"+
+    "\0\u3c54\0\u3ca2\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u3e76"+
+    "\0\u3ec4\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6"+
+    "\0\u4134\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356"+
+    "\0\u43a4\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6"+
+    "\0\u4614\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u0138\0\u47e8"+
+    "\0\u4836\0\u4884\0\u48d2\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58"+
+    "\0\u4aa6\0\u4af4\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8"+
+    "\0\u4d16\0\u4d64\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38"+
+    "\0\u4f86\0\u4fd4\0\u5022\0\u5070\0\u50be\0\u510c\0\u02be\0\u515a"+
+    "\0\u51a8\0\u51f6\0\u5244\0\u5292\0\u52e0\0\u0138\0\u532e\0\u537c"+
+    "\0\u53ca\0\u5418\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec"+
+    "\0\u563a\0\u0138\0\u5688\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e"+
+    "\0\u585c\0\u58aa\0\u58f8\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e"+
+    "\0\u5acc\0\u5b1a\0\u5b68\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee"+
+    "\0\u5d3c\0\u5d8a\0\u5dd8\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e"+
+    "\0\u5fac\0\u5ffa\0\u6048\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce"+
+    "\0\u621c\0\u626a\0\u62b8\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e"+
+    "\0\u648c\0\u64da\0\u6528\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae"+
+    "\0\u66fc\0\u674a\0\u6798\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e"+
+    "\0\u696c\0\u69ba\0\u6a08\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e"+
+    "\0\u6bdc\0\u6c2a\0\u6c78\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe"+
+    "\0\u6e4c\0\u6e9a\0\u6ee8\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e"+
+    "\0\u70bc\0\u710a\0\u7158\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de"+
+    "\0\u732c\0\u737a\0\u621c\0\u73c8\0\u6306\0\u7416\0\u7464\0\u74b2"+
+    "\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638\0\u7686\0\u76d4\0\u7722"+
+    "\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8\0\u78f6\0\u7944\0\u7992"+
+    "\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca\0\u7b18\0\u7b66\0\u7bb4\0\u7c02"+
+    "\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a\0\u7d88\0\u7dd6\0\u7e24\0\u7e72"+
+    "\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa\0\u7ff8\0\u8046\0\u8094\0\u80e2"+
+    "\0\u8130\0\u817e\0\u81cc\0\u821a\0\u8268\0\u82b6\0\u8304\0\u8352"+
+    "\0\u83a0\0\u83ee\0\u843c\0\u848a\0\u84d8\0\u8526\0\u8574\0\u85c2"+
+    "\0\u8610\0\u865e\0\u86ac\0\u86fa\0\u8748\0\u8796\0\u87e4\0\u8832"+
+    "\0\u8880\0\u88ce\0\352\0\u891c\0\u02be\0\u896a\0\u89b8\0\u8a06"+
+    "\0\u8a54\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda\0\u8c28\0\u8c76"+
+    "\0\u8cc4\0\u8d12\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a\0\u8e98\0\u8ee6"+
+    "\0\u8f34\0\u8f82\0\u8fd0\0\u901e\0\u906c\0\u90ba\0\u9108\0\u9156"+
+    "\0\u91a4\0\u91f2\0\u9240\0\u928e\0\u92dc\0\u932a\0\u9378\0\u93c6"+
+    "\0\u9414\0\u9462\0\u94b0\0\u94fe\0\u954c\0\u959a\0\u95e8\0\u9636"+
+    "\0\u9684\0\u96d2\0\u9720\0\u976e\0\u97bc\0\u980a\0\u9858\0\u98a6"+
+    "\0\u98f4\0\u9942\0\u9990";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[531];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\4\2\5\1\6\1\7\1\10\1\6\1\11\1\12"+
+    "\1\4\1\13\1\14\1\15\1\16\1\6\1\17\1\20"+
+    "\1\21\1\22\1\23\1\24\1\5\1\25\1\26\1\5"+
+    "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36"+
+    "\1\37\1\40\1\41\1\42\2\23\1\43\1\23\1\44"+
+    "\1\45\1\44\1\4\1\37\1\5\1\46\1\47\1\50"+
+    "\1\51\1\5\1\52\1\53\1\5\1\54\2\5\1\21"+
+    "\1\55\1\56\1\57\1\60\1\5\1\61\1\62\1\63"+
+    "\1\64\1\65\1\5\1\66\1\67\6\5\10\70\1\71"+
+    "\12\70\1\72\3\70\1\73\26\70\1\74\2\70\1\75"+
+    "\34\70\10\76\1\77\16\76\1\100\26\76\1\101\2\76"+
+    "\1\102\34\76\7\4\2\0\4\4\1\0\1\4\1\0"+
+    "\1\4\3\0\5\4\2\0\6\4\13\0\1\4\1\0"+
+    "\14\4\1\0\24\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\3\104\2\6\1\104"+
+    "\1\6\2\0\4\104\1\0\1\6\1\0\1\104\3\0"+
+    "\1\104\1\105\2\106\1\107\1\0\1\110\2\104\1\107"+
+    "\1\104\1\105\1\104\13\0\1\104\1\0\4\104\1\106"+
+    "\7\104\1\0\1\104\1\106\24\104\1\111\1\112\1\104"+
+    "\1\112\2\0\4\104\1\0\1\112\1\0\1\104\3\0"+
+    "\1\113\1\105\2\106\1\107\1\0\1\110\2\104\1\107"+
+    "\1\104\1\105\1\104\13\0\1\104\1\0\4\104\1\106"+
+    "\6\104\1\113\1\0\1\104\1\106\21\104\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\114"+
+    "\4\5\1\0\23\5\7\115\1\116\1\117\1\120\104\115"+
+    "\116\0\1\4\6\5\2\0\1\103\1\5\1\121\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\5\5"+
+    "\1\122\13\0\1\4\1\0\1\5\1\123\1\124\11\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\1\125\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\126\1\127\2\5\13\0\1\4\1\0\7\5\1\130"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\131\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\10\16\1\132\1\133\3\16\1\134\100\16\7\4\2\0"+
+    "\4\4\1\0\1\4\1\0\1\4\3\0\5\4\2\0"+
+    "\6\4\13\0\1\4\1\0\2\4\1\135\11\4\1\0"+
+    "\23\4\21\0\1\21\50\0\1\21\45\0\1\136\1\137"+
+    "\21\0\1\44\115\0\1\44\50\0\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\7\5"+
+    "\1\140\13\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\141"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\1\142\2\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\3\5\1\143\1\5\1\144"+
+    "\13\0\1\4\1\0\2\5\1\145\4\5\1\146\4\5"+
+    "\1\0\23\5\31\0\1\44\13\0\1\44\53\0\2\110"+
+    "\1\0\1\110\7\0\1\110\77\0\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\5\1\147\1\150\1\151\2\5\13\0\1\4"+
+    "\1\0\1\152\6\5\1\153\1\154\3\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\155\1\156\2\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\4\5\1\157\1\160\13\0\1\4\1\0"+
+    "\12\5\1\161\1\162\1\0\2\5\1\163\20\5\1\4"+
+    "\6\5\2\0\1\103\1\5\1\164\1\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\4\5\1\164\7\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\161\1\5\1\161\1\165\2\5\13\0"+
+    "\1\4\1\0\7\5\1\166\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\1\167\2\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\170\1\5\1\171\3\5"+
+    "\13\0\1\4\1\0\3\5\1\172\2\5\1\173\5\5"+
+    "\1\0\23\5\43\0\1\44\1\0\1\44\114\0\1\174"+
+    "\1\44\115\0\1\44\1\0\1\175\113\0\1\44\4\0"+
+    "\1\44\43\0\1\4\6\5\2\0\1\103\1\176\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\177\1\5\1\200\1\201\1\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\202\1\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+    "\1\203\1\5\2\0\5\5\1\204\13\0\1\4\1\0"+
+    "\11\5\1\205\2\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\1\206\1\5\1\207"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\210\3\5\13\0\1\4\1\0\7\5\1\161\1\211"+
+    "\3\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\212\1\213\1\5\13\0\1\4\1\0\7\5\1\214"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\215\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\5\1\161\4\5\13\0\1\4\1\0\14\5"+
+    "\1\0\2\5\1\216\20\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\217\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\161\1\5\1\220"+
+    "\3\5\13\0\1\4\1\0\7\5\1\221\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\222\2\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\223\2\5\13\0\1\4\1\0\7\5"+
+    "\1\224\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\7\5\1\225\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\226\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\227\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\230\2\5\13\0\1\4\1\0\7\5\1\231\4\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\1\232\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\2\5\1\233\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\234\1\5"+
+    "\1\235\3\5\13\0\1\4\1\0\7\5\1\236\4\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\237"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\10\70"+
+    "\1\0\12\70\1\0\3\70\1\0\26\70\1\0\2\70"+
+    "\1\0\34\70\22\0\1\240\126\0\1\241\24\0\1\242"+
+    "\70\0\1\243\143\0\1\244\34\0\10\76\1\0\16\76"+
+    "\1\0\26\76\1\0\2\76\1\0\34\76\33\0\1\245"+
+    "\24\0\1\246\70\0\1\247\143\0\1\250\34\0\7\4"+
+    "\2\0\1\4\1\251\2\4\1\0\1\4\1\0\1\4"+
+    "\3\0\5\4\2\0\6\4\13\0\1\4\1\0\14\4"+
+    "\1\0\23\4\7\104\2\0\4\104\1\0\1\104\1\0"+
+    "\1\104\3\0\5\104\2\0\6\104\13\0\1\104\1\0"+
+    "\14\104\1\0\26\104\2\252\1\104\1\252\2\0\4\104"+
+    "\1\0\1\252\1\0\1\104\3\0\5\104\1\253\1\0"+
+    "\6\104\2\0\1\253\10\0\1\104\1\0\14\104\1\0"+
+    "\26\104\2\110\1\104\1\110\2\0\4\104\1\0\1\110"+
+    "\1\0\1\104\3\0\2\104\2\106\1\107\2\0\2\104"+
+    "\1\107\3\104\13\0\1\104\1\0\4\104\1\106\7\104"+
+    "\1\0\1\104\1\106\24\104\2\111\1\104\1\111\2\0"+
+    "\4\104\1\0\1\111\1\0\1\104\3\0\2\104\2\106"+
+    "\1\107\1\0\1\110\2\104\1\107\3\104\13\0\1\104"+
+    "\1\0\4\104\1\106\7\104\1\0\1\104\1\106\24\104"+
+    "\1\111\1\112\1\104\1\112\2\0\4\104\1\0\1\112"+
+    "\1\0\1\104\3\0\1\104\1\254\2\106\1\107\1\0"+
+    "\1\110\2\104\1\107\1\104\1\254\1\104\13\0\1\104"+
+    "\1\0\4\104\1\106\7\104\1\0\1\104\1\106\24\104"+
+    "\4\255\2\0\3\104\1\255\1\0\1\255\1\0\1\104"+
+    "\3\0\2\104\3\255\2\0\2\104\2\255\2\104\13\0"+
+    "\1\104\1\0\4\104\1\255\1\104\1\255\5\104\1\0"+
+    "\1\104\1\255\1\104\1\255\1\104\1\255\15\104\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\256\4\5\1\0\23\5\7\257\1\260\1\0\105\257"+
+    "\7\0\1\260\106\0\4\257\1\261\1\257\1\262\1\263"+
+    "\1\0\1\115\1\264\3\115\1\261\10\257\1\115\3\257"+
+    "\2\115\61\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\265"+
+    "\1\5\1\266\1\5\13\0\1\4\1\0\4\5\1\267"+
+    "\7\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\161\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\4\5\1\270\7\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\271\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\272"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\3\5"+
+    "\1\273\7\5\1\274\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\275\5\5\13\0\1\4\1\0\11\5\1\276"+
+    "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\161"+
+    "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\277\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\11\132\1\300\3\132\1\301"+
+    "\104\132\1\16\1\132\2\16\1\0\1\16\1\302\4\16"+
+    "\10\132\1\16\3\132\2\16\61\132\7\4\2\0\2\4"+
+    "\1\303\1\4\1\0\1\4\1\0\1\4\3\0\5\4"+
+    "\2\0\6\4\13\0\1\4\1\0\14\4\1\0\23\4"+
+    "\23\0\1\304\72\0\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\1\5\1\305\3\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\306\5\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\307\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\4\5\1\310\1\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\311"+
+    "\5\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\312\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\5\1\313\4\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\314\2\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\315\2\5\13\0\1\4\1\0"+
+    "\10\5\1\161\3\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\316\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\317"+
+    "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\320\4\5\13\0\1\4"+
+    "\1\0\2\5\1\321\11\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\1\322\22\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\1\5\1\323\12\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\324\5\5\13\0\1\4\1\0"+
+    "\11\5\1\325\2\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\326\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\5\5\1\122"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\327"+
+    "\5\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\330"+
+    "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\331\2\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\4\5\1\161\7\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\2\5\1\332\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\333\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\1\5\1\334\12\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\335\2\5\13\0\1\4"+
+    "\1\0\7\5\1\336\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\337\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\2\5\1\340\11\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\341\4\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\45\0\1\44\1\0\1\23"+
+    "\46\0\1\4\6\5\2\0\1\103\2\5\1\342\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\343\3\5\13\0\1\4\1\0\2\5"+
+    "\1\344\4\5\1\345\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\346\4\5\13\0\1\4\1\0"+
+    "\6\5\1\347\5\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\350\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\351\5\5"+
+    "\13\0\1\4\1\0\6\5\1\352\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\5\1\353\21\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\1\5"+
+    "\1\354\6\5\1\355\12\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\1\5\1\356\12\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\2\5\1\357\11\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\360\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\3\5\1\361\1\5\2\0"+
+    "\4\5\1\362\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\363\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\364\3\5\1\331\1\122\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\365\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\366\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\3\5\1\367\17\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\370\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\13\5\1\371\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\372\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\373\5\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\374\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\161\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\164"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\375\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\5\1\376\4\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\10\5\1\377\3\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\u0100\5\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\1\u0101\2\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\2\5\1\u0102\20\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u0103\1\5\13\0\1\4\1\0\11\5\1\u0104"+
+    "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\12\5\1\u0105\10\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\5\1\u0106\4\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u0107\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\1\u0108\2\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\u0109"+
+    "\5\5\1\0\23\5\57\0\1\u010a\75\0\1\u010b\111\0"+
+    "\1\u010c\143\0\1\u010d\113\0\1\u010e\75\0\1\u010f\111\0"+
+    "\1\u0110\143\0\1\u0111\34\0\3\4\4\u0112\2\0\3\4"+
+    "\1\u0112\1\0\1\u0112\1\0\1\4\3\0\2\4\3\u0112"+
+    "\2\0\2\4\2\u0112\2\4\13\0\1\4\1\0\4\4"+
+    "\1\u0112\1\4\1\u0112\5\4\1\0\1\4\1\u0112\1\4"+
+    "\1\u0112\1\4\1\u0112\15\4\3\104\2\252\1\104\1\252"+
+    "\2\0\4\104\1\0\1\252\1\0\1\104\3\0\2\104"+
+    "\2\106\1\104\2\0\6\104\13\0\1\104\1\0\4\104"+
+    "\1\106\7\104\1\0\1\104\1\106\21\104\3\0\2\252"+
+    "\1\0\1\252\7\0\1\252\77\0\3\104\4\255\2\0"+
+    "\3\104\1\255\1\0\1\255\1\0\1\104\3\0\1\104"+
+    "\1\254\3\255\2\0\2\104\2\255\1\254\1\104\13\0"+
+    "\1\104\1\0\4\104\1\255\1\104\1\255\5\104\1\0"+
+    "\1\104\1\255\1\104\1\255\1\104\1\255\15\104\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\4\5\1\u0113\1\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\7\257\1\116\1\0\111\257"+
+    "\1\262\1\257\1\262\1\260\1\0\5\257\1\262\103\257"+
+    "\1\115\1\257\1\115\1\260\1\0\5\257\1\115\102\257"+
+    "\4\u0114\1\116\1\0\3\257\1\u0114\1\257\1\u0114\7\257"+
+    "\3\u0114\4\257\2\u0114\23\257\1\u0114\1\257\1\u0114\7\257"+
+    "\1\u0114\1\257\1\u0114\1\257\1\u0114\15\257\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\5\5\1\160\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\7\5\1\u0115\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u0116\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\u0117\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\377\5\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\161\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0118"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u0119\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\2\5\1\u011a\11\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u011b\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u011c\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\10\132\1\0\110\132\4\u011d\2\132\1\300"+
+    "\2\132\1\u011d\1\301\1\u011d\7\132\3\u011d\4\132\2\u011d"+
+    "\23\132\1\u011d\1\132\1\u011d\7\132\1\u011d\1\132\1\u011d"+
+    "\1\132\1\u011d\15\132\7\4\2\0\4\4\1\0\1\4"+
+    "\1\0\1\4\3\0\5\4\2\0\6\4\13\0\1\4"+
+    "\1\0\6\4\1\u011e\5\4\1\0\23\4\22\0\1\u011f"+
+    "\73\0\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\10\5\1\u0120\2\5\1\u0121\7\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\377\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\6\5\1\u0122\5\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\5\5\1\314"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0123"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\u0124\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\u0125\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u0126\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\6\5\1\u0127\5\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u0128\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\1\u0129\22\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u012a"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\5\5"+
+    "\1\161\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\1\u012b\22\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u012c\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\u012d\2\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\7\5\1\u012e\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\4\5\1\u012f\7\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u0130\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u0131\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\4\5\1\u0132\1\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\272\3\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\u0133\7\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\223\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\u0134\1\u0135\4\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\1\5\1\u0136\12\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\15\5\1\u0137\5\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\364"+
+    "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\u0138\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u0134\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\2\5\1\u0119\20\5\1\4\6\5"+
+    "\2\0\1\103\1\5\1\u0139\1\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\2\5\1\u013a\20\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u013b\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\5\5\1\u013c\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\5\5\1\u013d\6\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\10\5\1\u0132\3\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u013e\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u013f\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\u0140\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u0141"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\u0142\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\4\5\1\u0143\1\5\13\0"+
+    "\1\4\1\0\7\5\1\u0144\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\4\5\1\122\1\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\1\161\13\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\3\5\1\u0145\2\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\u0146\3\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0147"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\6\5"+
+    "\1\360\5\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\5\5\1\321\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\u0148\4\5\1\130\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u0149\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\u014a"+
+    "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\5\5\1\u014b\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\4\5\1\u014c\7\5"+
+    "\1\u014d\1\u0137\1\u014e\4\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\7\5\1\u014f\4\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\6\5\1\u0150\5\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0151"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\227\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\377\13\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\5\5\1\306\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u0152\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\377\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\2\5\1\u0153"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0154\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\2\5\1\u0155\11\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\374\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\u0156\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\375\5\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\53\0\1\u0157"+
+    "\77\0\1\u010a\137\0\1\u0158\70\0\1\u0159\136\0\1\u015a"+
+    "\77\0\1\u010e\137\0\1\u015b\70\0\1\u015c\63\0\3\4"+
+    "\4\u015d\2\0\3\4\1\u015d\1\0\1\u015d\1\0\1\4"+
+    "\3\0\2\4\3\u015d\2\0\2\4\2\u015d\2\4\13\0"+
+    "\1\4\1\0\4\4\1\u015d\1\4\1\u015d\5\4\1\0"+
+    "\1\4\1\u015d\1\4\1\u015d\1\4\1\u015d\16\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u015e\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\3\257\4\u015f\1\116\1\0\3\257"+
+    "\1\u015f\1\257\1\u015f\7\257\3\u015f\4\257\2\u015f\23\257"+
+    "\1\u015f\1\257\1\u015f\7\257\1\u015f\1\257\1\u015f\1\257"+
+    "\1\u015f\15\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0160"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\3\5\1\u0161\1\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\u0162\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u0163\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\1\5"+
+    "\1\u0164\11\5\1\u0165\7\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\2\5\1\122"+
+    "\20\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\5\5\1\u0166\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\5\5\1\161\6\5"+
+    "\1\0\23\5\3\132\4\u0167\2\132\1\300\2\132\1\u0167"+
+    "\1\301\1\u0167\7\132\3\u0167\4\132\2\u0167\23\132\1\u0167"+
+    "\1\132\1\u0167\7\132\1\u0167\1\132\1\u0167\1\132\1\u0167"+
+    "\15\132\7\4\2\0\4\4\1\0\1\4\1\0\1\4"+
+    "\3\0\5\4\2\0\4\4\1\u0168\1\4\13\0\1\4"+
+    "\1\0\14\4\1\0\24\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\7\5\1\u0169\4\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\7\5\1\u016a\4\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u016b\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\11\5\1\u016c\2\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\4\5\1\u016d\1\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\35\0\1\u016e\60\0\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0132\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\4\5\1\u016f\16\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u0170\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\3\5\1\161\10\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0171"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\u0172\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\5\1\u0173\4\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\2\5\1\u0174\20\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0175"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\1\5\1\u0127\12\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\5\1\u0176\1\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\7\5"+
+    "\1\u0177\4\5\1\u0178\6\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u0179\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\u017a\5\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\2\5"+
+    "\1\u017b\2\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\5\5\1\u017c\15\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\5\1\u017d\4\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\4\5\1\331\1\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\u017e\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0146"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u017f\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\2\5\1\u0180\3\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\3\5\1\u0181\2\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\u0182\4\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\u0183"+
+    "\2\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\u0184\2\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\u0185\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\10\5\1\u0132\12\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0186\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\130\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\u0187\2\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\1\122\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\11\5\1\u0134\2\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\2\5\1\u0188\11\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\2\5\1\u0189\11\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\u018a\4\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\6\5\1\173\5\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\2\5\1\u018b\11\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u018c\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\17\5\1\u018d\3\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\5\5\1\u018e\15\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u018f\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\5\1\377\4\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\u0190\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u0151\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\6\5\1\271\5\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\u0191\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\377\7\5\1\0\23\5\22\0"+
+    "\1\u0192\133\0\1\u010a\12\0\1\u0157\43\0\1\u0159\1\u0193"+
+    "\4\u0159\1\u0193\2\0\3\u0159\1\0\1\u0159\1\0\1\u0193"+
+    "\1\0\1\u0159\1\u0193\5\u0159\2\u0193\6\u0159\1\0\2\u0193"+
+    "\1\0\1\u0193\2\0\6\u0193\14\u0159\1\0\23\u0159\22\0"+
+    "\1\u0194\133\0\1\u010e\12\0\1\u015a\43\0\1\u015c\1\u0195"+
+    "\4\u015c\1\u0195\2\0\3\u015c\1\0\1\u015c\1\0\1\u0195"+
+    "\1\0\1\u015c\1\u0195\5\u015c\2\u0195\6\u015c\1\0\2\u0195"+
+    "\1\0\1\u0195\2\0\6\u0195\14\u015c\1\0\23\u015c\3\4"+
+    "\4\u0196\2\0\3\4\1\u0196\1\0\1\u0196\1\0\1\4"+
+    "\3\0\2\4\3\u0196\2\0\2\4\2\u0196\2\4\13\0"+
+    "\1\4\1\0\4\4\1\u0196\1\4\1\u0196\5\4\1\0"+
+    "\1\4\1\u0196\1\4\1\u0196\1\4\1\u0196\16\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u0197\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\3\257\4\u0198\1\116\1\0\3\257"+
+    "\1\u0198\1\257\1\u0198\7\257\3\u0198\4\257\2\u0198\23\257"+
+    "\1\u0198\1\257\1\u0198\7\257\1\u0198\1\257\1\u0198\1\257"+
+    "\1\u0198\15\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\u0199\7\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\2\5"+
+    "\1\u019a\11\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\2\5\1\u019b\3\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u0127\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\u019c\4\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\u019d\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u019e\12\5\1\0\23\5\3\132\4\u019f\2\132"+
+    "\1\300\2\132\1\u019f\1\301\1\u019f\7\132\3\u019f\4\132"+
+    "\2\u019f\23\132\1\u019f\1\132\1\u019f\7\132\1\u019f\1\132"+
+    "\1\u019f\1\132\1\u019f\15\132\7\4\2\0\1\4\1\u01a0"+
+    "\2\4\1\0\1\4\1\0\1\4\3\0\5\4\2\0"+
+    "\6\4\13\0\1\4\1\0\14\4\1\0\24\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\4\5\1\306"+
+    "\7\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\u01a1\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01a2\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\11\5\1\u01a3\2\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u01a4"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\36\0"+
+    "\1\u01a5\57\0\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u01a6"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u01a7\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01a8\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\3\5\1\161\1\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\1\5\1\161\1\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u01a9"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\11\5"+
+    "\1\u0132\2\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\4\5\1\321\7\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\7\5\1\u01aa\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u01ab\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\161\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\2\5\1\u017b\2\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\5\1\u01ac\4\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u01ad"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+    "\1\u01ae\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\5\5\1\u01af"+
+    "\2\5\1\u01b0\12\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\6\5\1\u01b1\5\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\5\1\u01b2\16\5\1\u01b3\2\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\1\122\22\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\u01b4\1\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+    "\1\u019e\1\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\4\5\1\122\7\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\11\5"+
+    "\1\u01b5\2\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01b6\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\11\5\1\u01b7\2\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\4\5\1\130\1\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\u01b8\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u01b9\12\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\2\5\1\u0183\11\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\11\5\1\u01ba\2\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\5\1\u01bb\4\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\1\5\1\u0132"+
+    "\3\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u01bc\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u01bd"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\3\5\1\u01be\17\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\377\22\5\22\0\1\u0159\115\0\1\u015c"+
+    "\73\0\3\4\4\5\2\0\3\4\1\5\1\0\1\5"+
+    "\1\0\1\4\3\0\2\4\3\5\2\0\2\4\2\5"+
+    "\2\4\13\0\1\4\1\0\4\4\1\5\1\4\1\5"+
+    "\5\4\1\0\1\4\1\5\1\4\1\5\1\4\1\5"+
+    "\16\4\6\5\2\0\1\103\1\5\1\377\1\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\3\257\4\115\1\116"+
+    "\1\0\3\257\1\115\1\257\1\115\7\257\3\115\4\257"+
+    "\2\115\23\257\1\115\1\257\1\115\7\257\1\115\1\257"+
+    "\1\115\1\257\1\115\15\257\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\7\5\1\u0177"+
+    "\13\5\1\4\6\5\2\0\1\103\1\5\1\u01bf\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\5\5\1\u01c0\15\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+    "\1\u01c1\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u0163\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u01c2\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\3\132\4\16\2\132\1\300\2\132\1\16"+
+    "\1\301\1\16\7\132\3\16\4\132\2\16\23\132\1\16"+
+    "\1\132\1\16\7\132\1\16\1\132\1\16\1\132\1\16"+
+    "\15\132\7\4\2\0\4\4\1\0\1\4\1\0\1\4"+
+    "\3\0\5\4\2\0\6\4\13\0\1\4\1\0\4\4"+
+    "\1\u01c3\7\4\1\0\24\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\5\5\1\u01c4\6\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\7\5\1\u0173\4\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u01c5\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\10\5\1\161\3\5\1\0\23\5\64\0"+
+    "\1\u01c6\31\0\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\u01c7"+
+    "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\15\5\1\u01c8\5\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\21\5\1\u01c9"+
+    "\1\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\7\5\1\u01ca\13\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\2\5\1\u01cb\20\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\u01cc\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\3\5\1\u01cd\2\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\4\5\1\u01ce\1\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\1\5\1\u01cf\12\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\5\5\1\u01d0\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\u0175"+
+    "\2\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u01bf\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\u01d1\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\5\1\u01d2\1\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\272\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u01d3"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u0127\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01d4\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\1\122\2\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\4\5\1\u01d5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\u01d6\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\5\5\1\u01d7\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\4\5\1\u01d8\7\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0197"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\u01d9\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\2\5\1\164\3\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+    "\1\u01da\1\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\11\5\1\u0127\2\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\6\5"+
+    "\1\122\5\5\1\0\23\5\7\4\2\0\4\4\1\0"+
+    "\1\4\1\0\1\4\3\0\5\4\2\0\2\4\1\u01db"+
+    "\3\4\13\0\1\4\1\0\14\4\1\0\24\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\2\5\1\271\3\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+    "\1\u01dc\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\56\0\1\u01dd\37\0\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\1\u01de\22\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\3\5\1\u01df\2\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01e0\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\7\5\1\u01e1\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u01e2"+
+    "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\2\5\1\u01e3\11\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\1\u0132\22\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\14\5\1\0\13\5\1\u01e4"+
+    "\7\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\2\5\1\u01e5\3\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\4\5"+
+    "\1\u01e6\1\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\7\5\1\u01e7\4\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\1\u0132\5\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\1\5\1\u01e8"+
+    "\3\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u01e9\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\2\5\1\u01ea\20\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\u0132\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01eb\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\13\5"+
+    "\1\u01ec\1\5\1\u01ed\5\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01ee\11\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\1\u01ef\5\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\4\5\1\u0132\7\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\130"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\u01f0\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\1\u01f1\22\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\2\5\1\u01f2\20\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\2\5\1\u01f3\3\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\3\5\1\u01f4\2\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u01f5"+
+    "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+    "\1\u01f6\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01f7\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\3\5\1\u01d2\2\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\7\5\1\u01f8\4\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\1\321\5\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01f9\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\7\5\1\u01fa\4\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\1\u01fb\5\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\4\5\1\201\1\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\1\5\1\377"+
+    "\12\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+    "\1\u01fc\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\u0132\13\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\1\u01fd\13\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\2\5\1\u01fe\11\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\10\5"+
+    "\1\u01b0\12\5\1\4\6\5\2\0\1\103\2\5\1\u01ff"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\1\u0200\2\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\1\350\5\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\u0201\5\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0202"+
+    "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\1\5\1\130\1\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\1\5\1\u0132\1\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\7\5\1\u0203\4\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\1\5\1\u0204\4\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\22\5\1\u0205\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\2\5\1\u0206\3\5\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\4\5\1\u0207\1\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\5\1\u0208\1\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\6\5\13\0\1\4\1\0\11\5\1\u0209"+
+    "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+    "\13\0\1\4\1\0\4\5\1\u01bf\7\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u0132\12\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\4\5"+
+    "\1\u020a\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\1\u020b\2\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+    "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\3\5"+
+    "\1\u020c\17\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u020d"+
+    "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\4\5"+
+    "\1\u020e\7\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\3\5\1\u020f\2\5\13\0\1\4\1\0\14\5\1\0"+
+    "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+    "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+    "\1\0\14\5\1\0\2\5\1\u0210\20\5\1\4\6\5"+
+    "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+    "\5\5\2\0\3\5\1\u0211\2\5\13\0\1\4\1\0"+
+    "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+    "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+    "\1\u0212\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\5\5\1\u01f3\13\0\1\4"+
+    "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\5\5\1\u0132\13\0\1\4\1\0\14\5\1\0\23\5"+
+    "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+    "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+    "\1\5\1\u01f3\12\5\1\0\23\5\1\4\6\5\2\0"+
+    "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+    "\2\0\2\5\1\u01b3\3\5\13\0\1\4\1\0\14\5"+
+    "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+    "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0213"+
+    "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+    "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+    "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\2\5"+
+    "\1\u0203\11\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+    "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+    "\6\5\13\0\1\4\1\0\2\5\1\u01f6\11\5\1\0"+
+    "\23\5";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[39390];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\3\0\6\1\1\11\4\1\1\11\17\1\2\11\3\1"+
+    "\1\11\24\1\1\11\5\1\1\11\16\1\1\11\1\0"+
+    "\14\1\1\11\1\1\1\11\35\1\1\0\43\1\1\11"+
+    "\10\0\2\1\1\0\4\1\1\11\20\1\1\11\2\1"+
+    "\1\0\105\1\10\0\15\1\1\11\5\1\1\0\61\1"+
+    "\2\0\1\1\2\0\22\1\1\0\43\1\4\0\17\1"+
+    "\1\0\40\1\1\0\26\1\1\11\66\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[531];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ActionScriptTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public ActionScriptTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public ActionScriptTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 190) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 30: break;
+        case 22: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 31: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 32: break;
+        case 25: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 33: break;
+        case 20: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 34: break;
+        case 7: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 35: break;
+        case 15: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 36: break;
+        case 23: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 37: break;
+        case 14: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 38: break;
+        case 17: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 39: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 40: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 41: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 42: break;
+        case 19: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 43: break;
+        case 27: 
+          { addToken(Token.FUNCTION);
+          }
+        case 44: break;
+        case 4: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 45: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 46: break;
+        case 24: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 47: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 48: break;
+        case 16: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 49: break;
+        case 26: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 50: break;
+        case 18: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 51: break;
+        case 29: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 52: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 53: break;
+        case 13: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 54: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 55: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 56: break;
+        case 10: 
+          { 
+          }
+        case 57: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 58: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 532: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 533: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 534: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex	(revision 25584)
@@ -0,0 +1,1036 @@
+/*
+ * 12/06/2004
+ *
+ * AssemblerX86TokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing X86 assembler.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class takes plain text and returns tokens representing x86
+ * assembler.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated AssemblerX86TokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ *
+ */
+%%
+
+%public
+%class AssemblerX86TokenMaker
+%extends AbstractJFlexTokenMaker
+%implements TokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  We must have this here as JFLex does not generate a
+	 * no parameter constructor.
+	 */
+	public AssemblerX86TokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { ";", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *                    <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter				= ([A-Za-z_])
+Digit				= ([0-9])
+Number				= ({Digit}+)
+
+Identifier			= (({Letter}|{Digit})[^ \t\f\n\,\.\+\-\*\/\%\[\]]+)
+
+UnclosedStringLiteral	= ([\"][^\"]*)
+StringLiteral			= ({UnclosedStringLiteral}[\"])
+UnclosedCharLiteral		= ([\'][^\']*)
+CharLiteral			= ({UnclosedCharLiteral}[\'])
+
+CommentBegin			= ([;])
+
+LineTerminator			= (\n)
+WhiteSpace			= ([ \t\f])
+
+Label				= (({Letter}|{Digit})+[\:])
+
+Operator				= ("+"|"-"|"*"|"/"|"%"|"^"|"|"|"&"|"~"|"!"|"="|"<"|">")
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	".186" |
+	".286" |
+	".286P" |
+	".287" |
+	".386" |
+	".386P" |
+	".387" |
+	".486" |
+	".486P" |
+	".586" |
+	".586P" |
+	".686" |
+	".686P" |
+	".8086" |
+	".8087" |
+	".ALPHA" |
+	".BREAK" |
+	".BSS" |
+	".CODE" |
+	".CONST" |
+	".CONTINUE" |
+	".CREF" |
+	".DATA" |
+	".DATA?" |
+	".DOSSEG" |
+	".ELSE" |
+	".ELSEIF" |
+	".ENDIF" |
+	".ENDW" |
+	".ERR" |
+	".ERR1" |
+	".ERR2" |
+	".ERRB" |
+	".ERRDEF" |
+	".ERRDIF" |
+	".ERRDIFI" |
+	".ERRE" |
+	".ERRIDN" |
+	".ERRIDNI" |
+	".ERRNB" |
+	".ERRNDEF" |
+	".ERRNZ" |
+	".EXIT" |
+	".FARDATA" |
+	".FARDATA?" |
+	".IF" |
+	".K3D" |
+	".LALL" |
+	".LFCOND" |
+	".LIST" |
+	".LISTALL" |
+	".LISTIF" |
+	".LISTMACRO" |
+	".LISTMACROALL" |
+	".MMX" |
+	".MODEL" |
+	".MSFLOAT" |
+	".NO87" |
+	".NOCREF" |
+	".NOLIST" |
+	".NOLISTIF" |
+	".NOLISTMACRO" |
+	".RADIX" |
+	".REPEAT" |
+	".SALL" |
+	".SEQ" |
+	".SFCOND" |
+	".STACK" |
+	".STARTUP" |
+	".TEXT" |
+	".TFCOND" |
+	".UNTIL" |
+	".UNTILCXZ" |
+	".WHILE" |
+	".XALL" |
+	".XCREF" |
+	".XLIST" |
+	".XMM" |
+	"__FILE__" |
+	"__LINE__" |
+	"A16" |
+	"A32" |
+	"ADDR" |
+	"ALIGN" |
+	"ALIGNB" |
+	"ASSUME" |
+	"BITS" |
+	"CARRY?" |
+	"CATSTR" |
+	"CODESEG" |
+	"COMM" |
+	"COMMENT" |
+	"COMMON" |
+	"DATASEG" |
+	"DOSSEG" |
+	"ECHO" |
+	"ELSE" |
+	"ELSEIF" |
+	"ELSEIF1" |
+	"ELSEIF2" |
+	"ELSEIFB" |
+	"ELSEIFDEF" |
+	"ELSEIFE" |
+	"ELSEIFIDN" |
+	"ELSEIFNB" |
+	"ELSEIFNDEF" |
+	"END" |
+	"ENDIF" |
+	"ENDM" |
+	"ENDP" |
+	"ENDS" |
+	"ENDSTRUC" |
+	"EVEN" |
+	"EXITM" |
+	"EXPORT" |
+	"EXTERN" |
+	"EXTERNDEF" |
+	"EXTRN" |
+	"FAR" |
+	"FOR" |
+	"FORC" |
+	"GLOBAL" |
+	"GOTO" |
+	"GROUP" |
+	"HIGH" |
+	"HIGHWORD" |
+	"IEND" |
+	"IF" |
+	"IF1" |
+	"IF2" |
+	"IFB" |
+	"IFDEF" |
+	"IFDIF" |
+	"IFDIFI" |
+	"IFE" |
+	"IFIDN" |
+	"IFIDNI" |
+	"IFNB" |
+	"IFNDEF" |
+	"IMPORT" |
+	"INCBIN" |
+	"INCLUDE" |
+	"INCLUDELIB" |
+	"INSTR" |
+	"INVOKE" |
+	"IRP" |
+	"IRPC" |
+	"ISTRUC" |
+	"LABEL" |
+	"LENGTH" |
+	"LENGTHOF" |
+	"LOCAL" |
+	"LOW" |
+	"LOWWORD" |
+	"LROFFSET" |
+	"MACRO" |
+	"NAME" |
+	"NEAR" |
+	"NOSPLIT" |
+	"O16" |
+	"O32" |
+	"OFFSET" |
+	"OPATTR" |
+	"OPTION" |
+	"ORG" |
+	"OVERFLOW?" |
+	"PAGE" |
+	"PARITY?" |
+	"POPCONTEXT" |
+	"PRIVATE" |
+	"PROC" |
+	"PROTO" |
+	"PTR" |
+	"PUBLIC" |
+	"PURGE" |
+	"PUSHCONTEXT" |
+	"RECORD" |
+	"REPEAT" |
+	"REPT" |
+	"SECTION" |
+	"SEG" |
+	"SEGMENT" |
+	"SHORT" |
+	"SIGN?" |
+	"SIZE" |
+	"SIZEOF" |
+	"SIZESTR" |
+	"STACK" |
+	"STRUC" |
+	"STRUCT" |
+	"SUBSTR" |
+	"SUBTITLE" |
+	"SUBTTL" |
+	"THIS" |
+	"TITLE" |
+	"TYPE" |
+	"TYPEDEF" |
+	"UNION" |
+	"USE16" |
+	"USE32" |
+	"USES" |
+	"WHILE" |
+	"WRT" |
+	"ZERO?"		{ addToken(Token.PREPROCESSOR); }
+
+	"DB" |
+	"DW" |
+	"DD" |
+	"DF" |
+	"DQ" |
+	"DT" |
+	"RESB" |
+	"RESW" |
+	"RESD" |
+	"RESQ" |
+	"REST" |
+	"EQU" |
+	"TEXTEQU" |
+	"TIMES" |
+	"DUP"		{ addToken(Token.FUNCTION); }
+
+	"BYTE" |
+	"WORD" |
+	"DWORD" |
+	"FWORD" |
+	"QWORD" |
+	"TBYTE" |
+	"SBYTE" |
+	"TWORD" |
+	"SWORD" |
+	"SDWORD" |
+	"REAL4" |
+	"REAL8" |
+	"REAL10"		{ addToken(Token.DATA_TYPE); }
+
+	/* Registers */
+	"AL" |
+	"BL" |
+	"CL" |
+	"DL" |
+	"AH" |
+	"BH" |
+	"CH" |
+	"DH" |
+	"AX" |
+	"BX" |
+	"CX" |
+	"DX" |
+	"SI" |
+	"DI" |
+	"SP" |
+	"BP" |
+	"EAX" |
+	"EBX" |
+	"ECX" |
+	"EDX" |
+	"ESI" |
+	"EDI" |
+	"ESP" |
+	"EBP" |
+	"CS" |
+	"DS" |
+	"SS" |
+	"ES" |
+	"FS" |
+	"GS" |
+	"ST" |
+	"ST0" |
+	"ST1" |
+	"ST2" |
+	"ST3" |
+	"ST4" |
+	"ST5" |
+	"ST6" |
+	"ST7" |
+	"MM0" |
+	"MM1" |
+	"MM2" |
+	"MM3" |
+	"MM4" |
+	"MM5" |
+	"MM6" |
+	"MM7" |
+	"XMM0" |
+	"XMM1" |
+	"XMM2" |
+	"XMM3" |
+	"XMM4" |
+	"XMM5" |
+	"XMM6" |
+	"XMM7" |
+	"CR0" |
+	"CR2" |
+	"CR3" |
+	"CR4" |
+	"DR0" |
+	"DR1" |
+	"DR2" |
+	"DR3" |
+	"DR4" |
+	"DR5" |
+	"DR6" |
+	"DR7" |
+	"TR3" |
+	"TR4" |
+	"TR5" |
+	"TR6" |
+	"TR7"		{ addToken(Token.VARIABLE); }
+
+	/* Pentium III Instructions. */
+	"AAA" |
+	"AAD" |
+	"AAM" |
+	"AAS" |
+	"ADC" |
+	"ADD" |
+	"ADDPS" |
+	"ADDSS" |
+	"AND" |
+	"ANDNPS" |
+	"ANDPS" |
+	"ARPL" |
+	"BOUND" |
+	"BSF" |
+	"BSR" |
+	"BSWAP" |
+	"BT" |
+	"BTC" |
+	"BTR" |
+	"BTS" |
+	"CALL" |
+	"CBW" |
+	"CDQ" |
+	"CLC" |
+	"CLD" |
+	"CLI" |
+	"CLTS" |
+	"CMC" |
+	"CMOVA" |
+	"CMOVAE" |
+	"CMOVB" |
+	"CMOVBE" |
+	"CMOVC" |
+	"CMOVE" |
+	"CMOVG" |
+	"CMOVGE" |
+	"CMOVL" |
+	"CMOVLE" |
+	"CMOVNA" |
+	"CMOVNAE" |
+	"CMOVNB" |
+	"CMOVNBE" |
+	"CMOVNC" |
+	"CMOVNE" |
+	"CMOVNG" |
+	"CMOVNGE" |
+	"CMOVNL" |
+	"CMOVNLE" |
+	"CMOVNO" |
+	"CMOVNP" |
+	"CMOVNS" |
+	"CMOVNZ" |
+	"CMOVO" |
+	"CMOVP" |
+	"CMOVPE" |
+	"CMOVPO" |
+	"CMOVS" |
+	"CMOVZ" |
+	"CMP" |
+	"CMPPS" |
+	"CMPS" |
+	"CMPSB" |
+	"CMPSD" |
+	"CMPSS" |
+	"CMPSW" |
+	"CMPXCHG" |
+	"CMPXCHGB" |
+	"COMISS" |
+	"CPUID" |
+	"CWD" |
+	"CWDE" |
+	"CVTPI2PS" |
+	"CVTPS2PI" |
+	"CVTSI2SS" |
+	"CVTSS2SI" |
+	"CVTTPS2PI" |
+	"CVTTSS2SI" |
+	"DAA" |
+	"DAS" |
+	"DEC" |
+	"DIV" |
+	"DIVPS" |
+	"DIVSS" |
+	"EMMS" |
+	"ENTER" |
+	"F2XM1" |
+	"FABS" |
+	"FADD" |
+	"FADDP" |
+	"FBLD" |
+	"FBSTP" |
+	"FCHS" |
+	"FCLEX" |
+	"FCMOVB" |
+	"FCMOVBE" |
+	"FCMOVE" |
+	"FCMOVNB" |
+	"FCMOVNBE" |
+	"FCMOVNE" |
+	"FCMOVNU" |
+	"FCMOVU" |
+	"FCOM" |
+	"FCOMI" |
+	"FCOMIP" |
+	"FCOMP" |
+	"FCOMPP" |
+	"FCOS" |
+	"FDECSTP" |
+	"FDIV" |
+	"FDIVP" |
+	"FDIVR" |
+	"FDIVRP" |
+	"FFREE" |
+	"FIADD" |
+	"FICOM" |
+	"FICOMP" |
+	"FIDIV" |
+	"FIDIVR" |
+	"FILD" |
+	"FIMUL" |
+	"FINCSTP" |
+	"FINIT" |
+	"FIST" |
+	"FISTP" |
+	"FISUB" |
+	"FISUBR" |
+	"FLD1" |
+	"FLDCW" |
+	"FLDENV" |
+	"FLDL2E" |
+	"FLDL2T" |
+	"FLDLG2" |
+	"FLDLN2" |
+	"FLDPI" |
+	"FLDZ" |
+	"FMUL" |
+	"FMULP" |
+	"FNCLEX" |
+	"FNINIT" |
+	"FNOP" |
+	"FNSAVE" |
+	"FNSTCW" |
+	"FNSTENV" |
+	"FNSTSW" |
+	"FPATAN" |
+	"FPREM" |
+	"FPREMI" |
+	"FPTAN" |
+	"FRNDINT" |
+	"FRSTOR" |
+	"FSAVE" |
+	"FSCALE" |
+	"FSIN" |
+	"FSINCOS" |
+	"FSQRT" |
+	"FST" |
+	"FSTCW" |
+	"FSTENV" |
+	"FSTP" |
+	"FSTSW" |
+	"FSUB" |
+	"FSUBP" |
+	"FSUBR" |
+	"FSUBRP" |
+	"FTST" |
+	"FUCOM" |
+	"FUCOMI" |
+	"FUCOMIP" |
+	"FUCOMP" |
+	"FUCOMPP" |
+	"FWAIT" |
+	"FXAM" |
+	"FXCH" |
+	"FXRSTOR" |
+	"FXSAVE" |
+	"FXTRACT" |
+	"FYL2X" |
+	"FYL2XP1" |
+	"HLT" |
+	"IDIV" |
+	"IMUL" |
+	"IN" |
+	"INC" |
+	"INS" |
+	"INSB" |
+	"INSD" |
+	"INSW" |
+	"INT" |
+	"INTO" |
+	"INVD" |
+	"INVLPG" |
+	"IRET" |
+	"JA" |
+	"JAE" |
+	"JB" |
+	"JBE" |
+	"JC" |
+	"JCXZ" |
+	"JE" |
+	"JECXZ" |
+	"JG" |
+	"JGE" |
+	"JL" |
+	"JLE" |
+	"JMP" |
+	"JNA" |
+	"JNAE" |
+	"JNB" |
+	"JNBE" |
+	"JNC" |
+	"JNE" |
+	"JNG" |
+	"JNGE" |
+	"JNL" |
+	"JNLE" |
+	"JNO" |
+	"JNP" |
+	"JNS" |
+	"JNZ" |
+	"JO" |
+	"JP" |
+	"JPE" |
+	"JPO" |
+	"JS" |
+	"JZ" |
+	"LAHF" |
+	"LAR" |
+	"LDMXCSR" |
+	"LDS" |
+	"LEA" |
+	"LEAVE" |
+	"LES" |
+	"LFS" |
+	"LGDT" |
+	"LGS" |
+	"LIDT" |
+	"LLDT" |
+	"LMSW" |
+	"LOCK" |
+	"LODS" |
+	"LODSB" |
+	"LODSD" |
+	"LODSW" |
+	"LOOP" |
+	"LOOPE" |
+	"LOOPNE" |
+	"LOOPNZ" |
+	"LOOPZ" |
+	"LSL" |
+	"LSS" |
+	"LTR" |
+	"MASKMOVQ" |
+	"MAXPS" |
+	"MAXSS" |
+	"MINPS" |
+	"MINSS" |
+	"MOV" |
+	"MOVAPS" |
+	"MOVD" |
+	"MOVHLPS" |
+	"MOVHPS" |
+	"MOVLHPS" |
+	"MOVLPS" |
+	"MOVMSKPS" |
+	"MOVNTPS" |
+	"MOVNTQ" |
+	"MOVQ" |
+	"MOVS" |
+	"MOVSB" |
+	"MOVSD" |
+	"MOVSS" |
+	"MOVSW" |
+	"MOVSX" |
+	"MOVUPS" |
+	"MOVZX" |
+	"MUL" |
+	"MULPS" |
+	"MULSS" |
+	"NEG" |
+	"NOP" |
+	"NOT" |
+	"OR" |
+	"ORPS" |
+	"OUT" |
+	"OUTS" |
+	"OUTSB" |
+	"OUTSD" |
+	"OUTSW" |
+	"PACKSSDW" |
+	"PACKSSWB" |
+	"PACKUSWB" |
+	"PADDB" |
+	"PADDD" |
+	"PADDSB" |
+	"PADDSW" |
+	"PADDUSB" |
+	"PADDUSW" |
+	"PADDW" |
+	"PAND" |
+	"PANDN" |
+	"PAVGB" |
+	"PAVGW" |
+	"PCMPEQB" |
+	"PCMPEQD" |
+	"PCMPEQW" |
+	"PCMPGTB" |
+	"PCMPGTD" |
+	"PCMPGTW" |
+	"PEXTRW" |
+	"PINSRW" |
+	"PMADDWD" |
+	"PMAXSW" |
+	"PMAXUB" |
+	"PMINSW" |
+	"PMINUB" |
+	"PMOVMSKB" |
+	"PMULHUW" |
+	"PMULHW" |
+	"PMULLW" |
+	"POP" |
+	"POPA" |
+	"POPAD" |
+	"POPAW" |
+	"POPF" |
+	"POPFD" |
+	"POPFW" |
+	"POR" |
+	"PREFETCH" |
+	"PSADBW" |
+	"PSHUFW" |
+	"PSLLD" |
+	"PSLLQ" |
+	"PSLLW" |
+	"PSRAD" |
+	"PSRAW" |
+	"PSRLD" |
+	"PSRLQ" |
+	"PSRLW" |
+	"PSUBB" |
+	"PSUBD" |
+	"PSUBSB" |
+	"PSUBSW" |
+	"PSUBUSB" |
+	"PSUBUSW" |
+	"PSUBW" |
+	"PUNPCKHBW" |
+	"PUNPCKHDQ" |
+	"PUNPCKHWD" |
+	"PUNPCKLBW" |
+	"PUNPCKLDQ" |
+	"PUNPCKLWD" |
+	"PUSH" |
+	"PUSHA" |
+	"PUSHAD" |
+	"PUSHAW" |
+	"PUSHF" |
+	"PUSHFD" |
+	"PUSHFW" |
+	"PXOR" |
+	"RCL" |
+	"RCR" |
+	"RDMSR" |
+	"RDPMC" |
+	"RDTSC" |
+	"REP" |
+	"REPE" |
+	"REPNE" |
+	"REPNZ" |
+	"REPZ" |
+	"RET" |
+	"RETF" |
+	"RETN" |
+	"ROL" |
+	"ROR" |
+	"RSM" |
+	"SAHF" |
+	"SAL" |
+	"SAR" |
+	"SBB" |
+	"SCAS" |
+	"SCASB" |
+	"SCASD" |
+	"SCASW" |
+	"SETA" |
+	"SETAE" |
+	"SETB" |
+	"SETBE" |
+	"SETC" |
+	"SETE" |
+	"SETG" |
+	"SETGE" |
+	"SETL" |
+	"SETLE" |
+	"SETNA" |
+	"SETNAE" |
+	"SETNB" |
+	"SETNBE" |
+	"SETNC" |
+	"SETNE" |
+	"SETNG" |
+	"SETNGE" |
+	"SETNL" |
+	"SETNLE" |
+	"SETNO" |
+	"SETNP" |
+	"SETNS" |
+	"SETNZ" |
+	"SETO" |
+	"SETP" |
+	"SETPE" |
+	"SETPO" |
+	"SETS" |
+	"SETZ" |
+	"SFENCE" |
+	"SGDT" |
+	"SHL" |
+	"SHLD" |
+	"SHR" |
+	"SHRD" |
+	"SHUFPS" |
+	"SIDT" |
+	"SLDT" |
+	"SMSW" |
+	"SQRTPS" |
+	"SQRTSS" |
+	"STC" |
+	"STD" |
+	"STI" |
+	"STMXCSR" |
+	"STOS" |
+	"STOSB" |
+	"STOSD" |
+	"STOSW" |
+	"STR" |
+	"SUB" |
+	"SUBPS" |
+	"SUBSS" |
+	"SYSENTER" |
+	"SYSEXIT" |
+	"TEST" |
+	"UB2" |
+	"UCOMISS" |
+	"UNPCKHPS" |
+	"UNPCKLPS" |
+	"WAIT" |
+	"WBINVD" |
+	"VERR" |
+	"VERW" |
+	"WRMSR" |
+	"XADD" |
+	"XCHG" |
+	"XLAT" |
+	"XLATB" |
+	"XOR" |
+	"XORPS"		{ addToken(Token.RESERVED_WORD); }
+
+}
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+	/* Labels. */
+	{Label}						{ addToken(Token.PREPROCESSOR); }
+
+	^%({Letter}|{Digit})*			{ addToken(Token.FUNCTION); }
+
+	/* Comment Literals. */
+	{CommentBegin}.*				{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{Number}						{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java	(revision 25584)
@@ -0,0 +1,1867 @@
+/* The following code was generated by JFlex 1.4.1 on 2/1/08 1:33 PM */
+
+/*
+ * 12/06/2004
+ *
+ * AssemblerX86TokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing X86 assembler.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class takes plain text and returns tokens representing x86
+ * assembler.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated AssemblerX86TokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ *
+ */
+
+public class AssemblerX86TokenMaker extends AbstractJFlexTokenMaker implements TokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+
+  /**
+   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
+   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
+   *                  at the beginning of a line
+   * l is of the form l = 2*k, k a non negative integer
+   */
+  private static final int ZZ_LEXSTATE[] = { 
+     0, 1
+  };
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\10\1\7\1\0\1\10\23\0\1\10\1\14\1\4\2\0"+
+    "\1\13\1\14\1\5\2\0\1\12\1\12\1\3\1\12\1\15\1\12"+
+    "\1\27\1\16\1\21\1\24\1\25\1\26\1\20\1\23\1\17\1\2"+
+    "\1\11\1\6\1\14\1\14\1\14\1\50\1\0\1\30\1\33\1\40"+
+    "\1\42\1\35\1\47\1\51\1\32\1\45\1\1\1\36\1\31\1\55"+
+    "\1\43\1\41\1\22\1\56\1\34\1\37\1\44\1\46\1\61\1\52"+
+    "\1\54\1\60\1\53\1\3\1\0\1\3\1\14\1\57\1\0\1\30"+
+    "\1\33\1\40\1\42\1\35\1\47\1\51\1\32\1\45\1\1\1\36"+
+    "\1\31\1\55\1\43\1\41\1\22\1\56\1\34\1\37\1\44\1\46"+
+    "\1\61\1\52\1\54\1\60\1\53\1\0\1\14\1\0\1\14\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\2\0\2\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+    "\1\10\32\1\1\11\1\1\1\12\5\13\2\1\1\14"+
+    "\1\15\25\0\16\1\2\16\23\1\1\13\11\1\1\16"+
+    "\14\1\2\16\7\1\1\16\10\1\1\13\4\1\1\11"+
+    "\3\1\1\16\1\1\1\11\15\1\1\13\1\12\13\1"+
+    "\1\16\42\1\31\0\1\12\11\0\20\1\1\13\1\12"+
+    "\14\1\2\13\3\1\1\13\4\1\1\12\6\1\1\13"+
+    "\3\1\1\13\5\1\1\12\5\1\1\13\4\1\1\12"+
+    "\1\1\1\13\2\1\1\13\10\1\1\13\4\1\1\13"+
+    "\4\1\1\13\5\1\1\12\3\1\3\13\24\1\1\13"+
+    "\37\1\1\13\3\1\1\13\3\1\1\0\1\12\10\0"+
+    "\1\12\17\0\3\1\1\13\11\1\1\13\14\1\2\13"+
+    "\1\1\1\17\1\13\3\1\2\12\10\1\1\12\7\1"+
+    "\1\12\1\13\12\1\1\12\15\1\1\13\5\1\2\13"+
+    "\1\1\1\13\14\1\1\13\3\1\1\13\4\1\1\0"+
+    "\1\12\3\0\1\12\5\0\1\12\5\0\16\1\1\12"+
+    "\5\1\1\12\16\1\1\12\1\1\1\13\4\1\1\13"+
+    "\1\1\1\13\4\1\7\0\1\12\7\1\2\12\10\1"+
+    "\1\0\1\12\2\0\1\12\1\0\4\1\1\12\1\1"+
+    "\3\0\2\1\2\0\1\1\1\12\2\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[668];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\62\0\144\0\226\0\310\0\372\0\u012c\0\u015e"+
+    "\0\144\0\u0190\0\144\0\u01c2\0\u01f4\0\u0226\0\u0258\0\u028a"+
+    "\0\u02bc\0\u02ee\0\u0320\0\u0352\0\u0384\0\u03b6\0\u03e8\0\u041a"+
+    "\0\u044c\0\u047e\0\u04b0\0\u04e2\0\u0514\0\u0546\0\u0578\0\u05aa"+
+    "\0\u05dc\0\u060e\0\u0640\0\u0672\0\u06a4\0\u06d6\0\u0708\0\u0708"+
+    "\0\u073a\0\u076c\0\u079e\0\u0352\0\u07d0\0\u0802\0\u0834\0\144"+
+    "\0\144\0\u0866\0\u0898\0\u08ca\0\u08fc\0\u092e\0\u0960\0\u0992"+
+    "\0\u09c4\0\u09f6\0\u0a28\0\u0a5a\0\u0a8c\0\u0abe\0\u0af0\0\u0b22"+
+    "\0\u0b54\0\u0b86\0\u0bb8\0\u0bea\0\u0c1c\0\u0c4e\0\u0c80\0\u0cb2"+
+    "\0\u0ce4\0\u0d16\0\u0d48\0\u0d7a\0\u0dac\0\u0dde\0\u0e10\0\u0e42"+
+    "\0\u0e74\0\u0ea6\0\u0ed8\0\u0f0a\0\u0f3c\0\u0352\0\u0f6e\0\u0fa0"+
+    "\0\u0fd2\0\u1004\0\u1036\0\u1068\0\u109a\0\u10cc\0\u10fe\0\u1130"+
+    "\0\u1162\0\u1194\0\u11c6\0\u11f8\0\u122a\0\u125c\0\u128e\0\u12c0"+
+    "\0\u12f2\0\u1324\0\u1356\0\u1388\0\u13ba\0\u13ec\0\u141e\0\u1450"+
+    "\0\u1482\0\u14b4\0\u14e6\0\u1518\0\u154a\0\u157c\0\u15ae\0\u15e0"+
+    "\0\u1612\0\u1644\0\u1676\0\u16a8\0\u16da\0\u170c\0\u173e\0\u1770"+
+    "\0\u17a2\0\u17d4\0\u1806\0\u1838\0\u186a\0\u189c\0\u18ce\0\u1900"+
+    "\0\u1932\0\u1964\0\u1996\0\u19c8\0\u19fa\0\u1a2c\0\u1a5e\0\u1a90"+
+    "\0\u1ac2\0\u1af4\0\u1b26\0\u1b58\0\u1b8a\0\u1bbc\0\u1bee\0\u0352"+
+    "\0\u1c20\0\u1c52\0\u1c84\0\u1cb6\0\u1ce8\0\u186a\0\u1d1a\0\u1d4c"+
+    "\0\u1d7e\0\u1db0\0\u1de2\0\u1e14\0\u1e46\0\u1e78\0\u1eaa\0\u1edc"+
+    "\0\u1f0e\0\u1f40\0\u1f72\0\u1fa4\0\u1fd6\0\u2008\0\u203a\0\u206c"+
+    "\0\u209e\0\u20d0\0\u2102\0\u2134\0\u2166\0\u2198\0\u21ca\0\u21fc"+
+    "\0\u222e\0\u2260\0\u2292\0\u22c4\0\u22f6\0\u2328\0\u235a\0\u238c"+
+    "\0\u23be\0\u23f0\0\u2422\0\u2454\0\u2486\0\u24b8\0\u24ea\0\u251c"+
+    "\0\u254e\0\u2580\0\u25b2\0\u25e4\0\u2616\0\u2648\0\u267a\0\u26ac"+
+    "\0\u26de\0\u2710\0\u2742\0\u2774\0\u27a6\0\u27d8\0\u280a\0\u283c"+
+    "\0\u286e\0\u07d0\0\u28a0\0\u28d2\0\u2904\0\u2936\0\u2968\0\u299a"+
+    "\0\u29cc\0\u29fe\0\u2a30\0\u2a62\0\u2a94\0\u2ac6\0\u2af8\0\u2b2a"+
+    "\0\u2b5c\0\u2b8e\0\u2bc0\0\u2bf2\0\u2c24\0\u2c56\0\u2c88\0\u2cba"+
+    "\0\u2cec\0\u2d1e\0\u2d50\0\u2d82\0\144\0\u2db4\0\u2de6\0\u2e18"+
+    "\0\u2e4a\0\u2e7c\0\u2eae\0\u2ee0\0\u2f12\0\u2f44\0\u2f76\0\u2fa8"+
+    "\0\u2fda\0\u300c\0\u303e\0\u3070\0\u30a2\0\u30d4\0\u3106\0\u3138"+
+    "\0\u316a\0\u319c\0\u31ce\0\u3200\0\u3232\0\u3264\0\u3296\0\u0352"+
+    "\0\u32c8\0\u32fa\0\u332c\0\u335e\0\u3390\0\u33c2\0\u33f4\0\u3426"+
+    "\0\u3458\0\u348a\0\u34bc\0\u34ee\0\u3520\0\u3552\0\u3584\0\u35b6"+
+    "\0\u35e8\0\u361a\0\u364c\0\u367e\0\u36b0\0\u36e2\0\u3714\0\u3746"+
+    "\0\u3778\0\u37aa\0\u37dc\0\u380e\0\u3840\0\u3872\0\u38a4\0\u38d6"+
+    "\0\u3908\0\u393a\0\u396c\0\u399e\0\u39d0\0\u3a02\0\u3a34\0\u3a66"+
+    "\0\u3a98\0\u3aca\0\u3afc\0\u3b2e\0\u3b60\0\u3b92\0\u3bc4\0\u3bf6"+
+    "\0\u3c28\0\u3c5a\0\u3c8c\0\u3cbe\0\u3cf0\0\u3d22\0\u3d54\0\u3d86"+
+    "\0\u3db8\0\u3dea\0\u3e1c\0\u3e4e\0\u3e80\0\u3eb2\0\u3ee4\0\u3f16"+
+    "\0\u3f48\0\u3f7a\0\u3fac\0\u3fde\0\u4010\0\u36e2\0\u4042\0\u4074"+
+    "\0\u40a6\0\u40d8\0\u410a\0\u413c\0\u416e\0\u41a0\0\u41d2\0\u4204"+
+    "\0\u4236\0\u4268\0\u429a\0\u42cc\0\u42fe\0\u4330\0\u4362\0\u4394"+
+    "\0\u43c6\0\u43f8\0\u442a\0\u445c\0\u448e\0\u44c0\0\u44f2\0\u4524"+
+    "\0\u4556\0\u4588\0\u45ba\0\u45ec\0\u461e\0\u3b92\0\u4650\0\u4682"+
+    "\0\u46b4\0\u361a\0\u46e6\0\u4718\0\u474a\0\u477c\0\u47ae\0\u47e0"+
+    "\0\u4812\0\u4844\0\u4876\0\u48a8\0\u48da\0\u490c\0\u493e\0\u4970"+
+    "\0\u49a2\0\u49d4\0\u4a06\0\u4a38\0\u4a6a\0\u4a9c\0\u4ace\0\u4b00"+
+    "\0\u4b32\0\u4b64\0\u4b96\0\u4bc8\0\u4bfa\0\u4c2c\0\u4c5e\0\u4c90"+
+    "\0\u4cc2\0\u4cf4\0\u4d26\0\u4d58\0\u4d8a\0\u4dbc\0\u410a\0\u4dee"+
+    "\0\u4e20\0\u4e52\0\u4e84\0\u4eb6\0\u4ee8\0\u4f1a\0\u4f4c\0\u4f7e"+
+    "\0\u4fb0\0\u4fe2\0\u5014\0\u5046\0\u5078\0\u50aa\0\u50dc\0\u510e"+
+    "\0\u5140\0\u5172\0\u51a4\0\u51d6\0\u5208\0\u523a\0\u526c\0\u529e"+
+    "\0\u52d0\0\u5302\0\u5334\0\u5366\0\u5398\0\u53ca\0\u53fc\0\u542e"+
+    "\0\u5460\0\u5492\0\u54c4\0\u54f6\0\u5528\0\u555a\0\u558c\0\u55be"+
+    "\0\u55f0\0\u5622\0\u55f0\0\u5654\0\u5686\0\u56b8\0\u56ea\0\u571c"+
+    "\0\u574e\0\u5780\0\u57b2\0\u4d58\0\u57e4\0\u076c\0\u5816\0\u5848"+
+    "\0\u587a\0\u58ac\0\u0352\0\u58de\0\u5910\0\u5942\0\u5974\0\u59a6"+
+    "\0\u1f40\0\u59d8\0\u5a0a\0\u5a3c\0\u5a6e\0\u5aa0\0\u5ad2\0\u5b04"+
+    "\0\u5b36\0\u5b68\0\u5b9a\0\u5bcc\0\u5bfe\0\u5c30\0\u5c62\0\u5c94"+
+    "\0\u5cc6\0\u5cf8\0\u5d2a\0\u5d5c\0\u5d8e\0\u5dc0\0\u5df2\0\u5e24"+
+    "\0\u5e56\0\u5e88\0\u5eba\0\u5eec\0\u5f1e\0\u5f50\0\u5f82\0\u5fb4"+
+    "\0\u5fe6\0\u6018\0\u604a\0\u607c\0\u60ae\0\u60e0\0\u6112\0\u6144"+
+    "\0\u6176\0\u61a8\0\u5460\0\u0834\0\u61da\0\u620c\0\u623e\0\u6270"+
+    "\0\u62a2\0\u62d4\0\u6306\0\u6338\0\u636a\0\u639c\0\u63ce\0\u6400"+
+    "\0\u6432\0\u6464\0\u6496\0\u64c8\0\u64fa\0\u652c\0\u655e\0\u6590"+
+    "\0\u65c2\0\u65f4\0\u6626\0\u6658\0\u668a\0\u66bc\0\u66ee\0\u6720"+
+    "\0\u6752\0\u6784\0\u67b6\0\u67e8\0\u681a\0\u684c\0\u687e\0\u68b0"+
+    "\0\u68e2\0\u6914\0\u6946\0\u6978\0\u69aa\0\u69dc\0\u6a0e\0\u6a40"+
+    "\0\u6a72\0\u6aa4\0\u6ad6\0\u6b08\0\u6b3a\0\u6b6c\0\u6b9e\0\u6bd0"+
+    "\0\u6c02\0\u6c34\0\u6c66\0\u4236\0\u6c98\0\u6cca\0\u65f4\0\u6cfc"+
+    "\0\u6d2e\0\u6d60\0\u6d92\0\u6dc4\0\u6df6\0\u6e28\0\u6e5a\0\u5a6e"+
+    "\0\u6e8c\0\u6ebe\0\u6ef0\0\u6f22\0\u6f54\0\u6f86\0\u6fb8\0\u6fea"+
+    "\0\u701c\0\u704e\0\u7080\0\u70b2\0\u70e4\0\u7116\0\u7148\0\u717a"+
+    "\0\u61da\0\u71ac\0\u71de\0\u7210\0\u7242\0\u1194\0\u7274\0\u72a6"+
+    "\0\u72d8\0\u730a\0\u733c\0\u736e\0\u73a0\0\u73d2\0\u7404\0\u7436"+
+    "\0\u7468\0\u749a\0\u74cc\0\u74fe\0\u7530\0\u7562\0\u7594\0\u587a"+
+    "\0\u75c6\0\u75f8\0\u762a\0\u765c\0\u768e\0\u76c0\0\u76f2\0\u7724"+
+    "\0\u7756\0\u7788\0\u77ba\0\u77ec\0\u781e\0\u7850\0\u7882\0\u4ee8"+
+    "\0\u78b4\0\u78e6\0\u7918\0\u794a\0\u797c\0\u79ae\0\u79e0\0\u7a12"+
+    "\0\u7a44\0\u7a76\0\u7aa8\0\u7ada\0\u7b0c\0\u7b3e\0\u7b70\0\u7ba2"+
+    "\0\u6d60\0\u7bd4\0\u7c06\0\u7c38";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[668];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\3\1\4\1\5\1\3\1\6\1\7\1\10\1\11"+
+    "\1\12\1\3\3\13\1\14\4\5\1\15\5\5\1\16"+
+    "\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26"+
+    "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\3"+
+    "\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\24"+
+    "\1\45\1\3\1\4\1\5\1\3\1\6\1\7\1\10"+
+    "\1\11\1\12\1\3\1\13\1\46\1\13\1\14\4\5"+
+    "\1\15\5\5\1\16\1\17\1\20\1\21\1\22\1\23"+
+    "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+
+    "\1\34\1\35\1\3\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\24\1\45\62\0\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\51"+
+    "\5\24\2\52\1\24\1\52\1\24\1\53\1\24\1\54"+
+    "\1\55\1\54\1\24\1\56\4\24\1\47\1\52\1\24"+
+    "\1\54\1\24\1\57\4\24\1\47\1\24\1\5\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\5\1\24"+
+    "\5\5\20\24\1\47\11\24\4\6\1\60\55\6\5\7"+
+    "\1\61\54\7\7\10\1\0\52\10\10\0\1\12\67\0"+
+    "\1\62\1\63\1\64\1\65\2\0\1\65\2\64\1\0"+
+    "\1\66\1\67\1\0\1\70\1\71\1\72\1\73\1\74"+
+    "\1\75\1\0\1\76\1\77\1\100\1\101\1\102\1\103"+
+    "\2\0\1\104\1\0\1\105\1\106\4\0\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\107\3\24\1\110\1\111\1\24\1\112\1\113\1\114"+
+    "\2\24\1\115\1\116\1\117\1\24\1\47\3\24\1\120"+
+    "\1\121\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\1\122\5\24\1\123\3\24\1\124"+
+    "\1\125\1\126\1\24\1\127\2\24\1\130\2\24\1\131"+
+    "\1\132\4\24\1\47\3\24\1\126\5\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\133\1\134\2\24\1\135\1\136\1\24\1\137\1\24"+
+    "\1\140\1\141\1\24\1\142\1\134\1\24\1\143\1\47"+
+    "\1\144\3\24\1\145\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\146\13\24"+
+    "\1\147\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\126\6\24"+
+    "\2\126\4\24\1\150\1\24\1\151\2\24\1\152\1\153"+
+    "\2\24\1\47\3\24\1\126\3\24\1\154\1\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\155\1\24\1\156\2\157\1\160\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\161\1\162\1\24\1\163\3\24"+
+    "\1\164\1\165\1\24\1\166\1\167\4\24\1\47\3\24"+
+    "\1\170\1\171\1\172\2\24\1\173\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\126\5\24\1\174\1\134\1\175"+
+    "\1\176\1\24\1\177\1\24\1\126\1\200\1\24\1\43"+
+    "\1\24\1\201\1\202\1\203\1\204\1\47\1\134\1\205"+
+    "\2\24\1\145\1\206\1\24\1\207\1\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\210\5\24\1\211\1\212\1\126\1\213\1\214\2\24"+
+    "\1\126\1\24\1\215\1\216\5\24\1\47\1\24\1\217"+
+    "\1\24\1\126\1\220\3\24\1\221\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\1\122\3\24"+
+    "\1\222\1\24\1\123\7\24\1\223\11\24\1\224\1\225"+
+    "\1\47\10\24\1\226\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\12\24\1\227\2\126\1\230"+
+    "\1\231\1\232\1\24\1\126\1\24\1\233\1\230\1\24"+
+    "\1\230\1\234\1\235\1\230\1\47\1\24\1\236\1\24"+
+    "\1\126\1\24\1\230\3\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\237\4\24"+
+    "\1\240\3\24\1\241\6\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\14\24"+
+    "\1\242\1\243\1\244\1\245\7\24\1\246\2\24\1\47"+
+    "\1\24\1\205\5\24\1\247\1\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\250"+
+    "\1\251\1\24\1\252\2\24\1\253\1\254\3\24\1\255"+
+    "\1\47\4\24\1\256\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\15\24\1\257\3\24"+
+    "\1\260\1\261\2\24\1\262\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\3\24\1\263\1\264\5\24\1\265\1\266\1\24\1\267"+
+    "\1\270\2\24\1\271\1\272\1\273\1\274\1\275\1\276"+
+    "\1\277\1\300\1\301\1\47\1\24\1\302\1\24\1\303"+
+    "\1\304\2\24\1\305\1\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\306\2\24"+
+    "\1\307\2\24\1\126\1\24\1\310\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\12\24\1\311\1\24\1\312\1\313\1\314\4\24"+
+    "\1\315\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\316\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\317\1\320\6\24\1\321"+
+    "\1\322\6\24\1\47\4\24\1\323\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\324\10\24\1\325\3\24\1\326\1\327\1\24\1\47"+
+    "\4\24\1\231\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\1\24\1\205"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\6\24\1\330\2\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\331\12\24\1\47\11\24\1\0\2\46\13\0"+
+    "\32\46\1\0\11\46\3\47\1\0\3\47\2\0\1\47"+
+    "\2\0\1\47\1\0\45\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\54\3\24\1\54"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\54\12\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\332\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\3\24\1\333\5\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\54"+
+    "\5\24\2\52\1\24\1\52\1\24\1\54\1\24\3\54"+
+    "\6\24\1\47\1\52\1\24\1\54\6\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\54\25\24\1\47\11\24\17\0\1\334\71\0\1\335"+
+    "\51\0\1\336\61\0\1\337\73\0\1\340\60\0\1\341"+
+    "\14\0\1\342\1\0\1\343\46\0\1\344\2\0\1\345"+
+    "\52\0\1\346\4\0\1\347\55\0\1\350\2\0\1\351"+
+    "\6\0\1\352\10\0\1\353\31\0\1\354\65\0\1\341"+
+    "\4\0\1\355\6\0\1\356\2\0\1\343\46\0\1\357"+
+    "\4\0\1\360\50\0\1\361\10\0\1\362\61\0\1\363"+
+    "\55\0\1\364\11\0\1\343\61\0\1\365\55\0\1\366"+
+    "\46\0\1\367\63\0\1\370\57\0\1\341\1\371\6\0"+
+    "\1\372\14\0\1\373\43\0\1\374\1\0\1\375\13\0"+
+    "\1\376\4\0\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\16\24\1\377\3\24\1\u0100\1\24"+
+    "\1\u0101\1\u0102\4\24\1\47\1\u0103\7\24\1\u0104\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0105\3\24\1\u0106\3\24\1\u0107\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\3\24\1\u0108\5\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\12\24\1\u0109\1\u010a\1\u010b\1\24\1\u010c\11\24\1\u010d"+
+    "\1\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\u010e"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\u010f\11\24\1\54\13\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u0110\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u0111\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\u0112"+
+    "\1\u0113\2\24\1\u0114\3\24\1\u0115\4\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\23\24\1\142\6\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\u0116\10\24\1\u0117\3\24\1\u0118\1\u0119\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\2\24\1\u0110\27\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\3\24\1\u0110\26\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\54"+
+    "\6\24\1\54\2\24\1\54\5\24\1\47\4\24\1\54"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\27\24\1\u011a\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u011b\25\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u011c"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\22\24\1\54\1\24\1\u011d"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\24\24\1\u011e\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\14\24\1\u011f\1\u0120\1\54\13\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\24\24\1\146\5\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\23\24\1\u0121\6\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u0122"+
+    "\6\24\1\54\3\24\1\u0123\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\54\5\24\1\54\10\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\22\24\1\u0124\1\u0125\1\u0126\5\24\1\47\1\24\1\u0127"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\21\24\1\54\10\24\1\47\4\24\1\u0128"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\54\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\54\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\54"+
+    "\2\24\1\146\5\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\213"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\54\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\1\u0129\10\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\54\12\24\1\54\1\47\1\24\1\u012a\7\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\30\24\1\u012b\1\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\54"+
+    "\2\24\2\54\7\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\26\24\1\u012c"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u012d\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\u012e\5\24\1\u012f\6\24\1\u0130"+
+    "\1\u0131\3\24\1\u0132\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\4\24\1\54\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\54\2\24"+
+    "\1\54\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\u0133\21\24"+
+    "\1\u0134\3\24\1\47\4\24\1\u0135\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\3\24\1\126\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\u0136\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\126\25\24\1\47\3\24"+
+    "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\126\22\24\1\126\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\14\24\1\u0137\15\24\1\47\3\24"+
+    "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\27\24\1\126\2\24\1\47\3\24"+
+    "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\24\24\1\u0138\1\24\1\u0139\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\u013a\21\24\1\u013b\1\u013c"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\143"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\230\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u013d\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\54"+
+    "\1\u011f\1\24\1\54\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+    "\1\u013e\2\24\1\u013e\4\24\1\u013f\4\24\1\u0140\1\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\54\14\24\1\47\7\24"+
+    "\1\154\1\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0141\3\24\1\u0142\3\24"+
+    "\1\47\1\u0143\10\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\12\24\1\u0126\17\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\1\126\1\24\2\126\1\24\5\126\1\u0144"+
+    "\3\24\1\u0145\3\24\1\54\1\u0126\1\54\2\24\1\54"+
+    "\2\24\1\47\4\24\1\u0128\4\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\146"+
+    "\5\24\1\47\1\u0146\1\24\1\u0147\6\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+    "\1\u0148\14\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0149\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\315\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\u014a\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u014b\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\30\24\1\u014c\1\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\13\24\1\u011b\2\24\1\u014d\7\24"+
+    "\1\u014e\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\22\24\1\54\1\24"+
+    "\1\54\1\24\1\143\1\54\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\1\24\1\54\7\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\3\24\1\126"+
+    "\2\24\2\126\1\24\1\126\20\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\u014f\5\24\1\47\4\24\1\u0150\4\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\5\24\1\54\3\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\52"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u0151\15\24\1\54"+
+    "\1\u0152\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0153\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\u0154\13\24\1\u0155\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\143\25\24\1\47\1\u0110"+
+    "\10\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0156\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\31\24\1\u0157\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0158\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\54\6\24\1\54\4\24"+
+    "\1\u0159\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\1\126\1\24\2\126"+
+    "\1\24\5\126\20\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\54"+
+    "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u015a\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\10\24\1\u015b\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\230\25\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+    "\1\u0103\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\115\17\24\1\47\1\54"+
+    "\10\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\54\14\24\1\u015c\4\24\1\54"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u012c\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\7\24\1\154\1\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\2\24\1\126\2\24\4\126\21\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\146\10\24\1\47\3\24\1\u015d\5\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\26\24\1\u015e\3\24\1\47\4\24\1\u015f\4\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u0160\25\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\u0161"+
+    "\12\24\1\146\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0162"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u0163\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\27\24\1\u0164\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0165\1\u0166\3\24\1\u0167\3\24\1\47\10\24"+
+    "\1\u0168\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\1\u0110\2\24\1\u0110\11\24\1\u0110\1\24"+
+    "\1\u0110\4\24\1\u0169\1\u016a\1\24\1\u016b\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\4\24\1\u013a\23\24\1\u011b\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\3\24\1\54\26\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u016c\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u016d"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u016e\22\24\1\u016f"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\3\24\1\u0170"+
+    "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\u0171\3\24\1\u0172\7\24\1\u0173"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\15\24\1\143\1\u0110\5\24"+
+    "\1\u0174\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\24\24\1\u0175\5\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\13\24\1\u0176\5\24\1\u0177\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\21\24\1\u0178\3\24\1\u0179\4\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\12\24\1\u017a\7\24\1\u017b\3\24"+
+    "\1\u017c\1\u017d\1\u017e\1\24\1\47\5\24\1\u017f\3\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\u0180\1\143\6\24\1\u0181\6\24\1\47"+
+    "\4\24\1\u0182\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\16\24\1\u0161\13\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u0183\7\24\1\u0184\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\21\24\1\u0185\1\u0186\1\57\3\24\1\u0187"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\146\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\317\1\u0176\5\24\1\u0188\1\u0189"+
+    "\1\24\1\u018a\1\u018b\4\24\1\47\4\24\1\u018c\4\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\22\24\1\u018d\7\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\u018e\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\311\10\24"+
+    "\1\315\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\156\3\24"+
+    "\1\u018f\2\24\1\u0190\1\u0191\3\24\1\u0192\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\u0193\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\u0194\16\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u0195"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\u0196\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0137\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\146\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\27\24\1\u015e"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u0197\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0110\3\24\1\47\4\24\1\u0135"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u0198\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\16\24\1\u0199\13\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u0176"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\12\24\1\u019a\17\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\14\24\1\u019b\15\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\16\24\1\u019c\13\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\4\24\1\231\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u019d\1\u019e\7\24"+
+    "\1\47\3\24\1\u019f\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+    "\1\u01a0\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\25\24\1\u019f\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\u015b\16\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01a1"+
+    "\15\24\1\u01a2\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\16\24\1\u01a3\13\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\2\24\1\54\6\24"+
+    "\20\0\1\365\60\0\1\u01a4\62\0\1\u01a5\61\0\1\u01a5"+
+    "\2\0\1\365\60\0\1\u01a6\70\0\1\u01a7\67\0\1\u01a8"+
+    "\62\0\1\u01a9\56\0\1\u01aa\63\0\1\365\64\0\1\u01ab"+
+    "\41\0\1\u01ac\76\0\1\u01ad\56\0\1\u01ae\67\0\1\u01af"+
+    "\64\0\1\u01b0\56\0\1\365\75\0\1\365\33\0\1\u01b1"+
+    "\66\0\1\101\66\0\1\u01b2\1\u01b3\62\0\1\u01b4\54\0"+
+    "\1\u01b5\41\0\1\u01b6\11\0\1\u01b7\6\0\1\372\75\0"+
+    "\1\u01b0\51\0\1\u01b8\51\0\1\u01b9\72\0\1\u01ba\61\0"+
+    "\1\u01bb\50\0\1\357\102\0\1\365\53\0\1\u01bc\54\0"+
+    "\1\u01bd\73\0\1\365\5\0\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u01be\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\20\24\1\u01bf\11\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\u01c0\5\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\24\24"+
+    "\1\u01c1\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0110\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\1\u01c2\10\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\31\24\1\u01c3\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\22\24\1\u0110\3\24"+
+    "\1\u0137\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+    "\1\u01c4\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u01c5\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\u01c6\5\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01c7"+
+    "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\30\24\1\u01c8\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\u01c9\1\u01c7\16\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\15\24\1\u01c0\14\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\u01ca\25\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\u01cb\7\24"+
+    "\1\u01cc\6\24\1\u01cb\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u01c5"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\13\24\1\u01cd\16\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\1\u0103\10\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\14\24"+
+    "\1\u010f\15\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\u01ce\25\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\24\24\1\u01cf\5\24\1\47\3\24"+
+    "\1\u01d0\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\10\24\1\u01d1\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u01d0\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01d2"+
+    "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\1\u01d3\10\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\54\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\30\24"+
+    "\1\237\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\11\24"+
+    "\1\u0110\2\24\1\143\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\143\20\24\1\u01d4\4\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\31\24"+
+    "\1\54\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\u01d5\12\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\31\24\1\225\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\10\24\1\u01d6\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\1\u01d7\10\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\12\24\1\u01d5\5\24\1\54\11\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\4\24\1\u01d8\25\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u01d9\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\1\24"+
+    "\1\u0131\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\3\24\1\u01da\5\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\14\24\1\u0127\15\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\57\17\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\25\24\1\u0176\4\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\21\24\1\u0110\10\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\17\24\1\u01db\12\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u01dc\5\24\1\u01dd\1\u0110\3\24\1\47\2\24\1\54"+
+    "\6\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\13\24\1\u01de\16\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\15\24\1\230\6\24\1\230\1\24\1\230\3\24\1\47"+
+    "\1\24\1\230\3\24\1\230\3\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u01df"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\54\3\24\1\54"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\4\24\1\232\4\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\21\24\1\232\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\142\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01e0\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\u0110\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\4\24\1\u0110\14\24\1\u01e1\5\24\1\u01e2\2\24"+
+    "\1\47\4\24\1\u0110\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\142\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\u013f\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\u013d\1\u01e3\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\26\24\1\u01e4\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0110"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\24\24\1\54\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u01e5\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\31\24\1\u01d4\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0155\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\51\5\24\2\52\1\24"+
+    "\1\52\1\24\1\54\1\24\3\54\1\24\1\56\4\24"+
+    "\1\47\1\52\1\24\1\54\6\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\4\24\1\u01e6\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\22\24\1\u01e7\7\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\u01e8\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u01e9\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u01ea"+
+    "\12\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\143\14\24\1\u01eb"+
+    "\4\24\1\u01ec\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u01ed"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u019f\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u01ee\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u0176\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\u01ef"+
+    "\13\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u01f0\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u015a\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u01f1\2\24\1\47\4\24\1\u01f2\4\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\143\14\24\1\u01f3\10\24\1\47\3\24\1\u01f4"+
+    "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\10\24\1\u0142\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\u01f5\14\24\1\u01f6\4\24\1\u01f7\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\26\24\1\u01f0\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\27\24"+
+    "\1\u016f\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\u01f8\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\16\24\1\u01f9\13\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\12\24\1\u015a\17\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u01fa\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\14\24"+
+    "\1\143\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\u01fb\25\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\26\24\1\u01fc\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\u0103\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u01fd\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01fe\12\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0110\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\u0110\5\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\u01ff\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+    "\1\54\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\15\24\1\54\6\24\1\54\1\24\1\115"+
+    "\3\24\1\47\1\24\1\54\7\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u0200"+
+    "\1\24\1\u0201\14\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\54"+
+    "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\13\24\1\u0202\7\24\1\u0203"+
+    "\1\54\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01e2\7\24"+
+    "\1\u0204\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\15\24\1\u0110\6\24"+
+    "\1\u0205\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\24\24\1\u0206\5\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\1\122\5\24\1\123\12\24\1\u0110"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\u0207"+
+    "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\u0208\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\23\24\1\u013d\6\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\4\24\1\u0209\4\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u0173\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u020a\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\12\24\1\u020b\17\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u020c"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\1\54\3\24\1\u020d\6\24"+
+    "\1\u020e\3\24\1\u020f\2\24\1\213\7\24\1\47\2\24"+
+    "\1\54\6\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\26\24\1\57\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\26\24\1\120\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\24\24"+
+    "\1\u0210\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\12\24\1\u0211\17\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\54\12\24\1\u020f\1\24"+
+    "\2\213\7\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\25\24\1\u0212\4\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\u0213\14\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\146\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u0214\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\54\10\24"+
+    "\1\47\4\24\1\u0215\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\23\24\1\u0216\6\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0217\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\10\24\1\u0213\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u017a"+
+    "\13\24\1\u0218\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u0180"+
+    "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\311\4\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u020c\1\24\1\u0219\1\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\23\24\1\u021a\6\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u021b\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\u0217"+
+    "\4\24\1\146\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\30\24\1\u011b"+
+    "\1\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\u021c\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\17\24\1\u01d6\12\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0178\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u017a"+
+    "\17\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\14\24\1\54\15\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\16\24\1\u021d\13\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\1\u020c\16\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\3\24\1\u021e"+
+    "\26\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\15\24\1\u021f\14\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\30\24\1\u0220\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\25\24\1\u0221\4\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u01db"+
+    "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\u01e9\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0222\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\1\54\10\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\25\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\20\24\1\u0223\11\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\16\24\1\u0137\13\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\u01d4\1\u0224\1\u0225\4\24\1\u0226\2\24\1\54\1\u0227"+
+    "\2\24\1\u01d4\1\24\1\47\2\24\1\u0214\1\24\1\u0228"+
+    "\1\54\3\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\27\24\1\u0229\2\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\27\24\1\u022a\2\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\54\13\24\1\47\1\24\1\54\7\24\20\0\1\365"+
+    "\2\0\1\365\60\0\1\365\71\0\1\u022b\60\0\1\365"+
+    "\74\0\1\u022c\56\0\1\u022d\50\0\1\u022e\76\0\1\376"+
+    "\51\0\1\u022f\61\0\1\u0230\42\0\1\365\2\0\1\365"+
+    "\11\0\1\365\1\0\1\365\4\0\1\u0231\1\u0232\1\0"+
+    "\1\u0233\61\0\1\101\4\0\1\365\53\0\1\365\51\0"+
+    "\1\u0234\3\0\1\u022e\56\0\1\365\63\0\1\u01b0\4\0"+
+    "\1\u0235\45\0\1\u0236\70\0\1\u0237\45\0\1\365\103\0"+
+    "\1\u0238\61\0\1\u0239\56\0\1\u023a\50\0\1\u01b2\67\0"+
+    "\1\u01b0\53\0\1\u023b\65\0\1\u01a7\24\0\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+    "\1\u01ef\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\u023c\6\24"+
+    "\1\u023d\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\15\24\1\54\3\24"+
+    "\1\u01c2\2\24\1\54\3\24\1\u023e\1\24\1\47\1\24"+
+    "\1\54\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\25\24\1\54\4\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\15\24\1\54\14\24\1\47\1\24\1\54\7\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\17\24\1\u023f\12\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+    "\1\u0240\17\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\16\24\1\213\13\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\213\14\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\54\5\24\1\47\1\24\1\54\3\24"+
+    "\1\54\3\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\31\24\1\213\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\54\5\24\1\47\1\24\1\54\7\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0241\12\24\1\47\1\u0242\10\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\23\24"+
+    "\1\u0243\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u0244\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0245\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\24\24\1\u0246\5\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\213\6\24\1\u0247\1\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\4\24\1\u0248\4\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\213\1\u0249"+
+    "\15\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\u024a\4\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\13\24\1\u0110\16\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\26\24\1\u024b\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+    "\5\24\1\u01dd\4\24\1\47\2\24\1\54\6\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\15\24\1\54\6\24\1\54\5\24\1\47\1\24\1\54"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\u0135\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\12\24\1\u01e5\17\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+    "\12\24\1\47\2\24\1\54\6\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\1\u024c\1\u01db"+
+    "\5\24\1\u01db\22\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\u0162"+
+    "\13\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u024d\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\31\24\1\u0110\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+    "\1\u024e\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+    "\1\u0110\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\26\24\1\u0110\3\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\17\24\1\u024f\12\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\20\24"+
+    "\1\u0110\11\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\22\24\1\u0250\7\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\50\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u01f0\1\24\1\u01e2\6\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\54\4\24\1\115\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+    "\1\u01d5\1\u0251\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\u01d6"+
+    "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\u0252\4\24\1\47"+
+    "\3\24\1\311\5\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\7\24\1\u01e9"+
+    "\1\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\115\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\143\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u024f"+
+    "\3\24\1\u013d\6\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\54"+
+    "\3\24\1\54\2\24\1\54\5\24\1\47\1\24\1\54"+
+    "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\22\24\1\u0253\7\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0254\5\24\1\u0255\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0256\5\24\1\u0257\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u0258\14\24\1\u0259\10\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u01e5\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\31\24\1\u025a"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\17\24\1\u025b\12\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\13\24\1\u025c\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u025d\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\21\24\1\230\10\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\24\24\1\u0205\5\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\30\24\1\u0244\1\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\30\24"+
+    "\1\u025e\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u013d\2\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\4\24\1\u019b\25\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\20\24\1\u0103\11\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\31\24"+
+    "\1\u025f\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\17\24\1\u01e2\12\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\25\24\1\u025f\4\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u01f1\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\20\24\1\u0260"+
+    "\11\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\1\54\31\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\4\24\1\u0261\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\27\24"+
+    "\1\54\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\3\24\1\u0262\21\24"+
+    "\1\257\4\24\1\47\1\257\10\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0164"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\27\24\1\u0263\2\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\13\24\1\u01d6\16\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\22\24\1\u0264\7\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\54"+
+    "\11\24\1\u020c\13\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\3\24\1\54\5\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u020c\22\24\1\u020c"+
+    "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\10\24\1\u0265"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\21\24\1\u0177\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+    "\1\u020f\1\24\2\213\7\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+    "\1\u0266\14\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+    "\1\u020c\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\10\24\1\u0266\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\4\24\1\u0215\4\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u0267"+
+    "\17\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\32\24\1\47\3\24\1\u0268"+
+    "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\12\24\1\u01d5\17\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\u0110\25\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\10\24\1\u0176\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\15\24\1\54\14\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\4\24\1\u0269\4\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\143\7\24\1\u01d4\15\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+    "\1\143\6\24\1\u01d4\16\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+    "\1\54\3\24\1\54\2\24\1\54\5\24\1\47\1\24"+
+    "\1\54\1\24\1\54\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u026a\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\21\24\1\u026b\10\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\25\24\1\u026c\4\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+    "\1\u026c\16\24\1\47\11\24\30\0\1\365\61\0\1\341"+
+    "\14\0\1\101\7\0\1\u026d\47\0\1\354\54\0\1\365"+
+    "\53\0\1\u01b0\76\0\1\101\51\0\1\101\7\0\1\u026e"+
+    "\47\0\1\365\6\0\1\357\10\0\1\365\50\0\1\u026f"+
+    "\63\0\1\u0270\62\0\1\u0271\64\0\1\365\46\0\1\u0272"+
+    "\63\0\1\u0273\53\0\1\u0274\60\0\1\361\72\0\1\u022f"+
+    "\20\0\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\21\24\1\u0275\10\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\21\24\1\u0276\10\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u01c2"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\26\24\1\u0277\3\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\26\24\1\u0103\3\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\5\24\1\u0278\3\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\26\24\1\u0278"+
+    "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\25\24\1\u0279\4\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\20\24\1\u027a\11\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\1\24\1\u0176\7\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u027b"+
+    "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\30\24\1\213\1\24\1\47"+
+    "\1\24\1\54\7\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\15\24\1\u0110\14\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\14\24\1\u027c\15\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\11\24\1\u01db\20\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\31\24\1\u027d"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\25\24\1\u01fe\4\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\25\24\1\u01e5\4\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+    "\1\u015e\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0139\3\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\14\24\1\u027e\15\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\3\24\1\u027f\26\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\3\24"+
+    "\1\u01d4\26\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\3\24\1\u0280\26\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\3\24\1\u01f1\26\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\21\24\1\u0254\10\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+    "\1\u0256\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\13\24\1\u0281\16\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\32\24\1\47\1\u0110\10\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\27\24\1\u01e5\2\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\5\24\1\172\3\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\24\24\1\u0282\5\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\27\24\1\u0110\2\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\13\24\2\u01d4\15\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+    "\6\24\1\54\3\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\146"+
+    "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\23\24\1\143\6\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\15\24\1\52\1\24\1\54\5\24\1\u0283"+
+    "\2\24\1\54\1\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\146"+
+    "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\4\24\1\u0209\25\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\23\24\1\u0284\6\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\4\24\1\143\25\24\1\47\5\24\1\54\3\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\20\24\1\u01d4\11\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u0285"+
+    "\12\24\1\47\11\24\30\0\1\u0286\100\0\1\u0287\55\0"+
+    "\1\u0287\64\0\1\u0288\56\0\1\u0289\67\0\1\365\54\0"+
+    "\1\u028a\55\0\1\u028b\21\0\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\24\24\1\213\5\24"+
+    "\1\47\1\24\1\u0247\7\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\1\24"+
+    "\1\u0247\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\22\24\1\u0191\7\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\26\24\1\u028c\3\24\1\47\11\24\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+    "\2\u028d\15\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\20\24\1\u0247\11\24"+
+    "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+    "\2\0\1\47\1\0\23\24\1\u01e2\6\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\1\u0110\2\24\1\u0110\11\24\1\u0110\1\24\1\u0110"+
+    "\4\24\1\u0205\1\u016a\1\24\1\u028e\2\24\1\47\11\24"+
+    "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+    "\1\0\32\24\1\47\1\u0222\10\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\u020d"+
+    "\25\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\21\24\1\u020d\10\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\23\24\1\u028f\6\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0290\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\52"+
+    "\1\24\1\54\10\24\1\54\1\24\1\47\11\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\32\24\1\47\10\24\1\216\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\6\24"+
+    "\1\u0291\2\24\40\0\1\u0292\66\0\1\365\62\0\1\u01b2"+
+    "\60\0\1\101\7\0\1\u0293\60\0\1\u0294\5\0\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\17\24\1\u0295\12\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\213"+
+    "\6\24\1\216\5\24\1\47\1\24\1\u0176\7\24\1\47"+
+    "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+    "\24\24\1\u013d\5\24\1\47\11\24\1\47\2\24\1\0"+
+    "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+    "\1\24\1\u01e9\7\24\1\47\2\24\1\0\3\47\2\0"+
+    "\1\50\2\0\1\47\1\0\13\24\1\u0296\16\24\1\47"+
+    "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+    "\1\47\1\0\32\24\1\47\6\24\1\u0110\2\24\34\0"+
+    "\1\u0297\55\0\1\u0298\104\0\1\365\6\0\1\47\2\24"+
+    "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+    "\1\47\3\24\1\u01e5\5\24\1\47\2\24\1\0\3\47"+
+    "\2\0\1\50\2\0\1\47\1\0\27\24\1\u0299\2\24"+
+    "\1\47\11\24\41\0\1\u029a\60\0\1\u029b\51\0\1\341"+
+    "\65\0\1\u029c\66\0\1\365\20\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[31850];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\2\0\1\11\5\1\1\11\1\1\1\11\44\1\2\11"+
+    "\25\0\225\1\31\0\1\11\11\0\245\1\1\0\1\1"+
+    "\10\0\1\1\17\0\155\1\1\0\1\1\3\0\1\1"+
+    "\5\0\1\1\5\0\61\1\7\0\22\1\1\0\1\1"+
+    "\2\0\1\1\1\0\6\1\3\0\2\1\2\0\2\1"+
+    "\2\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[668];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** 
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  We must have this here as JFLex does not generate a
+	 * no parameter constructor.
+	 */
+	public AssemblerX86TokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { ";", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *                    <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public AssemblerX86TokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public AssemblerX86TokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 200) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      if (zzMarkedPosL > zzStartRead) {
+        switch (zzBufferL[zzMarkedPosL-1]) {
+        case '\n':
+        case '\u000B':
+        case '\u000C':
+        case '\u0085':
+        case '\u2028':
+        case '\u2029':
+          zzAtBOL = true;
+          break;
+        case '\r': 
+          if (zzMarkedPosL < zzEndReadL)
+            zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          else if (zzAtEOF)
+            zzAtBOL = false;
+          else {
+            boolean eof = zzRefill();
+            zzMarkedPosL = zzMarkedPos;
+            zzEndReadL = zzEndRead;
+            zzBufferL = zzBuffer;
+            if (eof) 
+              zzAtBOL = false;
+            else 
+              zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          }
+          break;
+        default:
+          zzAtBOL = false;
+        }
+      }
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      if (zzAtBOL)
+        zzState = ZZ_LEXSTATE[zzLexicalState+1];
+      else
+        zzState = ZZ_LEXSTATE[zzLexicalState];
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 11: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 16: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 17: break;
+        case 12: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 18: break;
+        case 9: 
+          { addToken(Token.FUNCTION);
+          }
+        case 19: break;
+        case 5: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 20: break;
+        case 14: 
+          { addToken(Token.VARIABLE);
+          }
+        case 21: break;
+        case 7: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 22: break;
+        case 10: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 23: break;
+        case 15: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 24: break;
+        case 4: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 25: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 26: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 27: break;
+        case 13: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 28: break;
+        case 3: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 29: break;
+        case 6: 
+          { addNullToken(); return firstToken;
+          }
+        case 30: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 669: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex	(revision 25584)
@@ -0,0 +1,270 @@
+/*
+ * 11/18/2009
+ *
+ * BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for BBCode.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated BBCodeTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ *
+ */
+%%
+
+%public
+%class BBCodeTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to BBCodeTokenMaker; this signals that the user has
+	 * ended a line with an unclosed tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -1;
+
+	/**
+	 * Whether closing markup tags are automatically completed for BBCode.
+	 */
+	private static boolean completeCloseTags = true;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public BBCodeTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *        occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  The default value
+	 * for BBCode is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns <code>null</code> since BBCode has no comments.
+	 *
+	 * @return <code>null</code> always.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Whitespace			= ([ \t\f]+)
+LineTerminator		= ([\n])
+Identifier			= ([^ \t\f\n\[]+)
+InTagIdentifier		= ([^ \t\f\n\[\]\/\=]+)
+Tag					= ("b"|"i"|"u"|"s"|"size"|"color"|"center"|"quote"|"url"|"img"|"ul"|"li"|"ol"|"youtube"|"gvideo")
+
+%state INTAG
+
+%%
+
+<YYINITIAL> {
+	{Identifier}			{ addToken(Token.IDENTIFIER); }
+	{Whitespace}			{ addToken(Token.WHITESPACE); }
+	"["						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"[/"					{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}		{ addNullToken(); return firstToken; }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<INTAG> {
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{Tag}					{ addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}			{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/]"					{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	"]"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	.						{ addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */ }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java	(revision 25584)
@@ -0,0 +1,725 @@
+/* The following code was generated by JFlex 1.4.1 on 11/18/09 4:41 PM */
+
+/*
+ * 11/18/2009
+ *
+ * BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for BBCode.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated BBCodeTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ *
+ */
+
+public class BBCodeTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INTAG = 1;
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\16\0\1\27\15\0"+
+    "\1\30\35\0\1\3\1\0\1\4\4\0\1\5\1\13\1\26\1\12"+
+    "\1\0\1\23\1\0\1\6\2\0\1\15\1\22\1\17\1\14\1\0"+
+    "\1\21\1\16\1\10\1\20\1\7\1\25\2\0\1\24\1\11\uff85\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\2\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+    "\4\10\6\5\1\11\1\12\1\4\23\5";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[41];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\31\0\62\0\113\0\144\0\175\0\226\0\144"+
+    "\0\144\0\226\0\257\0\310\0\341\0\372\0\u0113\0\u012c"+
+    "\0\u0145\0\u015e\0\u0177\0\u0190\0\144\0\144\0\u01a9\0\u01c2"+
+    "\0\u01db\0\u01f4\0\u020d\0\u0226\0\u023f\0\u0258\0\u0271\0\u028a"+
+    "\0\u02a3\0\u02bc\0\u02d5\0\u02ee\0\u0307\0\u0320\0\u0339\0\u0352"+
+    "\0\u036b";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[41];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\3\1\4\1\5\1\6\25\3\1\7\1\4\1\0"+
+    "\1\10\1\11\1\12\1\13\1\14\1\15\2\7\1\16"+
+    "\1\17\1\20\3\7\1\21\1\7\1\22\1\23\2\7"+
+    "\1\24\1\25\1\3\3\0\25\3\1\0\1\4\107\0"+
+    "\1\26\1\0\1\7\4\0\22\7\2\0\1\7\4\0"+
+    "\15\7\1\27\4\7\2\0\1\7\4\0\10\7\1\12"+
+    "\1\17\10\7\2\0\1\7\4\0\1\7\1\30\20\7"+
+    "\2\0\1\7\4\0\5\7\1\31\1\7\1\32\12\7"+
+    "\2\0\1\7\4\0\10\7\1\12\11\7\2\0\1\7"+
+    "\4\0\1\7\1\12\20\7\2\0\1\7\4\0\2\7"+
+    "\1\33\17\7\2\0\1\7\4\0\20\7\1\34\1\7"+
+    "\2\0\1\7\4\0\7\7\1\35\12\7\6\0\1\11"+
+    "\24\0\1\7\4\0\16\7\1\12\3\7\2\0\1\7"+
+    "\4\0\4\7\1\36\15\7\2\0\1\7\4\0\12\7"+
+    "\1\37\7\7\2\0\1\7\4\0\10\7\1\40\11\7"+
+    "\2\0\1\7\4\0\7\7\1\41\12\7\2\0\1\7"+
+    "\4\0\1\7\1\42\20\7\2\0\1\7\4\0\2\7"+
+    "\1\43\17\7\2\0\1\7\4\0\5\7\1\12\14\7"+
+    "\2\0\1\7\4\0\13\7\1\44\6\7\2\0\1\7"+
+    "\4\0\7\7\1\45\12\7\2\0\1\7\4\0\13\7"+
+    "\1\36\6\7\2\0\1\7\4\0\21\7\1\46\2\0"+
+    "\1\7\4\0\13\7\1\47\6\7\2\0\1\7\4\0"+
+    "\5\7\1\45\14\7\2\0\1\7\4\0\11\7\1\12"+
+    "\10\7\2\0\1\7\4\0\5\7\1\50\14\7\2\0"+
+    "\1\7\4\0\2\7\1\51\17\7\2\0\1\7\4\0"+
+    "\7\7\1\12\12\7\2\0\1\7\4\0\1\36\21\7"+
+    "\2\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[900];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\2\0\2\1\1\11\2\1\2\11\13\1\2\11\23\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[41];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to BBCodeTokenMaker; this signals that the user has
+	 * ended a line with an unclosed tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -1;
+
+	/**
+	 * Whether closing markup tags are automatically completed for BBCode.
+	 */
+	private static boolean completeCloseTags = true;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public BBCodeTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *        occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  The default value
+	 * for BBCode is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns <code>null</code> since BBCode has no comments.
+	 *
+	 * @return <code>null</code> always.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public BBCodeTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public BBCodeTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 80) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 11: break;
+        case 9: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 12: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 13: break;
+        case 10: 
+          { addToken(Token.OPERATOR);
+          }
+        case 14: break;
+        case 8: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 15: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 16: break;
+        case 6: 
+          { addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */
+          }
+        case 17: break;
+        case 5: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 18: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 19: break;
+        case 7: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 20: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 42: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 43: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex	(revision 25584)
@@ -0,0 +1,669 @@
+/*
+ * 11/19/2004
+ *
+ * CPlusPlusTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in C++.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A parser for the C++ programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CPlusPlusTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ *
+ */
+%%
+
+%public
+%class CPlusPlusTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CPlusPlusTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter				= [A-Za-z]
+LetterOrUnderscore	= ({Letter}|"_")
+Digit				= [0-9]
+HexDigit			= {Digit}|[A-Fa-f]
+OctalDigit			= [0-7]
+Exponent			= [eE][+-]?{Digit}+
+
+PreprocessorWord	= define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
+
+Trigraph				= ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
+
+OctEscape1			= ([\\]{OctalDigit})
+OctEscape2			= ([\\]{OctalDigit}{OctalDigit})
+OctEscape3			= ([\\][0-3]{OctalDigit}{OctalDigit})
+OctEscape				= ({OctEscape1}|{OctEscape2}|{OctEscape3})
+HexEscape				= ([\\][xX]{HexDigit}{HexDigit})
+
+AnyChrChr					= ([^\'\n\\])
+Escape					= ([\\]([abfnrtv\'\"\?\\0]))
+UnclosedCharLiteral			= ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
+CharLiteral				= ({UnclosedCharLiteral}[\'])
+ErrorUnclosedCharLiteral		= ([\'][^\'\n]*)
+ErrorCharLiteral			= (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
+AnyStrChr					= ([^\"\n\\])
+FalseTrigraph				= (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
+StringLiteral				= ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+
+
+LineTerminator		= \n
+WhiteSpace		= [ \t\f]
+
+MLCBegin			= "/*"
+MLCEnd			= "*/"
+LineCommentBegin	= "//"
+
+NonFloatSuffix		= (([uU][lL]?)|([lL][uU]?))
+IntegerLiteral		= ({Digit}+{Exponent}?{NonFloatSuffix}?)
+HexLiteral		= ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
+FloatLiteral		= ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
+ErrorNumberFormat	= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+NonSeparator		= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+Identifier		= ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
+ErrorIdentifier	= ({NonSeparator}+)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"auto" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"const_cast" |
+	"continue" |
+	"default" |
+	"delete" |
+	"do" |
+	"dynamic_cast" |
+	"else" |
+	"enum" |
+	"explicit" |
+	"extern" |
+	"for" |
+	"friend" |
+	"goto" |
+	"if" |
+	"inline" |
+	"mutable" |
+	"namespace" |
+	"new" |
+	"operator" |
+	"private" |
+	"protected" |
+	"public" |
+	"register" |
+	"reinterpret_cast" |
+	"return" |
+	"sizeof" |
+	"static" |
+	"static_cast" |
+	"struct" |
+	"switch" |
+	"template" |
+	"this" |
+	"throw" |
+	"try" |
+	"typedef" |
+	"typeid" |
+	"typename" |
+	"union" |
+	"using" |
+	"virtual" |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+
+	/* Boolean literals. */
+	"true" |
+	"false" |
+
+	/* Data types. */
+	"bool" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"short" |
+	"signed" |
+	"unsigned" |
+	"void" |
+	"wchar_t"				{ addToken(Token.DATA_TYPE); }
+
+	/* Standard functions */
+	"abort" |
+	"abs" |
+	"acos" |
+	"asctime" |
+	"asin" |
+	"assert" |
+	"atan2" |
+	"atan" |
+	"atexit" |
+	"atof" |
+	"atoi" |
+	"atol" |
+	"bsearch" |
+	"btowc" |
+	"calloc" |
+	"ceil" |
+	"clearerr" |
+	"clock" |
+	"cosh" |
+	"cos" |
+	"ctime" |
+	"difftime" |
+	"div" |
+	"errno" |
+	"exit" |
+	"exp" |
+	"fabs" |
+	"fclose" |
+	"feof" |
+	"ferror" |
+	"fflush" |
+	"fgetc" |
+	"fgetpos" |
+	"fgetwc" |
+	"fgets" |
+	"fgetws" |
+	"floor" |
+	"fmod" |
+	"fopen" |
+	"fprintf" |
+	"fputc" |
+	"fputs" |
+	"fputwc" |
+	"fputws" |
+	"fread" |
+	"free" |
+	"freopen" |
+	"frexp" |
+	"fscanf" |
+	"fseek" |
+	"fsetpos" |
+	"ftell" |
+	"fwprintf" |
+	"fwrite" |
+	"fwscanf" |
+	"getchar" |
+	"getc" |
+	"getenv" |
+	"gets" |
+	"getwc" |
+	"getwchar" |
+	"gmtime" |
+	"isalnum" |
+	"isalpha" |
+	"iscntrl" |
+	"isdigit" |
+	"isgraph" |
+	"islower" |
+	"isprint" |
+	"ispunct" |
+	"isspace" |
+	"isupper" |
+	"isxdigit" |
+	"labs" |
+	"ldexp" |
+	"ldiv" |
+	"localeconv" |
+	"localtime" |
+	"log10" |
+	"log" |
+	"longjmp" |
+	"malloc" |
+	"mblen" |
+	"mbrlen" |
+	"mbrtowc" |
+	"mbsinit" |
+	"mbsrtowcs" |
+	"mbstowcs" |
+	"mbtowc" |
+	"memchr" |
+	"memcmp" |
+	"memcpy" |
+	"memmove" |
+	"memset" |
+	"mktime" |
+	"modf" |
+	"offsetof" |
+	"perror" |
+	"pow" |
+	"printf" |
+	"putchar" |
+	"putc" |
+	"puts" |
+	"putwc" |
+	"putwchar" |
+	"qsort" |
+	"raise" |
+	"rand" |
+	"realloc" |
+	"remove" |
+	"rename" |
+	"rewind" |
+	"scanf" |
+	"setbuf" |
+	"setjmp" |
+	"setlocale" |
+	"setvbuf" |
+	"setvbuf" |
+	"signal" |
+	"sinh" |
+	"sin" |
+	"sprintf" |
+	"sqrt" |
+	"srand" |
+	"sscanf" |
+	"strcat" |
+	"strchr" |
+	"strcmp" |
+	"strcmp" |
+	"strcoll" |
+	"strcpy" |
+	"strcspn" |
+	"strerror" |
+	"strftime" |
+	"strlen" |
+	"strncat" |
+	"strncmp" |
+	"strncpy" |
+	"strpbrk" |
+	"strrchr" |
+	"strspn" |
+	"strstr" |
+	"strtod" |
+	"strtok" |
+	"strtol" |
+	"strtoul" |
+	"strxfrm" |
+	"swprintf" |
+	"swscanf" |
+	"system" |
+	"tanh" |
+	"tan" |
+	"time" |
+	"tmpfile" |
+	"tmpnam" |
+	"tolower" |
+	"toupper" |
+	"ungetc" |
+	"ungetwc" |
+	"va_arg" |
+	"va_end" |
+	"va_start" |
+	"vfprintf" |
+	"vfwprintf" |
+	"vprintf" |
+	"vsprintf" |
+	"vswprintf" |
+	"vwprintf" |
+	"wcrtomb" |
+	"wcscat" |
+	"wcschr" |
+	"wcscmp" |
+	"wcscoll" |
+	"wcscpy" |
+	"wcscspn" |
+	"wcsftime" |
+	"wcslen" |
+	"wcsncat" |
+	"wcsncmp" |
+	"wcsncpy" |
+	"wcspbrk" |
+	"wcsrchr" |
+	"wcsrtombs" |
+	"wcsspn" |
+	"wcsstr" |
+	"wcstod" |
+	"wcstok" |
+	"wcstol" |
+	"wcstombs" |
+	"wcstoul" |
+	"wcsxfrm" |
+	"wctob" |
+	"wctomb" |
+	"wmemchr" |
+	"wmemcmp" |
+	"wmemcpy" |
+	"wmemmove" |
+	"wmemset" |
+	"wprintf" |
+	"wscanf"				{ addToken(Token.FUNCTION); }
+
+	/* Standard-defined macros. */
+	"__DATE__" |
+	"__TIME__" |
+	"__FILE__" |
+	"__LINE__" |
+	"__STDC__"				{ addToken(Token.PREPROCESSOR); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* Preprocessor directives */
+	"#"{WhiteSpace}*{PreprocessorWord}	{ addToken(Token.PREPROCESSOR); }
+
+	/* String/Character Literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{ErrorUnclosedCharLiteral}		{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment Literals. */
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Separators. */
+	"(" |
+	")" |
+	"[" |
+	"]" |
+	"{" |
+	"}"							{ addToken(Token.SEPARATOR); }
+
+	/* Operators. */
+	{Trigraph} |
+	"=" |
+	"+" |
+	"-" |
+	"*" |
+	"/" |
+	"%" |
+	"~" |
+	"<" |
+	">" |
+	"<<" |
+	">>" |
+	"==" |
+	"+=" |
+	"-=" |
+	"*=" |
+	"/=" |
+	"%=" |
+	">>=" |
+	"<<=" |
+	"^" |
+	"&" |
+	"&&" |
+	"|" |
+	"||" |
+	"?" |
+	":" |
+	"," |
+	"!" |
+	"++" |
+	"--" |
+	"." |
+	","							{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	/* Some lines will end in '\' to wrap an expression. */
+	"\\"							{ addToken(Token.IDENTIFIER); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Other punctuation, we'll highlight it as "identifiers." */
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<MLC> {
+
+	[^hwf\n\*]+			{}
+	{URL}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]				{}
+
+	\n					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*					{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java	(revision 25584)
@@ -0,0 +1,2319 @@
+/* The following code was generated by JFlex 1.4.1 on 1/25/09 10:02 PM */
+
+/*
+ * 11/19/2004
+ *
+ * CPlusPlusTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in C++.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A parser for the C++ programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CPlusPlusTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ *
+ */
+
+public class CPlusPlusTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44"+
+    "\1\57\1\60\1\65\1\114\1\33\1\31\1\31\1\51\1\7\1\64"+
+    "\1\37\1\54\1\32\1\47\1\77\1\76\1\41\4\5\2\3\1\70"+
+    "\1\63\1\34\1\30\1\35\1\27\1\61\1\103\1\4\1\111\1\102"+
+    "\1\6\1\55\2\1\1\105\2\1\1\53\1\106\1\107\4\1\1\110"+
+    "\1\104\1\52\2\1\1\42\2\1\1\62\1\40\1\62\1\113\1\2"+
+    "\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66\1\13"+
+    "\1\100\1\72\1\15\1\26\1\14\1\20\1\23\1\101\1\17\1\16"+
+    "\1\67\1\22\1\45\1\71\1\74\1\73\1\75\1\112\1\115\1\112"+
+    "\1\64\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\3\0\1\1\2\2\1\3\1\4\17\2\2\4\1\5"+
+    "\1\4\1\6\4\4\1\2\1\7\1\10\2\2\1\3"+
+    "\1\11\1\4\2\1\4\2\2\4\2\12\1\13\5\12"+
+    "\1\14\2\12\1\2\2\15\2\3\1\16\2\2\1\17"+
+    "\22\2\1\17\56\2\1\0\1\20\1\21\2\22\1\23"+
+    "\1\6\2\10\1\24\11\2\1\15\6\1\1\0\14\2"+
+    "\2\0\1\25\6\0\5\2\1\3\1\0\1\3\1\15"+
+    "\1\16\3\2\1\26\6\2\1\26\23\2\1\27\16\2"+
+    "\1\26\1\2\1\26\55\2\1\6\1\30\1\6\3\22"+
+    "\1\6\2\10\1\31\10\2\1\32\4\1\1\33\4\1"+
+    "\6\0\14\2\10\0\5\2\1\16\1\0\37\2\1\27"+
+    "\44\2\1\26\2\2\1\26\7\2\1\6\1\10\7\2"+
+    "\2\32\7\1\4\0\1\33\4\0\11\2\2\0\1\34"+
+    "\2\0\1\35\43\2\1\17\13\2\1\32\1\33\3\1"+
+    "\7\0\10\2\4\0\22\2\2\1\1\33\3\0\12\2"+
+    "\2\0\1\33\4\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[578];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+    "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u0444\0\u0492"+
+    "\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4\0\u0702"+
+    "\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u08d6\0\u079e\0\u0924"+
+    "\0\352\0\u079e\0\u0972\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa\0\u0af8"+
+    "\0\u079e\0\u0b46\0\u079e\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc"+
+    "\0\u0d1a\0\u0d68\0\u079e\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0eee"+
+    "\0\u079e\0\u0f3c\0\u0f8a\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110"+
+    "\0\u115e\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u12e4\0\u1332\0\u1380"+
+    "\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u1506\0\u1554\0\u15a2\0\u15f0"+
+    "\0\u163e\0\u168c\0\u16da\0\u1728\0\u1776\0\u17c4\0\u0138\0\u1812"+
+    "\0\u1860\0\u18ae\0\u18fc\0\u194a\0\u1998\0\u19e6\0\u1a34\0\u1a82"+
+    "\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08\0\u1c56\0\u1ca4\0\u1cf2"+
+    "\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78\0\u1ec6\0\u1f14\0\u1f62"+
+    "\0\u1fb0\0\u1ffe\0\u204c\0\u209a\0\u20e8\0\u2136\0\u2184\0\u21d2"+
+    "\0\u2220\0\u226e\0\u22bc\0\u230a\0\u2358\0\u23a6\0\u23f4\0\u2442"+
+    "\0\u2490\0\u24de\0\u252c\0\u257a\0\u25c8\0\u2616\0\u079e\0\u079e"+
+    "\0\u2664\0\u26b2\0\u079e\0\u2700\0\u274e\0\u279c\0\u079e\0\u27ea"+
+    "\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c\0\u2a5a"+
+    "\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u2c7c\0\u2cca"+
+    "\0\u2d18\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e\0\u2eec\0\u2f3a"+
+    "\0\u2f88\0\u2fd6\0\u3024\0\u3072\0\u30c0\0\u310e\0\u079e\0\u315c"+
+    "\0\u31aa\0\u31f8\0\u3246\0\u3294\0\u32e2\0\u3330\0\u337e\0\u33cc"+
+    "\0\u341a\0\u3468\0\u34b6\0\u3504\0\u1026\0\u3552\0\u1026\0\u35a0"+
+    "\0\u35ee\0\u363c\0\u0138\0\u368a\0\u36d8\0\u3726\0\u3774\0\u37c2"+
+    "\0\u3810\0\u385e\0\u38ac\0\u38fa\0\u3948\0\u3996\0\u39e4\0\u3a32"+
+    "\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06\0\u3c54\0\u3ca2"+
+    "\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u0138\0\u3e76\0\u3ec4"+
+    "\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6\0\u4134"+
+    "\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356\0\u43a4"+
+    "\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6\0\u4614"+
+    "\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u47e8\0\u4836\0\u4884"+
+    "\0\u48d2\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58\0\u4aa6\0\u4af4"+
+    "\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8\0\u4d16\0\u4d64"+
+    "\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38\0\u4f86\0\u4fd4"+
+    "\0\u5022\0\u5070\0\u50be\0\u510c\0\u515a\0\u079e\0\u51a8\0\u51f6"+
+    "\0\u5244\0\u5292\0\u52e0\0\u532e\0\u537c\0\u079e\0\u53ca\0\u5418"+
+    "\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec\0\u563a\0\u5688"+
+    "\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e\0\u585c\0\u58aa\0\u58f8"+
+    "\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e\0\u5acc\0\u5b1a\0\u5b68"+
+    "\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee\0\u5d3c\0\u5d8a\0\u5dd8"+
+    "\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e\0\u5fac\0\u5ffa\0\u6048"+
+    "\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce\0\u621c\0\u626a\0\u62b8"+
+    "\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e\0\u648c\0\u64da\0\u6528"+
+    "\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae\0\u66fc\0\u674a\0\u6798"+
+    "\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e\0\u696c\0\u69ba\0\u6a08"+
+    "\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e\0\u6bdc\0\u6c2a\0\u6c78"+
+    "\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe\0\u6e4c\0\u6e9a\0\u6ee8"+
+    "\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e\0\u70bc\0\u710a\0\u7158"+
+    "\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de\0\u732c\0\u737a\0\u73c8"+
+    "\0\u7416\0\u7464\0\u74b2\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638"+
+    "\0\u7686\0\u76d4\0\u7722\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8"+
+    "\0\u78f6\0\u7944\0\u7992\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca\0\u7b18"+
+    "\0\u7b66\0\u7bb4\0\u7c02\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a\0\u7d88"+
+    "\0\u7dd6\0\u7e24\0\u7e72\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa\0\u7ff8"+
+    "\0\u8046\0\u8094\0\u80e2\0\u8130\0\u817e\0\u81cc\0\u821a\0\u8268"+
+    "\0\u82b6\0\u8304\0\u8352\0\u83a0\0\u83ee\0\u843c\0\u848a\0\u84d8"+
+    "\0\u8526\0\u8574\0\u85c2\0\u8610\0\u865e\0\u86ac\0\u86fa\0\u8748"+
+    "\0\u8796\0\u87e4\0\u8832\0\u8880\0\u88ce\0\u891c\0\u896a\0\u4356"+
+    "\0\u89b8\0\u8a06\0\u8a54\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda"+
+    "\0\u8c28\0\u8c76\0\u8cc4\0\u8d12\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a"+
+    "\0\u8e98\0\u8ee6\0\u8f34\0\u8f82\0\u8fd0\0\u901e\0\u906c\0\u90ba"+
+    "\0\u9108\0\u9156\0\u91a4\0\u91f2\0\u9240\0\u928e\0\u92dc\0\u932a"+
+    "\0\u9378\0\u93c6\0\u9414\0\u9462\0\u94b0\0\u94fe\0\u954c\0\u959a"+
+    "\0\u95e8\0\u1026\0\352\0\u9636\0\u9684\0\u96d2\0\u9720\0\u976e"+
+    "\0\u97bc\0\u980a\0\u9858\0\u98a6\0\u98f4\0\u9942\0\u9990\0\u99de"+
+    "\0\u9a2c\0\u9a7a\0\u9ac8\0\u9b16\0\u9b64\0\u9bb2\0\u86fa\0\u9c00"+
+    "\0\u87e4\0\u9c4e\0\u9c9c\0\u9cea\0\u9d38\0\u9d86\0\u9dd4\0\u9e22"+
+    "\0\u9e70\0\u9ebe\0\u9f0c\0\u9f5a\0\u9fa8\0\u9ff6\0\ua044\0\ua092"+
+    "\0\ua0e0\0\ua12e\0\ua17c\0\ua1ca\0\ua218\0\u079e\0\ua266\0\ua2b4"+
+    "\0\ua302\0\ua350\0\ua39e\0\ua3ec\0\u928e\0\ua43a\0\ua488\0\ua4d6"+
+    "\0\ua524\0\ua572\0\ua5c0\0\ua60e\0\ua65c\0\u0138\0\ua6aa\0\ua6f8"+
+    "\0\ua746\0\ua794";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[578];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\4\1\5\1\6\1\7\1\5\1\7\1\5\1\10"+
+    "\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20"+
+    "\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30"+
+    "\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40"+
+    "\1\41\1\7\1\5\1\42\1\43\1\44\1\45\1\46"+
+    "\1\47\1\31\2\5\1\50\1\5\1\51\1\52\2\4"+
+    "\1\32\1\53\1\37\1\31\1\5\1\54\1\37\1\55"+
+    "\4\5\2\7\1\5\1\56\10\5\1\32\1\37\1\57"+
+    "\1\60\12\61\1\62\30\61\1\63\5\61\1\64\14\61"+
+    "\1\65\2\61\1\66\24\61\12\67\1\70\30\67\1\71"+
+    "\22\67\1\72\2\67\1\73\24\67\7\4\1\0\17\4"+
+    "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+    "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\74"+
+    "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\75\1\7\1\75"+
+    "\1\7\1\76\1\0\1\75\1\76\3\75\1\77\4\75"+
+    "\1\100\4\75\11\0\1\75\1\7\1\75\2\0\2\75"+
+    "\1\7\2\0\1\100\1\77\1\101\1\75\1\0\3\75"+
+    "\4\0\2\75\1\0\5\75\2\7\12\75\13\0\1\37"+
+    "\20\0\1\37\65\0\1\4\6\5\1\0\1\5\1\102"+
+    "\1\5\1\103\4\5\1\104\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\2\5\1\105\16\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\106\1\107\1\5"+
+    "\1\110\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\3\5\1\111\15\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\112\1\113\2\5\1\114\1\115\1\116"+
+    "\1\117\1\120\1\5\1\121\1\122\1\123\1\124\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\125\1\0"+
+    "\1\126\20\5\4\0\1\4\6\5\1\0\2\5\1\127"+
+    "\1\5\1\130\1\5\1\131\10\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\132\12\5\1\133\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\134\7\5\1\135\3\5"+
+    "\1\136\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\137\1\5\1\140\2\5\1\141\1\142\1\5\1\143"+
+    "\1\5\1\144\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\145\1\146\1\0\1\147\1\5\1\150\5\5"+
+    "\1\151\10\5\4\0\1\4\6\5\1\0\1\5\1\152"+
+    "\12\5\1\153\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\2\5\1\154\10\5\1\155\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\156\3\5\1\157\2\5\1\160"+
+    "\3\5\1\161\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\162\1\163\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\164\1\5\1\165\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\166\5\5\1\167\1\170"+
+    "\1\5\1\171\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\172\2\5\1\173\1\174\4\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\175\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\176"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\177"+
+    "\6\5\1\174\5\5\1\200\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\201\6\5\1\202\1\5\1\203\1\5"+
+    "\1\204\2\5\11\0\1\4\2\5\2\0\1\5\1\205"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\5\1\200\17\5\33\0"+
+    "\1\206\116\0\1\37\233\0\1\37\1\0\1\207\16\0"+
+    "\1\210\44\0\27\211\1\212\3\211\1\213\4\211\1\214"+
+    "\2\211\1\0\52\211\34\0\1\31\116\0\1\31\110\0"+
+    "\1\37\6\0\1\37\56\0\40\43\1\215\2\43\1\216"+
+    "\1\217\51\43\1\4\6\5\1\0\2\5\1\220\1\221"+
+    "\2\5\1\220\1\5\1\222\2\5\1\144\1\223\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\224\20\5\4\0\1\4\6\5\1\0\6\5\1\225"+
+    "\1\226\1\227\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\230\1\0\21\5\4\0\3\75\1\7"+
+    "\1\75\1\7\1\76\1\0\1\75\1\76\3\75\1\77"+
+    "\4\75\1\100\4\75\11\0\1\75\1\7\1\231\2\0"+
+    "\2\75\1\7\2\0\1\100\1\77\1\101\1\75\1\0"+
+    "\3\75\4\0\2\75\1\0\3\75\1\231\1\75\2\7"+
+    "\12\75\54\0\1\47\50\0\1\101\1\0\1\101\33\0"+
+    "\1\101\5\0\1\101\26\0\2\101\16\0\7\4\1\0"+
+    "\1\232\1\233\1\4\1\234\1\4\1\235\4\4\1\236"+
+    "\1\237\3\4\11\0\3\4\2\0\3\4\1\240\1\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\1\4\6\5\1\0\1\5\1\241\1\5"+
+    "\1\242\3\5\1\243\1\244\3\5\1\245\1\5\1\246"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\247\1\5"+
+    "\1\0\2\5\1\250\16\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\141\2\5\1\251\1\5\1\144\2\5\1\252"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\253\1\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\254"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\120\0\1\37\116\0\1\37\12\61\1\0"+
+    "\30\61\1\0\5\61\1\0\14\61\1\0\2\61\1\0"+
+    "\24\61\13\0\1\255\53\0\1\256\60\0\1\257\152\0"+
+    "\1\260\117\0\1\261\24\0\12\67\1\0\30\67\1\0"+
+    "\22\67\1\0\2\67\1\0\24\67\13\0\1\262\53\0"+
+    "\1\263\115\0\1\264\117\0\1\265\24\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\1\5\1\266\1\0\1\267\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\11\5\1\270\1\5\1\271\3\5"+
+    "\1\272\1\5\4\0\7\75\1\0\17\75\11\0\3\75"+
+    "\2\0\3\75\2\0\2\75\1\0\1\75\1\0\3\75"+
+    "\4\0\2\75\1\0\21\75\4\0\3\75\1\273\1\75"+
+    "\1\273\1\75\1\274\17\75\10\0\1\274\1\75\1\273"+
+    "\1\75\2\0\2\75\1\273\2\0\2\75\1\0\1\75"+
+    "\1\0\3\75\4\0\2\75\1\0\5\75\2\273\12\75"+
+    "\4\0\7\75\1\0\12\75\1\275\4\75\11\0\3\75"+
+    "\2\0\3\75\2\0\1\275\1\75\1\0\1\75\1\0"+
+    "\3\75\4\0\2\75\1\0\21\75\4\0\7\75\1\0"+
+    "\5\75\1\275\11\75\11\0\3\75\2\0\3\75\2\0"+
+    "\1\75\1\275\1\0\1\75\1\0\3\75\4\0\2\75"+
+    "\1\0\21\75\4\0\3\75\1\101\1\75\1\101\1\276"+
+    "\1\0\1\75\1\276\1\277\2\75\1\277\11\75\11\0"+
+    "\1\75\1\101\1\75\2\0\2\75\1\101\2\0\1\75"+
+    "\1\277\1\0\1\277\1\0\3\75\4\0\2\75\1\0"+
+    "\5\75\2\101\12\75\4\0\1\4\6\5\1\0\2\5"+
+    "\1\300\2\5\1\301\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\2\5\1\302\14\5\11\0\1\4\2\5\2\0"+
+    "\1\303\2\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\12\5\1\304\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\305\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\12\5\1\306\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\307\10\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\7\5\1\310\7\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\311\7\5\1\312\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\313\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\314\1\315"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\316"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\317"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\320"+
+    "\7\5\1\143\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\321\1\5\1\322\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\7\5\1\127\3\5\1\323\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\324\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\325\2\5\1\326"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\327"+
+    "\11\5\11\0\1\4\2\5\2\0\1\5\1\330\1\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\331\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\332\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\333\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\141\1\334\3\5\1\144\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\335\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\336\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\337\4\5\1\340\1\341"+
+    "\2\5\1\342\1\343\1\344\1\345\1\346\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\3\5"+
+    "\1\347\15\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\127"+
+    "\20\5\4\0\1\4\6\5\1\0\16\5\1\350\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\351\1\5\1\352"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\353"+
+    "\4\5\1\354\3\5\1\355\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\5"+
+    "\1\330\1\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\356\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\357\10\5\1\360\1\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\4\5\1\361"+
+    "\14\5\4\0\1\4\6\5\1\0\11\5\1\143\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\362\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\363\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\325\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\10\5\1\364\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\365\4\5"+
+    "\1\366\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\367\2\5\1\141\4\5\1\144\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\370\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\311\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\371\1\372\7\5\1\204"+
+    "\1\373\1\374\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\375\1\0\1\376\20\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\377\1\332\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\2\5\1\u0100\14\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u0101\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\u0102\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u0103\6\5\1\u0104\3\5\1\u0105"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\u0106"+
+    "\1\5\1\357\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\5\5\1\u0107\1\307\10\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0108\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\14\5\1\u0109\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\242\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\u010a\2\5\1\u010b\6\5\1\u010c"+
+    "\1\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u010d"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\314"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u010e"+
+    "\4\5\1\u010f\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\1\303\20\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\1\5\1\u0110\1\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0111\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u0112\2\5\1\u0113\2\5\1\200\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\330\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u0114\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\303\1\5\1\151\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0115\6\5"+
+    "\1\u0116\3\5\1\u0117\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0118\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\163\1\0\21\5\4\0\1\4\6\5\1\0\16\5"+
+    "\1\u0119\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\315\16\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u011a\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\u0107\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\323\1\u011b\1\u011c"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\230\1\0\21\5\34\0\10\37\56\0\33\u011d\1\u011e"+
+    "\7\u011d\1\0\101\u011d\1\u011f\3\u011d\1\u011e\7\u011d\1\0"+
+    "\57\u011d\1\u0120\4\u011d\1\211\1\u011d\1\211\2\u011d\1\211"+
+    "\4\u011d\1\211\2\u011d\1\211\3\u011d\1\u0121\4\u011d\1\211"+
+    "\1\u0122\1\u0123\1\0\3\211\1\u0122\17\u011d\1\211\4\u011d"+
+    "\1\u0123\1\u011d\2\u0122\16\u011d\5\216\1\43\4\216\1\43"+
+    "\1\216\1\43\2\216\1\43\4\216\1\43\2\216\1\43"+
+    "\3\216\1\43\4\216\2\43\1\u0124\1\0\4\43\17\216"+
+    "\1\43\4\216\1\u0124\1\216\2\43\56\216\1\u0125\3\216"+
+    "\1\u0126\51\216\1\4\6\5\1\0\13\5\1\144\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\224\20\5\4\0\1\4\6\5\1\0\7\5\1\u0127"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u0128"+
+    "\1\5\1\u0129\11\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\u012a"+
+    "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\13\5\1\144\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u012b\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u012c\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u012d\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u012e\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\75\4\u012f\1\0"+
+    "\3\u012f\6\75\1\u012f\2\75\1\u012f\2\75\11\0\1\75"+
+    "\1\u012f\1\75\2\0\1\75\2\u012f\2\0\2\75\1\0"+
+    "\1\u012f\1\0\3\75\4\0\2\75\1\0\5\75\2\u012f"+
+    "\2\75\2\u012f\5\75\1\u012f\4\0\7\4\1\0\1\4"+
+    "\1\u0130\15\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\4\4\1\u0131\1\u0132\1\4\1\u0133"+
+    "\7\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\2\4\1\u0134\1\4\1\u0135\12\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\3\4\1\u0136\13\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\4\4\1\u0137\12\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\7\4\1\u0138\7\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\14\0\1\u0139\1\u013a\1\0\1\u013b\1\0\1\u013c"+
+    "\4\0\1\u013d\1\u013e\24\0\1\240\45\0\1\4\6\5"+
+    "\1\0\16\5\1\u013f\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\16\5\1\u0140\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\12\5"+
+    "\1\u0141\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\2\5\1\127\16\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\340\4\5\1\343\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\4\5\1\357\12\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\u0142\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u0143\3\5\1\u0144\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0145\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u0146\1\u0147"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u0148"+
+    "\1\u0149\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\201\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u014a\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\151\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\21\0\1\u014b\123\0\1\u014c\161\0"+
+    "\1\u014d\117\0\1\u014e\41\0\1\u014f\123\0\1\u0150\161\0"+
+    "\1\u0151\117\0\1\u0152\24\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0153\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0154\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\12\5\1\u0155\6\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0156\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\13\5\1\u0157\5\5\4\0\3\75\1\273\1\75\1\273"+
+    "\1\75\1\0\5\75\1\77\4\75\1\100\4\75\11\0"+
+    "\1\75\1\273\1\75\2\0\2\75\1\273\2\0\1\100"+
+    "\1\77\1\0\1\75\1\0\3\75\4\0\2\75\1\0"+
+    "\5\75\2\273\12\75\7\0\1\273\1\0\1\273\33\0"+
+    "\1\273\5\0\1\273\26\0\2\273\16\0\3\75\1\u0158"+
+    "\1\75\1\u0158\1\75\1\u0159\17\75\10\0\1\u0159\1\75"+
+    "\1\u0158\1\75\2\0\2\75\1\u0158\2\0\2\75\1\0"+
+    "\1\75\1\0\3\75\4\0\2\75\1\0\5\75\2\u0158"+
+    "\12\75\4\0\1\4\6\5\1\0\14\5\1\u015a\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u015b\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\2\5\1\200\14\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\u015c\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\u015d\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\16\5\1\127\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\127\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u015e\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\303\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u015f\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u0160\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u0161\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\2\5\1\303\14\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\12\5\1\u0162\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u0163\3\5\1\u0164\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0165\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0166"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\303"+
+    "\6\5\1\u0167\3\5\1\332\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\3\5\1\u0168\15\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0169\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0112\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\377\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u016a\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u016b\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\u0141\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\303\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u016c\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\303\16\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u0102\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u016d\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u016e\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u016f\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u0170\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u0171\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u0172\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u0173\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\u0174\2\5\1\u0175\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u0176\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u0177\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\337\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u0178\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\3\5\1\u0168\15\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\303"+
+    "\2\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\15\5\1\u0179\1\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u017a\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\6\5\1\u017b\12\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u017c\11\5\11\0\1\4\2\5\2\0"+
+    "\1\u017d\1\u017e\1\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\7\5\1\u017f"+
+    "\11\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\303\1\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u0180\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0181\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\332\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\315\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u0164\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\166\1\200\1\5"+
+    "\1\u0182\1\323\1\u0183\1\u0184\1\5\1\u0185\1\u0186\1\u0187"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0188\1\0\3\5\1\u0189\15\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u018a\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0108\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u018b"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\u018c"+
+    "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\242"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u018d"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u018e"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\12\5\1\u0160"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\362"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0140"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u018f"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\u0190"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\303"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0191"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u0165"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0143"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0192"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0193\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\u0194\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u0195\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\336\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\u0196\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u0197\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0198\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u0199\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u019a\12\5\11\0\1\4\2\5\2\0\1\u019b\2\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u019c\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\u019d\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\303\2\5\1\u019e\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u019f\20\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\303\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\151\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\127\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\3\5\1\u01a0\15\5\4\0\1\4"+
+    "\6\5\1\0\2\5\2\303\1\5\1\303\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01a1\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01a2\4\5\1\303"+
+    "\2\5\1\u019e\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\u019f\20\5\4\0\1\4\6\5"+
+    "\1\0\6\5\1\u01a3\2\5\1\u01a4\4\5\1\374\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u01a5\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u01a6\3\5\1\u01a7"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\323\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\230\1\0\21\5\4\0\33\u011d\1\213\7\u011d"+
+    "\1\0\102\u011d\3\211\1\u0121\4\211\3\u011d\1\0\57\u011d"+
+    "\1\211\25\u011d\1\u011e\5\u011d\1\211\1\u011d\1\0\3\u011d"+
+    "\1\211\26\u011d\2\211\16\u011d\33\0\1\u011e\62\0\5\u011d"+
+    "\1\u0120\25\u011d\1\u011e\5\u011d\1\u0120\1\u011d\1\0\3\u011d"+
+    "\1\u0120\26\u011d\2\u0120\21\u011d\4\u01a9\1\u011d\3\u01a9\6\u011d"+
+    "\1\u01a9\2\u011d\1\u01a9\6\u011d\1\213\5\u011d\1\u01a9\1\u011d"+
+    "\1\0\2\u011d\2\u01a9\5\u011d\1\u01a9\20\u011d\2\u01a9\2\u011d"+
+    "\2\u01a9\5\u011d\1\u01a9\4\u011d\3\216\4\u01aa\1\216\3\u01aa"+
+    "\6\216\1\u01aa\2\216\1\u01aa\13\216\1\u0125\1\u01aa\2\216"+
+    "\1\u0126\1\216\2\u01aa\5\216\1\u01aa\20\216\2\u01aa\2\216"+
+    "\2\u01aa\5\216\1\u01aa\47\216\1\0\52\216\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01ab\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\336\16\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\u01ac\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\362\4\5\1\u01ad\5\5\1\u01ae\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01af\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01b0\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\336\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u01b1\20\5\4\0\3\75"+
+    "\4\u012f\1\0\3\u012f\2\75\1\u01b2\3\75\1\u012f\1\u01b3"+
+    "\1\75\1\u012f\2\75\11\0\1\75\1\u012f\1\75\2\0"+
+    "\1\75\2\u012f\2\0\1\u01b3\1\u01b2\1\0\1\u012f\1\0"+
+    "\3\75\4\0\2\75\1\0\5\75\2\u012f\2\75\2\u012f"+
+    "\5\75\1\u012f\4\0\7\4\1\0\2\4\1\235\14\4"+
+    "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+    "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\7\4"+
+    "\1\0\1\u01b4\16\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\3\4\1\u01b5\2\4\1\u01b6"+
+    "\10\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\7\4\1\u01b7\7\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\1\u01b8\3\4"+
+    "\1\u0137\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\11\4\1\u01b9\5\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\4\4"+
+    "\1\u01b6\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\1\u01b8\16\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\14\4\1\u01ba"+
+    "\2\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\15\0"+
+    "\1\u01bb\120\0\1\u01bc\1\u01bd\1\0\1\u01be\110\0\1\u01bf"+
+    "\1\0\1\u01c0\114\0\1\u01c1\116\0\1\u01c2\120\0\1\u01c3"+
+    "\76\0\1\4\6\5\1\0\13\5\1\u01c4\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\303\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\336\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\u01c5\1\5\1\u01c6"+
+    "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\127"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\132"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01c7"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\2\5\1\200"+
+    "\1\5\1\u0182\1\323\1\u0183\1\u01c8\1\5\1\u0185\1\5"+
+    "\1\u0187\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01c9\1\0\3\5\1\u0189\15\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u01ca\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u01cb\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u01cc\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\307\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\15\0\1\u014c\174\0"+
+    "\1\u01cd\50\0\1\u01ce\146\0\1\u01cf\52\0\1\u0150\174\0"+
+    "\1\u01d0\50\0\1\u01d1\146\0\1\u01d2\41\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\16\5\1\u01d3\2\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\1\5\1\u01d3\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\13\5\1\u01d3\5\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\15\5\1\u01d3\3\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\11\5\1\u01d4\7\5\4\0\3\75\1\u0158\1\75"+
+    "\1\u0158\1\75\1\0\2\75\1\277\2\75\1\277\11\75"+
+    "\11\0\1\75\1\u0158\1\75\2\0\2\75\1\u0158\2\0"+
+    "\1\75\1\277\1\0\1\277\1\0\3\75\4\0\2\75"+
+    "\1\0\5\75\2\u0158\12\75\7\0\1\u0158\1\0\1\u0158"+
+    "\33\0\1\u0158\5\0\1\u0158\26\0\2\u0158\16\0\1\4"+
+    "\6\5\1\0\12\5\1\u01d5\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\307\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u0141\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\u01d6\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\303\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u01d7\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\u0196\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u0163\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\u01d8\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\303\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\336\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\5\1\303\17\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\173\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\323\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\303\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u01d9\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u019a\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\303\2\5\1\303\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u01da\20\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\303\2\5\1\303\1\5\1\173"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\1\u01da\20\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0140"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\307"+
+    "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\15\5\1\u01a0"+
+    "\1\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u01db"+
+    "\20\5\4\0\1\4\6\5\1\0\14\5\1\u01dc\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u01dd\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\13\5\1\u01db\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u01de\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01df\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01e0\6\5\1\u01e1"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u01e2"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u01e3"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\7\5"+
+    "\1\u017f\11\5\4\0\1\4\6\5\1\0\5\5\1\u01e4"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\2\5\1\303\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\10\5\1\u01e5\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\u017e\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\12\5\1\315\4\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\16\5\1\u0168\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0128\12\5\1\u0102"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u01e6"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u01e7"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\13\5\1\u0112"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0163\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u01e8\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\u01e9\1\5\1\333\2\5\1\u01ea\1\311\1\5\1\u0168"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\u0163\1\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u01eb"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\1\5\1\u01ec\1\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u01ed"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\2\5\1\u01ee"+
+    "\14\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u01ef"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01f0"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u01f1\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01f2\10\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\u0140\2\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01f3\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u01f4\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u01f5\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u01f6\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u01f7\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u01b1\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\127\1\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\127\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\15\5\1\u01f8\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u01f9\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\15\5\1\127\1\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\315\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\14\5\1\u015b\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u01fa\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u01fb\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u01fc"+
+    "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u019e\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\311\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\5\5\1\303\13\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\352\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\311\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\u01ea\2\5\1\u0168\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\u0163\1\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\u014a"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u01a0\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u01fd\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\u011d\4\211\1\u011d"+
+    "\3\211\6\u011d\1\211\2\u011d\1\211\6\u011d\1\213\5\u011d"+
+    "\1\211\1\u011d\1\0\2\u011d\2\211\5\u011d\1\211\20\u011d"+
+    "\2\211\2\u011d\2\211\5\u011d\1\211\4\u011d\3\216\4\43"+
+    "\1\216\3\43\6\216\1\43\2\216\1\43\13\216\1\u0125"+
+    "\1\43\2\216\1\u0126\1\216\2\43\5\216\1\43\20\216"+
+    "\2\43\2\216\2\43\5\216\1\43\4\216\1\4\6\5"+
+    "\1\0\12\5\1\u01fe\4\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\253\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u01ff\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0200\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0201\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\5\1\127\17\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\303\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\7\75\1\0\12\75\1\u0202"+
+    "\4\75\11\0\3\75\2\0\3\75\2\0\1\u0202\1\75"+
+    "\1\0\1\75\1\0\3\75\4\0\2\75\1\0\21\75"+
+    "\4\0\7\75\1\0\5\75\1\u0202\11\75\11\0\3\75"+
+    "\2\0\3\75\2\0\1\75\1\u0202\1\0\1\75\1\0"+
+    "\3\75\4\0\2\75\1\0\21\75\4\0\7\4\1\0"+
+    "\3\4\1\u01b5\13\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\2\4\1\u0203\14\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u0203\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\10\4\1\u0204\6\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u01b5\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\5\4\1\u0205\11\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\15\4\1\u0206\1\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\16\0\1\u013c\113\0\1\u0207\120\0\1\u0208\2\0"+
+    "\1\u0209\116\0\1\u020a\106\0\1\u020b\3\0\1\u01c2\122\0"+
+    "\1\u020c\110\0\1\u0209\111\0\1\u020b\131\0\1\u020d\71\0"+
+    "\1\4\6\5\1\0\5\5\1\u019b\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u020e\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01f0\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\u020f\2\5\1\u01d9\1\u0210\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01e8\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0211"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0212"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0213"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\u0214"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\16\5\1\u0215"+
+    "\11\0\1\4\2\5\2\0\1\5\1\303\1\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\36\0\1\u0216\101\0\1\u014c\51\0"+
+    "\1\u01cd\26\0\1\u01cf\1\u0217\4\u01cf\1\u0217\17\u01cf\3\u0217"+
+    "\1\u01cf\1\u0217\2\0\2\u0217\1\0\2\u01cf\2\0\3\u01cf"+
+    "\1\0\1\u0217\2\u01cf\1\u0217\1\u01cf\1\0\1\u0217\1\u01cf"+
+    "\5\u0217\2\u01cf\1\u0217\21\u01cf\2\0\1\u0217\33\0\1\u0218"+
+    "\101\0\1\u0150\51\0\1\u01d0\26\0\1\u01d2\1\u0219\4\u01d2"+
+    "\1\u0219\17\u01d2\3\u0219\1\u01d2\1\u0219\2\0\2\u0219\1\0"+
+    "\2\u01d2\2\0\3\u01d2\1\0\1\u0219\2\u01d2\1\u0219\1\u01d2"+
+    "\1\0\1\u0219\1\u01d2\5\u0219\2\u01d2\1\u0219\21\u01d2\2\0"+
+    "\1\u0219\1\0\1\4\5\5\1\u021a\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\20\5\1\u021a\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u01eb\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\u021b\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\11\5\1\u021c\5\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\127\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\303\2\5\1\303\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0163\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u0140\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u0102\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\311\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\311\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\12\5\1\u01f0\4\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\u021d\1\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\u01d8\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\u021e\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u021f\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\163\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u0220\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\127\14\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\13\5\1\u01ea\1\311\1\5"+
+    "\1\u0168\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\u0163\1\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0112\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\2\5\1\303"+
+    "\16\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\127\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\u0165\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\303\4\5\1\303\4\5"+
+    "\1\u0102\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\1\5\1\303\17\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\u01f0\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\11\5\1\u01f6\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\303\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u0221\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0222\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0223"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u0224\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0225\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\1\5\1\u0226\4\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\u0227\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\u0228\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\303\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\u01b1\20\5\4\0\1\4\6\5\1\0\11\5\1\u0229"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\127"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0163"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u022a"+
+    "\20\5\4\0\1\4\6\5\1\0\14\5\1\u022b\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\151\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\15\5\1\303\1\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01d8\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\7\4\1\0\7\4\1\u0203\7\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\12\4\1\u022c\4\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\16\4\1\u022d\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\17\0\1\u0208\114\0\1\u022e"+
+    "\114\0\1\u022e\124\0\1\u022f\106\0\1\u0208\121\0\1\u0230"+
+    "\125\0\1\u0231\70\0\1\4\6\5\1\0\5\5\1\u0140"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01e6"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0232"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0233"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\303\4\5"+
+    "\1\303\4\5\1\u0102\3\5\1\136\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\5\1\303\17\5"+
+    "\4\0\1\4\6\5\1\0\16\5\1\u0215\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\1\5\1\u0164\4\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\1\5\1\303\1\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\36\0"+
+    "\1\u01cf\115\0\1\u01d2\63\0\1\4\1\5\1\u0234\4\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u0235\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u01eb\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\303\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\u0236\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u0237\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\u020e\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0238\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0239\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\315\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\u0239\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u0163\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u023a\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\12\5"+
+    "\1\307\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0128\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u023b"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\330"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\127"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\7\4\1\0\1\u01b6\16\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\14\4\1\u0203\2\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\23\0\1\u022e\120\0\1\u023c\121\0\1\u023d\67\0"+
+    "\1\4\6\5\1\0\16\5\1\307\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\16\5\1\136\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\1\5"+
+    "\1\u023e\4\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\11\5\1\307\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u01a2\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u023f\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\127\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u0240\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\u01d9\15\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\14\0\1\u0209\131\0"+
+    "\1\u022e\71\0\1\4\6\5\1\0\7\5\1\u0241\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01eb\10\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0242\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u0235\1\0\21\5"+
+    "\4\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[42978];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\3\0\26\1\1\11\4\1\1\11\2\1\1\11\6\1"+
+    "\1\11\1\1\1\11\7\1\1\11\5\1\1\11\114\1"+
+    "\1\0\2\11\2\1\1\11\3\1\1\11\20\1\1\0"+
+    "\14\1\2\0\1\11\6\0\6\1\1\0\141\1\1\11"+
+    "\7\1\1\11\22\1\6\0\14\1\10\0\6\1\1\0"+
+    "\141\1\4\0\1\1\4\0\11\1\2\0\1\1\2\0"+
+    "\65\1\7\0\10\1\4\0\24\1\1\11\3\0\12\1"+
+    "\2\0\5\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[578];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CPlusPlusTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public CPlusPlusTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public CPlusPlusTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 184) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 27: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 30: break;
+        case 7: 
+          { addNullToken(); return firstToken;
+          }
+        case 31: break;
+        case 24: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 32: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 33: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 34: break;
+        case 9: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 35: break;
+        case 26: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 36: break;
+        case 18: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 37: break;
+        case 25: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 38: break;
+        case 14: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 39: break;
+        case 15: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 40: break;
+        case 5: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 41: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 42: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 43: break;
+        case 16: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 44: break;
+        case 22: 
+          { addToken(Token.FUNCTION);
+          }
+        case 45: break;
+        case 6: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 46: break;
+        case 8: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 23: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 48: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 49: break;
+        case 19: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 50: break;
+        case 20: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 51: break;
+        case 29: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 52: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 53: break;
+        case 13: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 54: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 55: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 56: break;
+        case 10: 
+          { 
+          }
+        case 57: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 58: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 579: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 580: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 581: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex	(revision 25584)
@@ -0,0 +1,414 @@
+/*
+ * 09/03/2005
+ *
+ * CSSTokenMaker.java - Token maker for CSS 3 files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a CSS 3 file.  It's
+ * written with a few extra internal states so that it can easily be copy
+ * and pasted into HTML, PHP, and JSP TokenMakres when it is updated.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSSTokenMaker.java</code> file will contain 2
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class CSSTokenMaker
+%extends AbstractJFlexTokenMaker
+%implements TokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	public static final int INTERNAL_CSS_PROPERTY			= -1;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	public static final int INTERNAL_CSS_VALUE				= -2;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSSTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns <code>true</code> since CSS uses curly braces.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		cssPrevState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = CSS_STRING;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CSS_CHAR_LITERAL;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = CSS_C_STYLE_COMMENT;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							break;
+					}
+					cssPrevState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Digit						= ([0-9])
+Letter						= ([A-Za-z])
+LetterOrUnderscore			= ({Letter}|[_])
+LetterOrUnderscoreOrDash	= ({LetterOrUnderscore}|[\-])
+
+CSS_SelectorPiece			= (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass				= (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword				= ("@"{CSS_SelectorPiece})
+CSS_Id						= ("#"{CSS_SelectorPiece})
+CSS_Separator				= ([;\(\)\[\]])
+WhiteSpace					= ([ \t]+)
+MlcStart					= ("/*")
+MlcEnd						= ("*/")
+
+CSS_Property				= ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar				= ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value					= ({CSS_ValueChar}*)
+CSS_Function				= ({CSS_Value}\()
+CSS_Digits					= ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex						= ("#"[0-9a-fA-F]+)
+CSS_Number					= ({CSS_Digits}|{CSS_Hex})
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+	{CSS_SelectorPiece}	{ addToken(Token.DATA_TYPE); }
+	{CSS_PseudoClass}	{ addToken(Token.RESERVED_WORD); }
+	":"					{ /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+	{CSS_AtKeyword}		{ addToken(Token.REGEX); }
+	{CSS_Id}			{ addToken(Token.VARIABLE); }
+	"{"					{ addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+	[,]					{ addToken(Token.IDENTIFIER); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	[+>~\^$\|=]			{ addToken(Token.OPERATOR); }
+	{CSS_Separator}		{ addToken(Token.SEPARATOR); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE); }
+	{MlcStart}			{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("yyinitial: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addNullToken(); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+	{CSS_Property}		{ addToken(Token.RESERVED_WORD); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
+	":"					{ addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE); }
+	{MlcStart}			{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+	{CSS_Value}			{ addToken(Token.IDENTIFIER); }
+	"!important"		{ addToken(Token.ANNOTATION); }
+	{CSS_Function}		{ int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+						}
+	{CSS_Number}		{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	\"					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+	\'					{ start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+	")"					{ /* End of a function */ addToken(Token.SEPARATOR); }
+	[;]					{ addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+	[,\.]				{ addToken(Token.IDENTIFIER); }
+	"}"					{ addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE); }
+	{MlcStart}			{ start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+	.					{ /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+	"\n" |
+	<<EOF>>				{ addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+	[^\n\\\"]+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\"					{ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?				{ /* Skip escaped chars. */ }
+	\'					{ addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+	[^hwf\n\*]+			{}
+	{URL}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]				{}
+	{MlcEnd}			{ addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+	\*					{}
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java	(revision 25584)
@@ -0,0 +1,976 @@
+/* The following code was generated by JFlex 1.4.1 on 2/12/12 12:51 AM */
+
+/*
+ * 09/03/2005
+ *
+ * CSSTokenMaker.java - Token maker for CSS 3 files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a CSS 3 file.  It's
+ * written with a few extra internal states so that it can easily be copy
+ * and pasted into HTML, PHP, and JSP TokenMakres when it is updated.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSSTokenMaker.java</code> file will contain 2
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class CSSTokenMaker extends AbstractJFlexTokenMaker implements TokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int CSS_C_STYLE_COMMENT = 5;
+  public static final int YYINITIAL = 0;
+  public static final int CSS_STRING = 3;
+  public static final int CSS_VALUE = 2;
+  public static final int CSS_PROPERTY = 1;
+  public static final int CSS_CHAR_LITERAL = 4;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\40\1\61\25\0\1\40\1\63\1\56\1\36\1\52\1\45"+
+    "\1\47\1\57\1\43\1\64\1\5\1\51\1\55\1\4\1\6\1\41"+
+    "\12\1\1\7\1\37\1\0\1\51\1\60\1\47\1\35\6\46\24\2"+
+    "\1\50\1\42\1\50\1\60\1\3\1\0\1\21\1\34\1\15\1\20"+
+    "\1\26\1\23\1\33\1\14\1\16\1\2\1\30\1\17\1\27\1\13"+
+    "\1\11\1\25\1\2\1\10\1\22\1\12\1\32\1\31\1\53\1\44"+
+    "\1\24\1\2\1\54\1\60\1\62\1\51\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\2\0\1\1\3\0\1\2\1\3\1\4\2\2\1\5"+
+    "\1\6\1\2\1\7\1\10\1\1\1\11\1\12\1\13"+
+    "\1\14\1\15\1\14\1\16\1\14\1\17\1\20\1\21"+
+    "\1\22\2\1\1\21\1\23\1\1\1\24\1\25\1\21"+
+    "\1\26\1\27\1\30\1\31\1\32\1\27\1\33\1\34"+
+    "\5\27\1\35\15\0\1\36\1\37\1\40\2\0\1\22"+
+    "\3\0\1\22\1\0\1\30\1\41\41\0\1\15\17\0"+
+    "\1\42\47\0\1\43";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[167];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\65\0\152\0\237\0\324\0\u0109\0\u013e\0\u0173"+
+    "\0\u01a8\0\u01dd\0\u0212\0\u013e\0\u0247\0\u027c\0\u013e\0\u013e"+
+    "\0\u013e\0\u013e\0\u013e\0\u013e\0\u013e\0\u02b1\0\u02e6\0\u013e"+
+    "\0\u027c\0\u013e\0\u013e\0\u013e\0\u031b\0\u0350\0\u0385\0\u03ba"+
+    "\0\u013e\0\u03ef\0\u013e\0\u013e\0\u0424\0\u013e\0\u0459\0\u048e"+
+    "\0\u013e\0\u013e\0\u04c3\0\u013e\0\u013e\0\u04f8\0\u052d\0\u0562"+
+    "\0\u0597\0\u05cc\0\u013e\0\u0601\0\u0636\0\u066b\0\u06a0\0\u06d5"+
+    "\0\u070a\0\u073f\0\u0774\0\u07a9\0\u07de\0\u0813\0\u0848\0\u087d"+
+    "\0\u08b2\0\u08e7\0\u013e\0\u091c\0\u0951\0\u013e\0\u0986\0\u09bb"+
+    "\0\u09f0\0\u03ba\0\u0a25\0\u013e\0\u013e\0\u0a5a\0\u0a8f\0\u0ac4"+
+    "\0\u0af9\0\u0b2e\0\u0b63\0\u0b98\0\u0bcd\0\u0c02\0\u0c37\0\u0c6c"+
+    "\0\u0ca1\0\u0cd6\0\u0d0b\0\u0d40\0\u0d75\0\u0daa\0\u0ddf\0\u0e14"+
+    "\0\u0e49\0\u0e7e\0\u0eb3\0\u0ee8\0\u0f1d\0\u0f52\0\u0f87\0\u0fbc"+
+    "\0\u0ff1\0\u1026\0\u105b\0\u1090\0\u10c5\0\u10fa\0\u013e\0\u112f"+
+    "\0\u1164\0\u1199\0\u11ce\0\u1203\0\u1238\0\u126d\0\u12a2\0\u12d7"+
+    "\0\u130c\0\u1341\0\u1376\0\u13ab\0\u13e0\0\u1415\0\u144a\0\u147f"+
+    "\0\u14b4\0\u14e9\0\u151e\0\u1553\0\u1588\0\u15bd\0\u15f2\0\u1627"+
+    "\0\u165c\0\u1691\0\u16c6\0\u16fb\0\u1730\0\u144a\0\u1765\0\u179a"+
+    "\0\u17cf\0\u1804\0\u1839\0\u186e\0\u18a3\0\u18d8\0\u190d\0\u1942"+
+    "\0\u1977\0\u19ac\0\u19e1\0\u1a16\0\u1a4b\0\u1a80\0\u1ab5\0\u1aea"+
+    "\0\u1b1f\0\u1b54\0\u1b89\0\u1bbe\0\u1bf3\0\u1c28\0\u013e";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[167];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\2\7\5\10\1\11\25\10\1\12\1\13\1\14\1\15"+
+    "\1\16\1\7\1\14\1\10\1\7\1\10\1\7\1\14"+
+    "\2\17\1\10\1\20\1\21\1\22\1\23\1\17\1\24"+
+    "\2\7\1\14\2\25\3\26\1\27\1\25\1\30\25\26"+
+    "\3\25\1\15\1\31\2\25\1\26\1\25\1\26\4\25"+
+    "\1\26\5\25\1\32\1\33\2\25\1\34\1\35\2\36"+
+    "\1\37\1\34\1\21\1\34\25\36\1\34\1\40\1\41"+
+    "\1\15\1\42\1\36\1\43\1\36\1\34\1\36\4\34"+
+    "\1\36\1\34\1\21\1\22\1\23\1\34\1\44\1\33"+
+    "\1\45\1\46\42\47\1\50\13\47\1\51\2\47\1\52"+
+    "\3\47\42\53\1\50\14\53\1\54\1\53\1\55\3\53"+
+    "\5\56\1\57\6\56\1\60\6\56\1\61\27\56\1\62"+
+    "\5\56\1\63\3\56\66\0\4\10\1\0\1\10\1\0"+
+    "\25\10\7\0\1\10\1\0\1\10\4\0\1\10\20\0"+
+    "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\0"+
+    "\1\73\1\74\1\75\1\0\1\76\2\0\1\77\2\0"+
+    "\1\100\35\0\5\101\1\0\25\101\7\0\1\101\1\0"+
+    "\1\101\4\0\1\101\13\0\5\102\1\0\25\102\7\0"+
+    "\1\102\1\0\1\102\4\0\1\102\51\0\1\15\31\0"+
+    "\1\103\60\0\4\26\3\0\25\26\7\0\1\26\1\0"+
+    "\1\26\4\0\1\26\13\0\3\26\3\0\25\26\7\0"+
+    "\1\26\1\0\1\26\4\0\1\26\12\0\1\35\4\0"+
+    "\1\35\6\0\1\104\1\105\3\0\1\106\2\0\1\107"+
+    "\1\110\1\111\15\0\1\106\21\0\3\36\3\0\25\36"+
+    "\4\0\2\36\1\43\1\36\1\0\1\36\4\0\1\36"+
+    "\12\0\1\35\3\36\3\0\25\36\4\0\2\36\1\43"+
+    "\1\36\1\0\1\36\4\0\1\36\12\0\1\112\13\0"+
+    "\1\112\2\0\2\112\1\0\1\112\2\0\1\112\5\0"+
+    "\1\112\11\0\1\112\20\0\3\36\1\103\2\0\25\36"+
+    "\4\0\2\36\1\43\1\36\1\0\1\36\4\0\1\36"+
+    "\27\0\1\113\46\0\42\47\1\0\13\47\1\0\2\47"+
+    "\1\0\3\47\61\114\1\0\3\114\42\53\1\0\14\53"+
+    "\1\0\1\53\1\0\3\53\5\56\1\0\6\56\1\0"+
+    "\6\56\1\0\27\56\1\0\5\56\1\0\3\56\41\0"+
+    "\1\115\35\0\1\116\64\0\1\117\3\0\1\120\121\0"+
+    "\1\121\32\0\1\122\1\0\1\123\10\0\1\124\41\0"+
+    "\1\125\66\0\1\126\72\0\1\127\54\0\1\130\1\131"+
+    "\63\0\1\132\67\0\1\133\66\0\1\134\2\0\1\135"+
+    "\61\0\1\136\63\0\1\137\60\0\1\140\4\0\1\141"+
+    "\61\0\1\142\13\0\1\143\53\0\1\144\47\0\4\101"+
+    "\1\0\1\101\1\0\25\101\7\0\1\101\1\0\1\101"+
+    "\4\0\1\101\12\0\4\102\1\0\1\102\1\0\25\102"+
+    "\7\0\1\102\1\0\1\102\4\0\1\102\40\0\1\106"+
+    "\50\0\1\106\63\0\1\106\2\0\1\106\26\0\1\106"+
+    "\47\0\1\106\14\0\1\106\42\0\1\106\4\0\1\106"+
+    "\64\0\1\145\47\0\1\146\77\0\1\147\56\0\1\150"+
+    "\120\0\1\151\34\0\1\152\57\0\1\153\74\0\1\154"+
+    "\47\0\1\130\72\0\1\155\55\0\1\156\66\0\1\157"+
+    "\66\0\1\160\101\0\1\161\61\0\1\162\51\0\1\163"+
+    "\64\0\1\164\6\0\1\165\64\0\1\142\54\0\1\166"+
+    "\67\0\1\167\57\0\1\170\75\0\1\171\70\0\1\172"+
+    "\61\0\1\173\67\0\1\174\64\0\1\175\46\0\1\176"+
+    "\103\0\1\147\44\0\1\177\70\0\1\161\62\0\1\200"+
+    "\77\0\1\201\65\0\1\202\73\0\1\203\35\0\1\204"+
+    "\106\0\1\205\53\0\1\206\77\0\1\157\67\0\1\157"+
+    "\43\0\1\202\70\0\1\207\100\0\1\210\54\0\1\165"+
+    "\76\0\1\211\42\0\1\212\70\0\1\213\57\0\1\214"+
+    "\62\0\1\176\12\0\1\147\103\0\1\215\24\0\2\177"+
+    "\5\216\25\177\3\216\1\0\1\177\1\0\1\216\1\177"+
+    "\1\216\1\177\3\216\2\177\1\0\1\216\1\0\1\216"+
+    "\3\0\2\216\22\0\1\217\53\0\1\220\57\0\1\221"+
+    "\106\0\1\130\47\0\1\222\3\0\1\223\1\0\1\224"+
+    "\55\0\1\157\104\0\1\225\65\0\1\226\55\0\1\157"+
+    "\61\0\1\225\71\0\1\157\52\0\1\225\62\0\1\227"+
+    "\115\0\1\177\35\0\1\230\62\0\1\226\65\0\1\222"+
+    "\3\0\1\223\72\0\1\231\55\0\1\232\71\0\1\170"+
+    "\71\0\1\233\64\0\1\157\50\0\1\234\56\0\1\235"+
+    "\64\0\1\236\76\0\1\237\66\0\1\157\65\0\1\240"+
+    "\62\0\1\241\57\0\1\242\71\0\1\233\60\0\1\243"+
+    "\67\0\1\244\7\0\1\245\62\0\1\246\52\0\1\247"+
+    "\65\0\1\226\63\0\1\152\77\0\1\226\37\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[7261];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\2\0\1\1\3\0\1\11\4\1\1\11\2\1\7\11"+
+    "\2\1\1\11\1\1\3\11\4\1\1\11\1\1\2\11"+
+    "\1\1\1\11\2\1\2\11\1\1\2\11\5\1\1\11"+
+    "\15\0\2\1\1\11\2\0\1\11\3\0\1\1\1\0"+
+    "\2\11\41\0\1\11\17\0\1\1\47\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[167];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Internal type denoting a line ending in a CSS property.
+	 */
+	public static final int INTERNAL_CSS_PROPERTY			= -1;
+
+	/**
+	 * Internal type denoting a line ending in a CSS property value.
+	 */
+	public static final int INTERNAL_CSS_VALUE				= -2;
+
+	/**
+	 * Internal type denoting line ending in a CSS double-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_STRING				= -(1<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS single-quote string.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_CHAR				= -(2<<11);
+
+	/**
+	 * Internal type denoting line ending in a CSS multi-line comment.
+	 * The state to return to is embedded in the actual end token type.
+	 */
+	public static final int INTERNAL_CSS_MLC				= -(3<<11);
+
+	/**
+	 * The state previous CSS-related state we were in before going into a CSS
+	 * string, multi-line comment, etc.
+	 */
+	private int cssPrevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSSTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns <code>true</code> since CSS uses curly braces.
+	 *
+	 * @return <code>true</code> always.
+	 */
+	public boolean getCurlyBracesDenoteCodeBlocks() {
+		return true;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		cssPrevState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = CSS_STRING;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CSS_CHAR_LITERAL;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = CSS_C_STYLE_COMMENT;
+				break;
+			case INTERNAL_CSS_PROPERTY:
+				state = CSS_PROPERTY;
+				break;
+			case INTERNAL_CSS_VALUE:
+				state = CSS_VALUE;
+				break;
+			default:
+				if (initialTokenType<-1024) {
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_CSS_STRING:
+							state = CSS_STRING;
+							break;
+						case INTERNAL_CSS_CHAR:
+							state = CSS_CHAR_LITERAL;
+							break;
+						case INTERNAL_CSS_MLC:
+							state = CSS_C_STYLE_COMMENT;
+							break;
+					}
+					cssPrevState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public CSSTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public CSSTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 134) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 4: 
+          { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+          }
+        case 36: break;
+        case 11: 
+          { addNullToken(); return firstToken;
+          }
+        case 37: break;
+        case 27: 
+          { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+          }
+        case 38: break;
+        case 15: 
+          { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+          }
+        case 39: break;
+        case 22: 
+          { /* End of a function */ addToken(Token.SEPARATOR);
+          }
+        case 40: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 41: break;
+        case 2: 
+          { /*System.out.println("yyinitial: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 42: break;
+        case 32: 
+          { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+          }
+        case 43: break;
+        case 14: 
+          { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+          }
+        case 44: break;
+        case 13: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 45: break;
+        case 31: 
+          { addToken(Token.VARIABLE);
+          }
+        case 46: break;
+        case 5: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 47: break;
+        case 16: 
+          { addToken(Token.SEPARATOR); yybegin(YYINITIAL);
+          }
+        case 48: break;
+        case 26: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+          }
+        case 49: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 50: break;
+        case 19: 
+          { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+          }
+        case 51: break;
+        case 9: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+          }
+        case 52: break;
+        case 30: 
+          { addToken(Token.REGEX);
+          }
+        case 53: break;
+        case 12: 
+          { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 54: break;
+        case 17: 
+          { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+          }
+        case 55: break;
+        case 33: 
+          { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+          }
+        case 56: break;
+        case 24: 
+          { /* Skip escaped chars. */
+          }
+        case 57: break;
+        case 3: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 58: break;
+        case 10: 
+          { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+          }
+        case 59: break;
+        case 35: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 60: break;
+        case 25: 
+          { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+          }
+        case 61: break;
+        case 20: 
+          { int temp = zzMarkedPos - 2;
+						  addToken(zzStartRead, temp, Token.FUNCTION);
+						  addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+						  zzStartRead = zzCurrentPos = zzMarkedPos;
+          }
+        case 62: break;
+        case 8: 
+          { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+          }
+        case 63: break;
+        case 28: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+          }
+        case 64: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 65: break;
+        case 21: 
+          { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+          }
+        case 66: break;
+        case 29: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+          }
+        case 67: break;
+        case 18: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 68: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 69: break;
+        case 23: 
+          { 
+          }
+        case 70: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case CSS_C_STYLE_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+            }
+            case 168: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 169: break;
+            case CSS_STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+            }
+            case 170: break;
+            case CSS_VALUE: {
+              addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+            }
+            case 171: break;
+            case CSS_PROPERTY: {
+              addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+            }
+            case 172: break;
+            case CSS_CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+            }
+            case 173: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex	(revision 25584)
@@ -0,0 +1,517 @@
+/*
+ * 11/13/2004
+ *
+ * CSharpTokenMaker.java - An object that can take a chunk of text and return
+ * a linked list of tokens representing it in the C# programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A lexer for the C# programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSharpTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class CSharpTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSharpTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VERBATIMSTRING;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = DELIMITEDCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+/* C1.1 - Line terminators. */
+NewlineCharacter						= ([\n])
+
+/* C.1.2 - Whitespace. */
+Whitespace							= ([\t ]+)
+
+/* C.1.3 - Comments */
+InputCharacter							= ([^\n])
+InputCharacters						= ({InputCharacter}+)
+DocumentationCommentStart				= ("///")
+SingleLineComment						= ("//"([^/]{InputCharacters}?)?)
+DelimitedCommentStart					= ("/*")
+DelimitedCommentEnd						= ("*/")
+
+/* C.1.5 - Unicode character escape sequences. */
+UnicodeEscape1							= ("\\u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+UnicodeEscape2							= ("\\U"{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+UnicodeEscapeSequence					= ({UnicodeEscape1}|{UnicodeEscape2})
+
+/* C1.6 - Identifiers. */
+LetterCharacter						= ([A-Za-z])  /* Not accurate - many more Unicode letters, Unicode escapes */
+/*
+CombiningCharacter						= ()
+*/
+DecimalDigitCharacter					= ([0-9])
+ConnectingCharacter						= ([_\-])
+/*
+FormattingCharacter						= ()
+*/
+/*
+IdentifierPartCharacter					= ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter}|{CombiningCharacter}|{FormattingCharacter})
+*/
+IdentifierPartCharacter					= ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter})
+IdentifierPartCharacters					= ({IdentifierPartCharacter}+)
+IdentifierStartCharacter					= ({LetterCharacter}|[_])
+IdentifierOrKeyword						= ({IdentifierStartCharacter}{IdentifierPartCharacters}?)
+Identifier							= ("@"?{IdentifierOrKeyword})
+/* NOTE:  The two below aren't from the C# spec, but we add them so we can */
+/* highlight errors.                                                       */
+NonSeparator		= (([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\"))
+ErrorIdentifier						= ({NonSeparator}+)
+
+/* C1.8 - Literals. */
+BooleanLiteral							= ("true"|"false")
+DecimalDigit							= ([0-9])
+DecimalDigits							= ({DecimalDigit}+)
+IntegerTypeSuffix						= (([uU][lL]?)|([lL][uU]?))
+DecimalIntegerLiteral					= ({DecimalDigits}{IntegerTypeSuffix}?)
+HexDigit								= ([0-9A-Fa-f])
+HexDigits								= ({HexDigit}+)
+HexadecimalIntegerLiteral				= ("0"[xX]{HexDigits}{IntegerTypeSuffix}?)
+Sign									= ([+\-])
+ExponentPart							= ([eE]{Sign}?{DecimalDigits})
+RealTypeSuffix							= ([fFdDmM])
+RealHelper1							= ({DecimalDigits}"."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
+RealHelper2							= ("."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
+RealHelper3							= ({DecimalDigits}{ExponentPart}{RealTypeSuffix}?)
+RealHelper4							= ({DecimalDigits}{RealTypeSuffix})
+RealLiteral							= ({RealHelper1}|{RealHelper2}|{RealHelper3}|{RealHelper4})
+ErrorNumberFormat						= (({DecimalIntegerLiteral}|{HexadecimalIntegerLiteral}|{RealLiteral}){NonSeparator}+)
+SingleCharacter						= ([^\'\\\n])
+SimpleEscapeSequence					= ("\\"[\'\"\\0abfnrtv])
+HexadecimalEscapeSequence				= ("\\x"{HexDigit}{HexDigit}?{HexDigit}?{HexDigit}?)
+Character								= ({SingleCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
+UnclosedCharacterLiteral					= ("'"{Character})
+CharacterLiteral						= ({UnclosedCharacterLiteral}"'")
+ErrorUnclosedCharacterLiteral				= ("'"[^\'\n]*)
+ErrorCharacterLiteral					= ("''"|{ErrorUnclosedCharacterLiteral}[\'])
+QuoteEscapeSequence						= ("\"\"")
+SingleVerbatimStringLiteralCharacter		= ([^\"])
+VerbatimStringLiteralStart				= ("@\"")
+SingleRegularStringLiteralCharacter		= ([^\"\\\n])
+RegularStringLiteralCharacter				= ({SingleRegularStringLiteralCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
+RegularStringLiteralCharacters			= ({RegularStringLiteralCharacter}+)
+RegularStringLiteral					= ([\"]{RegularStringLiteralCharacters}?[\"])
+UnclosedRegularStringLiteral				= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorRegularStringLiteral				= ({UnclosedRegularStringLiteral}[\"])
+
+/* C.1.9 - Operators and Punctuators. */
+OOPHelper1							= (":")
+OOPHelper2							= ("+"|"-"|"*"|"/"|"%"|"&"|"|"|"^"|"!"|"~")
+OOPHelper3							= ("="|"<"|">"|"?"|"++"|"--"|"&&"|"||"|"<<"|">>")
+OOPHelper4							= ("=="|"!="|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&=")
+OOPHelper5							= ("|="|"^="|"<<="|">>="|"->")
+OperatorOrPunctuator					= ({OOPHelper1}|{OOPHelper2}|{OOPHelper3}|{OOPHelper4}|{OOPHelper5})
+/* NOTE:  We distinguish between operators and separators (punctuators), but */
+/* the C# spec doesn't, so the stuff below isn't in the spec.                */
+Separator								= ([\{\}\[\]\(\)])
+Separator2							= ([,;])
+
+/* C.1.10 - Pre-processing Directives. */
+/* NOTE:  We don't do ALL of the PP stuff here as it's unnecessary  */
+/* for us to know the difference between declarations, diagnostics, */
+/* regions, etc.                                                    */
+ConditionalSymbol						= ({IdentifierOrKeyword})	/* Not correct - excludes "true" and "false". */
+PPNewLine								= ({Whitespace}?{SingleLineComment}?{NewlineCharacter})
+PPPrimaryExpression						= ({IdentifierOrKeyword}|({Whitespace}?{PPExpression}{Whitespace}?))
+PPUnaryExpression						= ({PPPrimaryExpression}|("!"{Whitespace}?{PPUnaryExpression}))
+PPEqualityExpression					= ({PPUnaryExpression}|({Whitespace}?"=="{Whitespace}?{PPUnaryExpression})|({Whitespace}?"!="{Whitespace}?{PPUnaryExpression}))
+PPAndExpression						= ({PPEqualityExpression}|({Whitespace}?"&&"{Whitespace}?{PPEqualityExpression}))
+PPOrExpression							= ({PPAndExpression}|({Whitespace}?"||"{Whitespace}?{PPAndExpression}))
+PPExpression							= ({Whitespace}?{PPOrExpression}{Whitespace}?)
+PPWord								= ("define"|"undef"|"if"|"elif"|"else"|"endif"|"line"|"error"|"warning"|"region"|"endregion")
+PPDirective							= ({Whitespace}?"#"{Whitespace}?{PPWord}{InputCharacter}*)
+
+/* URL matching, for comments (not in C# spec) */
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ([A-Za-z_]|{DecimalDigitCharacter}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|[A-Za-z0-9])
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state DELIMITEDCOMMENT
+%state DOCUMENTCOMMENT
+%state VERBATIMSTRING
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract" |
+	"as" |
+	"base" |
+	"break" |
+	"case" |
+	"catch" |
+	"checked" |
+	"class" |
+	"const" |
+	"continue" |
+	"decimal" |
+	"default" |
+	"delegate" |
+	"do" |
+	"else" |
+	"enum" |
+	"event" |
+	"explicit" |
+	"extern" |
+	"finally" |
+	"fixed" |
+	"for" |
+	"foreach" |
+	"goto" |
+	"if" |
+	"implicit" |
+	"in" |
+	"interface" |
+	"internal" |
+	"is" |
+	"lock" |
+	"namespace" |
+	"new" |
+	"null" |
+	"object" |
+	"operator" |
+	"out" |
+	"override" |
+	"params" |
+	"private" |
+	"protected" |
+	"public" |
+	"readonly" |
+	"ref" |
+	"return" |
+	"sealed" |
+	"sizeof" |
+	"stackalloc" |
+	"static" |
+	"string" |
+	"struct" |
+	"switch" |
+	"this" |
+	"throw" |
+	"try" |
+	"typeof" |
+	"unchecked" |
+	"unsafe" |
+	"using" |
+	"virtual" |
+	"void" |
+	"volatile" |
+	"while"								{ addToken(Token.RESERVED_WORD); }
+
+	/* Data types. */
+	"bool" |
+	"byte" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"object" |
+	"sbyte" |
+	"short" |
+	"string" |
+	"uint" |
+	"ulong" |
+	"ushort"							{ addToken(Token.DATA_TYPE); }
+
+
+	{NewlineCharacter}					{ addNullToken(); return firstToken; }
+
+	{BooleanLiteral}					{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{Identifier}						{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}						{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{CharacterLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharacterLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{ErrorUnclosedCharacterLiteral}		{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharacterLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{VerbatimStringLiteralStart}			{ start = zzMarkedPos-2; yybegin(VERBATIMSTRING); }
+	{RegularStringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedRegularStringLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{ErrorRegularStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comments. */
+	{DelimitedCommentStart}				{ start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT); }
+	{DocumentationCommentStart}			{ start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT); }
+	{SingleLineComment}					{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Separators. */
+	{Separator}						{ addToken(Token.SEPARATOR); }
+	{Separator2}						{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{OperatorOrPunctuator}				{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{DecimalIntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexadecimalIntegerLiteral}			{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{RealLiteral}						{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}					{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	/* Preprocessor directives. */
+	{PPDirective}						{ addToken(Token.PREPROCESSOR); }
+
+	/* Pretty-much anything else. */
+	{ErrorIdentifier}					{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>							{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.								{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<DELIMITEDCOMMENT> {
+
+	[^hwf\n\*]+						{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{DelimitedCommentEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCUMENTCOMMENT> {
+
+	[^hwf\<\n]*						{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
+	"<"[^\>]*">"					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
+	"<"							{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
+
+}
+
+
+<VERBATIMSTRING> {
+
+	[^\"\n]*						{}
+	{QuoteEscapeSequence}			{}
+	\"							{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\n							{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java	(revision 25584)
@@ -0,0 +1,1600 @@
+/* The following code was generated by JFlex 1.4.1 on 1/21/09 4:27 PM */
+
+/*
+ * 11/13/2004
+ *
+ * CSharpTokenMaker.java - An object that can take a chunk of text and return
+ * a linked list of tokens representing it in the C# programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A lexer for the C# programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated CSharpTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class CSharpTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int VERBATIMSTRING = 3;
+  public static final int DOCUMENTCOMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int DELIMITEDCOMMENT = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\2\1\1\1\0\2\15\22\0\1\2\1\45\1\41\1\16"+
+    "\1\66\1\45\1\46\1\37\2\65\1\4\1\32\1\56\1\12\1\36"+
+    "\1\3\1\30\11\11\1\44\1\56\1\53\1\52\1\54\1\51\1\14"+
+    "\3\27\1\35\1\33\1\35\5\10\1\26\1\34\7\10\1\7\2\10"+
+    "\1\31\2\10\1\65\1\5\1\65\1\50\1\13\1\0\1\23\1\42"+
+    "\1\71\1\57\1\21\1\22\1\64\1\67\1\60\1\75\1\72\1\24"+
+    "\1\73\1\61\1\62\1\70\1\10\1\20\1\25\1\17\1\6\1\40"+
+    "\1\63\1\43\1\74\1\76\1\55\1\47\1\55\1\51\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\2\0\2\1\1\2\1\3\1\4\2\5\2\6\1\7"+
+    "\1\5\3\2\7\6\1\7\1\5\1\2\1\10\1\6"+
+    "\1\11\1\6\5\5\1\12\11\6\1\1\1\13\5\1"+
+    "\1\14\1\1\1\15\3\1\1\16\1\17\1\0\1\20"+
+    "\1\21\5\6\1\22\1\7\1\22\1\23\1\7\1\0"+
+    "\1\24\7\2\14\6\1\25\10\6\1\22\1\23\1\26"+
+    "\1\10\1\27\2\6\2\11\1\30\4\6\2\25\21\6"+
+    "\1\31\7\0\1\32\2\0\1\1\7\0\1\20\1\33"+
+    "\5\6\1\7\1\23\1\0\7\2\1\34\1\2\17\6"+
+    "\1\25\10\6\1\35\1\10\1\36\2\10\1\26\1\10"+
+    "\3\6\1\11\1\37\3\11\7\6\1\40\20\6\20\0"+
+    "\1\6\1\40\2\6\6\2\1\41\12\6\2\35\2\10"+
+    "\1\26\2\6\2\11\16\6\1\0\1\42\2\0\1\43"+
+    "\7\0\3\2\10\6\1\35\2\10\1\26\1\6\2\11"+
+    "\10\6\7\0\2\2\3\6\2\10\1\26\1\11\5\6"+
+    "\2\0\1\2\3\6\1\0\1\6";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[364];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\77\0\176\0\275\0\374\0\u013b\0\u017a\0\u01b9"+
+    "\0\u01f8\0\u0237\0\u0276\0\u02b5\0\u02f4\0\u0333\0\u013b\0\u0372"+
+    "\0\u03b1\0\u03f0\0\u042f\0\u046e\0\u04ad\0\u04ec\0\u052b\0\u056a"+
+    "\0\u05a9\0\u05e8\0\u0627\0\u0666\0\u06a5\0\u06e4\0\u013b\0\u0723"+
+    "\0\u0762\0\u07a1\0\u07e0\0\u013b\0\u013b\0\u081f\0\u085e\0\u089d"+
+    "\0\u08dc\0\u091b\0\u095a\0\u0999\0\u09d8\0\u0a17\0\u013b\0\u0a56"+
+    "\0\u0a95\0\u0ad4\0\u0b13\0\u0b52\0\u013b\0\u0b91\0\u0bd0\0\u0c0f"+
+    "\0\u0c4e\0\u0c8d\0\u013b\0\u0ccc\0\u0d0b\0\u0d4a\0\u013b\0\u0d89"+
+    "\0\u0dc8\0\u0e07\0\u0e46\0\u0e85\0\u0ec4\0\u0f03\0\u0f42\0\u0ec4"+
+    "\0\u0f81\0\u05e8\0\u013b\0\u0fc0\0\u0fff\0\u103e\0\u107d\0\u10bc"+
+    "\0\u10fb\0\u113a\0\u1179\0\u11b8\0\u11f7\0\u1236\0\u1275\0\u12b4"+
+    "\0\u12f3\0\u1332\0\u1371\0\u13b0\0\u13ef\0\u142e\0\u0276\0\u146d"+
+    "\0\u14ac\0\u14eb\0\u152a\0\u1569\0\u15a8\0\u15e7\0\u1626\0\u1665"+
+    "\0\u16a4\0\u16e3\0\u1722\0\u013b\0\u1761\0\u17a0\0\u17df\0\u181e"+
+    "\0\u013b\0\u185d\0\u189c\0\u18db\0\u191a\0\u1959\0\u1998\0\u19d7"+
+    "\0\u1a16\0\u1a55\0\u1a94\0\u1ad3\0\u1b12\0\u1b51\0\u1b90\0\u1bcf"+
+    "\0\u1c0e\0\u1c4d\0\u1c8c\0\u1ccb\0\u1d0a\0\u1d49\0\u1d88\0\u1dc7"+
+    "\0\u013b\0\u1e06\0\u1e45\0\u1e84\0\u1ec3\0\u1f02\0\u1f41\0\u0bd0"+
+    "\0\u013b\0\u1f80\0\u1fbf\0\u013b\0\u1ffe\0\u203d\0\u207c\0\u20bb"+
+    "\0\u20fa\0\u2139\0\u2178\0\u21b7\0\u013b\0\u21f6\0\u2235\0\u2274"+
+    "\0\u22b3\0\u22f2\0\u0ec4\0\u2331\0\u2370\0\u23af\0\u23ee\0\u242d"+
+    "\0\u246c\0\u24ab\0\u24ea\0\u2529\0\u2568\0\u25a7\0\u25e6\0\u2625"+
+    "\0\u2664\0\u26a3\0\u26e2\0\u2721\0\u2760\0\u279f\0\u27de\0\u281d"+
+    "\0\u285c\0\u289b\0\u28da\0\u2919\0\u2958\0\u2997\0\u29d6\0\u2a15"+
+    "\0\u2a54\0\u2a93\0\u2ad2\0\u2b11\0\u2b50\0\u2b8f\0\u2bce\0\u2c0d"+
+    "\0\u013b\0\u2c4c\0\u2c8b\0\u2cca\0\u2d09\0\u2d48\0\u2d87\0\u2dc6"+
+    "\0\u2e05\0\u013b\0\u2e44\0\u2e83\0\u2ec2\0\u2f01\0\u2f40\0\u2f7f"+
+    "\0\u2fbe\0\u2ffd\0\u303c\0\u307b\0\u30ba\0\u30f9\0\u3138\0\u3177"+
+    "\0\u31b6\0\u31f5\0\u3234\0\u3273\0\u32b2\0\u32f1\0\u3330\0\u336f"+
+    "\0\u33ae\0\u33ed\0\u342c\0\u346b\0\u34aa\0\u34e9\0\u3528\0\u3567"+
+    "\0\u35a6\0\u35e5\0\u3624\0\u3663\0\u36a2\0\u36e1\0\u3720\0\u375f"+
+    "\0\u379e\0\u37dd\0\u381c\0\u385b\0\u389a\0\u38d9\0\u0276\0\u3918"+
+    "\0\u3957\0\u3996\0\u39d5\0\u3a14\0\u3a53\0\u3a92\0\u3ad1\0\u0276"+
+    "\0\u3b10\0\u3b4f\0\u3b8e\0\u3bcd\0\u3c0c\0\u3c4b\0\u3c8a\0\u3cc9"+
+    "\0\u3d08\0\u3d47\0\u3d86\0\u3dc5\0\u3e04\0\u3e43\0\u3e82\0\u3ec1"+
+    "\0\u3f00\0\u3f3f\0\u3f7e\0\u3fbd\0\u3ffc\0\u403b\0\u407a\0\u40b9"+
+    "\0\u40f8\0\u4137\0\u4176\0\u41b5\0\u41f4\0\u4233\0\u4272\0\u42b1"+
+    "\0\u42f0\0\u432f\0\u436e\0\u43ad\0\u43ec\0\u442b\0\u446a\0\u44a9"+
+    "\0\u44e8\0\u4527\0\u4566\0\u45a5\0\u45e4\0\u4623\0\u4662\0\u46a1"+
+    "\0\u46e0\0\u471f\0\u475e\0\u479d\0\u47dc\0\u481b\0\u485a\0\u4899"+
+    "\0\u0ec4\0\u48d8\0\u4917\0\u4956\0\u4995\0\u49d4\0\u4a13\0\u4a52"+
+    "\0\u4a91\0\u4ad0\0\u4b0f\0\u4b4e\0\u4b8d\0\u4bcc\0\u4c0b\0\u4c4a"+
+    "\0\u436e\0\u4c89\0\u442b\0\u4cc8\0\u4d07\0\u4d46\0\u4d85\0\u4dc4"+
+    "\0\u4e03\0\u4e42\0\u4e81\0\u4ec0\0\u4eff\0\u4f3e\0\u4f7d\0\u4fbc"+
+    "\0\u4ffb\0\u503a\0\u5079\0\u50b8\0\u50f7\0\u5136\0\u5175\0\u51b4"+
+    "\0\u51f3\0\u5232\0\u5271\0\u52b0";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[364];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\5\1\6\1\7\1\10\1\11\1\5\1\12\2\13"+
+    "\1\14\1\15\1\13\1\16\1\17\1\20\1\21\1\22"+
+    "\1\23\1\24\1\25\1\26\1\27\2\13\1\30\1\13"+
+    "\1\31\3\13\1\32\1\33\1\34\1\35\1\36\1\13"+
+    "\1\37\1\11\1\40\1\41\1\11\1\37\1\11\1\42"+
+    "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\52"+
+    "\1\53\1\44\1\5\1\13\1\54\1\55\5\13\1\56"+
+    "\1\57\2\56\1\60\15\56\1\61\40\56\1\62\3\56"+
+    "\1\63\7\56\1\64\1\65\20\64\1\66\30\64\1\67"+
+    "\7\64\1\70\3\64\1\71\7\64\1\72\1\73\37\72"+
+    "\1\74\35\72\1\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\6\5\1\0\11\5\101\0\1\7\13\0\1\75\63\0"+
+    "\1\76\1\77\45\0\1\37\76\0\1\37\24\0\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\5\13\1\101\1\102\4\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\1\13\1\103\1\104\3\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\105"+
+    "\4\0\1\105\2\106\1\105\1\14\1\0\2\105\1\0"+
+    "\3\105\1\107\1\110\1\105\1\111\1\105\1\111\1\105"+
+    "\1\14\1\105\1\0\1\107\2\110\1\112\1\0\1\105"+
+    "\1\0\2\105\13\0\1\110\5\105\1\0\5\105\1\110"+
+    "\3\105\12\0\1\37\37\0\1\37\1\0\1\37\22\0"+
+    "\1\5\4\0\1\5\3\13\1\5\1\0\1\13\1\5"+
+    "\1\0\1\5\11\13\1\5\1\13\1\0\3\13\2\0"+
+    "\1\13\1\113\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\1\0\1\75\2\0\1\5\1\114\3\5\1\0"+
+    "\2\5\1\0\2\5\1\115\1\116\2\5\1\117\5\5"+
+    "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\1\120"+
+    "\1\121\2\5\1\122\1\5\1\0\12\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\1\13\1\123"+
+    "\11\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\1\124\4\13\1\125\2\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\126\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+    "\1\127\5\13\1\0\3\13\2\0\1\130\1\0\1\13"+
+    "\1\131\13\0\2\13\1\132\3\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\4\13\1\133\1\134\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\13\1\135\1\13\1\136"+
+    "\2\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\6\13\1\137\4\13"+
+    "\1\0\3\13\2\0\1\13\1\0\1\140\1\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\141\2\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\142\1\13\1\143\10\13"+
+    "\1\0\3\13\2\0\1\13\1\0\1\144\1\13\13\0"+
+    "\1\13\1\145\2\13\1\146\1\13\1\0\1\5\1\147"+
+    "\7\13\1\105\4\0\1\105\2\106\1\105\1\14\1\0"+
+    "\2\105\1\0\3\105\1\107\1\110\1\105\1\111\1\105"+
+    "\1\111\1\105\1\14\1\150\1\0\1\107\2\110\1\112"+
+    "\1\0\1\105\1\0\1\105\1\150\13\0\1\110\5\105"+
+    "\1\0\5\105\1\110\3\105\32\0\1\37\17\0\1\37"+
+    "\35\0\1\151\16\0\1\151\46\0\1\152\1\0\3\152"+
+    "\1\153\31\152\1\154\37\152\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\1\13\1\155\1\13"+
+    "\1\156\2\13\1\0\1\5\10\13\1\35\1\157\3\35"+
+    "\1\160\33\35\1\161\35\35\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\13\1\162\2\13"+
+    "\1\127\6\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\163\2\13\1\0\1\5\5\13\1\164"+
+    "\2\13\46\0\1\37\3\0\1\37\73\0\1\37\2\0"+
+    "\1\37\76\0\1\37\1\11\75\0\1\37\1\0\1\11"+
+    "\22\0\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\165\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\3\13\1\166\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\3\13\1\137\2\13\1\137\4\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+    "\1\167\3\13\1\0\1\5\4\13\1\170\3\13\1\5"+
+    "\4\0\1\5\1\171\3\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\172\1\13\1\173\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\1\174\3\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\175"+
+    "\1\0\1\176\1\13\13\0\6\13\1\0\1\5\1\13"+
+    "\1\177\6\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\1\200\7\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\201\2\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\1\202\3\13\1\100\1\13\1\5\1\0"+
+    "\1\5\1\13\1\203\2\13\1\204\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\205\1\206\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\207\2\13"+
+    "\1\0\1\5\1\210\7\13\1\56\1\0\2\56\1\0"+
+    "\15\56\1\0\40\56\1\0\3\56\1\0\7\56\3\0"+
+    "\1\211\112\0\1\212\40\0\1\213\101\0\1\214\32\0"+
+    "\1\215\57\0\1\64\1\0\20\64\1\0\30\64\1\0"+
+    "\7\64\1\0\3\64\1\0\7\64\17\0\1\216\40\0"+
+    "\1\217\16\0\54\220\1\221\22\220\63\0\1\222\32\0"+
+    "\1\223\57\0\1\72\1\0\37\72\1\0\35\72\41\0"+
+    "\1\224\37\0\1\75\3\0\1\225\11\0\1\226\1\227"+
+    "\2\0\1\230\32\0\1\231\1\232\2\0\1\233\13\0"+
+    "\3\234\1\235\73\234\6\0\6\100\3\0\13\100\1\0"+
+    "\3\100\2\0\1\100\1\0\2\100\13\0\6\100\2\0"+
+    "\10\100\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\3\13\1\236\2\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\1\13\1\237\4\13\1\0\1\5\1\147\7\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\2\13\1\240\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\6\13\1\241\4\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\2\13\1\242\5\13"+
+    "\1\105\4\0\5\105\1\0\2\105\1\0\14\105\1\0"+
+    "\3\105\2\0\1\105\1\0\2\105\13\0\6\105\1\0"+
+    "\12\105\4\0\5\105\1\0\2\105\1\0\6\105\1\243"+
+    "\1\105\1\243\3\105\1\0\3\105\2\0\1\105\1\0"+
+    "\2\105\13\0\6\105\1\0\12\105\4\0\4\105\1\244"+
+    "\1\245\2\105\1\0\12\105\1\244\1\105\1\245\3\105"+
+    "\2\0\1\105\1\0\2\105\13\0\6\105\1\0\12\105"+
+    "\4\0\1\105\2\243\2\105\1\0\2\105\1\0\14\105"+
+    "\1\0\3\105\2\0\1\105\1\0\2\105\13\0\6\105"+
+    "\1\0\11\105\1\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\2\5\1\246\3\5\1\0\12\5\4\0\5\5\1\0"+
+    "\2\5\1\0\3\5\1\247\10\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\6\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\2\5\1\250\3\5\1\251"+
+    "\5\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\2\5\1\252\3\5\1\0\12\5\4\0\5\5\1\0"+
+    "\2\5\1\0\14\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\1\5\1\253\4\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\3\5\1\254\10\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\6\5\1\0"+
+    "\12\5\4\0\5\5\1\0\2\5\1\0\4\5\1\255"+
+    "\7\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\6\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\5\5\1\256\6\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\6\5\1\0\12\5\4\0\1\5\1\257"+
+    "\3\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\5\13\1\137\2\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\13\1\260\11\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\13"+
+    "\1\261\4\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\1\13\1\262\6\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\263\2\13\1\137"+
+    "\1\264\6\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\6\13\1\265"+
+    "\4\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\2\13\1\266\10\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\267\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\1\13\1\270\6\13\1\5\4\0\1\5\1\271\3\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\5\13\1\272\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\273\2\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\1\13\1\274"+
+    "\13\0\2\13\1\275\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\13\1\276\11\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\6\13"+
+    "\1\277\4\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\300"+
+    "\3\13\1\0\1\5\2\13\1\301\5\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+    "\1\302\2\13\1\303\6\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\304\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\5\13\1\164\2\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\7\13\1\262\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\13\1\305\4\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\3\13\1\306\2\13\1\0\1\5"+
+    "\10\13\1\105\4\0\4\105\1\307\1\0\2\105\1\0"+
+    "\3\105\3\307\3\105\2\307\1\105\1\0\1\307\1\105"+
+    "\1\307\2\0\1\105\1\0\1\307\1\105\13\0\1\307"+
+    "\5\105\1\0\3\105\1\307\6\105\4\0\4\105\1\151"+
+    "\1\0\2\105\1\0\3\105\1\107\1\110\5\105\1\151"+
+    "\1\105\1\0\1\107\2\110\2\0\1\105\1\0\2\105"+
+    "\13\0\1\110\5\105\1\0\5\105\1\110\3\105\1\310"+
+    "\1\0\35\310\1\311\40\310\1\0\3\310\1\152\1\312"+
+    "\1\313\7\310\2\152\1\310\2\152\4\310\1\152\6\310"+
+    "\1\314\3\152\1\315\15\310\1\152\15\310\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+    "\1\316\11\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\5\13\1\317"+
+    "\5\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\1\13\1\320\4\13\1\0\1\5\10\13\5\157\1\321"+
+    "\33\157\1\322\36\157\1\0\3\157\1\35\1\323\1\324"+
+    "\7\157\2\35\1\157\2\35\4\157\1\35\6\157\4\35"+
+    "\1\325\15\157\1\35\15\157\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\2\13\1\326\10\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\3\13\1\327\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\1\330\12\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\3\13\1\331\1\13\1\332\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\333\5\13\1\5\4\0\1\5\1\334\3\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\335\12\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\1\13\1\270\6\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+    "\1\336\5\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\4\13\1\137"+
+    "\1\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\4\13\1\337\3\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\137\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\340\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\6\13\1\341\1\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\342\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\13"+
+    "\1\343\4\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\1\344\12\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\1\345\1\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\346\1\13\1\347\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\1\13\1\350\11\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\351\5\13\1\265\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\352\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\2\13\1\353\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\354\1\13\1\355\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\70\0\1\356\32\0\1\357\135\0\1\360\32\0\1\361"+
+    "\147\0\1\362\32\0\1\363\135\0\1\364\32\0\1\365"+
+    "\140\0\1\366\36\0\1\367\75\0\1\370\3\0\1\371"+
+    "\34\0\1\372\75\0\1\373\37\0\1\374\77\0\1\255"+
+    "\77\0\1\375\53\0\1\234\1\0\75\234\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+    "\1\300\3\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\376"+
+    "\3\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\377\12\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\4\13\1\u0100\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\1\u0101\7\13\1\105"+
+    "\4\0\4\105\1\244\1\0\2\105\1\0\4\105\1\110"+
+    "\5\105\1\244\1\105\1\0\1\105\2\110\2\0\1\105"+
+    "\1\0\2\105\13\0\1\110\5\105\1\0\5\105\1\110"+
+    "\3\105\11\0\1\244\16\0\1\244\46\0\1\5\4\0"+
+    "\5\5\1\0\2\5\1\0\14\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\1\u0102\5\5\1\0\12\5"+
+    "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+    "\2\0\1\5\1\0\2\5\13\0\5\5\1\u0103\1\0"+
+    "\12\5\4\0\5\5\1\0\2\5\1\0\2\5\1\u0104"+
+    "\11\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\6\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\7\5\1\u0105\4\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\1\5\1\121\4\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\14\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\1\u0106\5\5\1\0\12\5"+
+    "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+    "\2\0\1\5\1\0\2\5\13\0\2\5\1\u0105\3\5"+
+    "\1\0\12\5\4\0\5\5\1\0\2\5\1\0\4\5"+
+    "\1\117\7\5\1\0\3\5\2\0\1\5\1\0\2\5"+
+    "\13\0\6\5\1\0\11\5\1\255\1\0\75\255\1\5"+
+    "\4\0\5\5\1\0\2\5\1\0\2\5\1\u0107\11\5"+
+    "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\6\5"+
+    "\1\0\12\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\u0108\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\3\13\1\172\2\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\6\13\1\137\4\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u0109\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\1\u010a\3\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\u010b\5\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\2\13\1\137\10\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\2\13\1\174\3\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\u010a\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+    "\1\u010c\5\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\4\13\1\137\3\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\6\13\1\257\4\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\4\13\1\240\6\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\2\13\1\320\10\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\u010d\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\u010e\10\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\u010f\12\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\5\13\1\377"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\3\13"+
+    "\1\137\4\13\1\5\4\0\1\5\1\u0110\3\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\1\13\1\237\4\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\1\u0111\12\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\2\13"+
+    "\1\u0112\5\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\5\13\1\274\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\351\12\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\13\1\240\11\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\105\4\0"+
+    "\1\105\2\u0113\1\105\1\307\1\0\2\105\1\0\3\105"+
+    "\3\307\1\u0114\1\105\1\u0114\2\307\1\105\1\0\1\307"+
+    "\1\105\1\307\2\0\1\105\1\0\1\307\1\105\13\0"+
+    "\1\307\5\105\1\0\3\105\1\307\5\105\1\310\1\0"+
+    "\35\310\1\154\40\310\1\0\7\310\1\u0115\7\310\3\u0115"+
+    "\3\310\2\u0115\2\310\1\u0115\1\310\1\u0115\1\310\1\154"+
+    "\2\310\1\u0115\14\310\1\u0115\11\310\1\u0115\6\310\1\0"+
+    "\7\310\1\u0116\7\310\3\u0116\3\310\2\u0116\2\310\1\u0116"+
+    "\1\310\1\u0116\1\310\1\154\2\310\1\u0116\14\310\1\u0116"+
+    "\11\310\1\u0116\5\310\37\0\1\311\37\0\1\310\1\0"+
+    "\7\310\1\u0117\7\310\3\u0117\3\310\2\u0117\2\310\1\u0117"+
+    "\1\310\1\u0117\1\310\1\154\2\310\1\u0117\14\310\1\u0117"+
+    "\11\310\1\u0117\5\310\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\u0118\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\4\13\1\u0119\6\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\1\137\5\13\1\0\1\5\10\13\1\157\1\0"+
+    "\102\157\1\321\3\157\1\u011a\7\157\3\u011a\3\157\2\u011a"+
+    "\2\157\1\u011a\1\157\1\u011a\3\157\1\322\1\u011a\14\157"+
+    "\1\u011a\11\157\1\u011a\12\157\1\321\3\157\1\u011b\7\157"+
+    "\3\u011b\3\157\2\u011b\2\157\1\u011b\1\157\1\u011b\3\157"+
+    "\1\322\1\u011b\14\157\1\u011b\11\157\1\u011b\12\157\1\321"+
+    "\3\157\1\35\7\157\3\35\3\157\2\35\2\157\1\35"+
+    "\1\157\1\35\3\157\1\322\1\35\14\157\1\35\11\157"+
+    "\1\35\5\157\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\4\13\1\301\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\5\13\1\377\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\377\10\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\u011c\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u011d\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\1\13\1\u011e"+
+    "\4\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\1\u011f\1\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\2\13\1\u0120\10\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\5\13\1\137\5\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\2\13\1\u0121\10\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\1\13\1\u0122\11\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u0110\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\1\13\1\u0123"+
+    "\11\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\5\13\1\265\5\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\3\13\1\137\2\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\5\13\1\u0111\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\u0124\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\u0125"+
+    "\12\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\4\13\1\u0126\6\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\2\13"+
+    "\1\u0127\5\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\6\13\1\261\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\u0128\5\13\1\174\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\2\13\1\u0129\5\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\1\13\1\377\11\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\44\0"+
+    "\1\u012a\53\0\1\356\113\0\1\u012b\130\0\1\u012c\52\0"+
+    "\1\u012d\53\0\1\362\113\0\1\u012e\130\0\1\u012f\65\0"+
+    "\1\u0130\103\0\1\u0131\32\0\1\u0132\103\0\1\u0133\32\0"+
+    "\1\232\75\0\1\u0134\100\0\1\u0133\37\0\1\230\74\0"+
+    "\1\u0135\56\0\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\5\13\1\137\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\3\13\1\265\7\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\2\13\1\354\10\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\5\5\1\0\2\5\1\0\3\5\1\121\10\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\6\5\1\0"+
+    "\12\5\4\0\5\5\1\0\2\5\1\0\14\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\1\5\1\u0136"+
+    "\4\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\3\5\1\u0137\2\5\1\0\12\5\4\0\5\5\1\0"+
+    "\2\5\1\0\3\5\1\255\10\5\1\0\3\5\2\0"+
+    "\1\5\1\0\2\5\13\0\6\5\1\0\12\5\4\0"+
+    "\5\5\1\0\2\5\1\0\2\5\1\115\11\5\1\0"+
+    "\3\5\2\0\1\5\1\0\2\5\13\0\1\5\1\121"+
+    "\4\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+    "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+    "\2\5\1\u0138\3\5\1\0\12\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\u0139\2\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\13\1\u013a\11\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\3\13\1\u013b\2\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\u013c\4\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\5\13\1\u013d\5\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\351\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+    "\1\u013e\11\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\2\13\1\174\5\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\1\13\1\u013f\4\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\3\13"+
+    "\1\u0140\4\13\1\105\4\0\5\105\1\0\2\105\1\0"+
+    "\6\105\1\u0141\1\105\1\u0141\3\105\1\0\3\105\2\0"+
+    "\1\105\1\0\2\105\13\0\6\105\1\0\12\105\4\0"+
+    "\1\105\2\u0141\2\105\1\0\2\105\1\0\14\105\1\0"+
+    "\3\105\2\0\1\105\1\0\2\105\13\0\6\105\1\0"+
+    "\11\105\1\310\1\0\7\310\1\u0142\7\310\3\u0142\3\310"+
+    "\2\u0142\2\310\1\u0142\1\310\1\u0142\1\310\1\154\2\310"+
+    "\1\u0142\14\310\1\u0142\11\310\1\u0142\6\310\1\0\7\310"+
+    "\1\u0143\7\310\3\u0143\3\310\2\u0143\2\310\1\u0143\1\310"+
+    "\1\u0143\1\310\1\154\2\310\1\u0143\14\310\1\u0143\11\310"+
+    "\1\u0143\6\310\1\0\7\310\1\u0144\7\310\3\u0144\3\310"+
+    "\2\u0144\2\310\1\u0144\1\310\1\u0144\1\310\1\311\2\310"+
+    "\1\u0144\14\310\1\u0144\11\310\1\u0144\5\310\1\5\4\0"+
+    "\1\5\1\u0145\3\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\1\200\12\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\5\157\1\321\3\157\1\u0146\7\157\3\u0146"+
+    "\3\157\2\u0146\2\157\1\u0146\1\157\1\u0146\3\157\1\322"+
+    "\1\u0146\14\157\1\u0146\11\157\1\u0146\12\157\1\321\3\157"+
+    "\1\u0147\7\157\3\u0147\3\157\2\u0147\2\157\1\u0147\1\157"+
+    "\1\u0147\3\157\1\322\1\u0147\14\157\1\u0147\11\157\1\u0147"+
+    "\5\157\1\5\4\0\1\5\1\u0148\3\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\5\13\1\u0124\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\4\13\1\u0145\3\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\5\13\1\330\5\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\13\1\u0149\11\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\6\13\1\u014a\4\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\1\13\1\u014b\11\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\4\13\1\u014c\6\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\u014d\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+    "\1\u014e\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\4\13\1\261\3\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\1\137\7\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\1\13\1\u014f\4\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\3\13\1\274\4\13"+
+    "\3\0\1\u0150\76\0\1\u012b\1\u0151\1\0\4\u012b\3\u0151"+
+    "\1\0\1\u0151\13\u012b\1\u0151\3\u012b\2\u0151\1\u012b\1\0"+
+    "\2\u012b\3\u0151\2\0\2\u0151\3\0\1\u0151\6\u012b\1\u0151"+
+    "\11\u012b\25\0\1\356\16\0\1\u012a\35\0\1\u0152\76\0"+
+    "\1\u012e\1\u0153\1\0\4\u012e\3\u0153\1\0\1\u0153\13\u012e"+
+    "\1\u0153\3\u012e\2\u0153\1\u012e\1\0\2\u012e\3\u0153\2\0"+
+    "\2\u0153\3\0\1\u0153\6\u012e\1\u0153\11\u012e\25\0\1\362"+
+    "\16\0\1\u012d\53\0\1\232\135\0\1\u0154\100\0\1\u0155"+
+    "\35\0\1\255\75\0\1\226\37\0\1\232\77\0\1\u0156"+
+    "\15\0\1\5\4\0\5\5\1\0\2\5\1\0\14\5"+
+    "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\3\5"+
+    "\1\u0157\2\5\1\0\12\5\4\0\5\5\1\0\2\5"+
+    "\1\0\2\5\1\255\11\5\1\0\3\5\2\0\1\5"+
+    "\1\0\2\5\13\0\6\5\1\0\12\5\4\0\5\5"+
+    "\1\0\2\5\1\0\14\5\1\0\3\5\2\0\1\5"+
+    "\1\0\2\5\13\0\1\5\1\u0158\4\5\1\0\12\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\3\13\1\137\7\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+    "\1\137\3\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\u013d"+
+    "\3\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\u0159\5\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\5\13\1\u015a\5\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\4\13\1\u0110\6\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\2\13\1\137\5\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\4\13\1\u015b\6\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\310"+
+    "\1\0\7\310\1\u015c\7\310\3\u015c\3\310\2\u015c\2\310"+
+    "\1\u015c\1\310\1\u015c\1\310\1\154\2\310\1\u015c\14\310"+
+    "\1\u015c\11\310\1\u015c\6\310\1\0\7\310\1\u015d\7\310"+
+    "\3\u015d\3\310\2\u015d\2\310\1\u015d\1\310\1\u015d\1\310"+
+    "\1\154\2\310\1\u015d\14\310\1\u015d\11\310\1\u015d\6\310"+
+    "\1\0\7\310\1\u015e\7\310\3\u015e\3\310\2\u015e\2\310"+
+    "\1\u015e\1\310\1\u015e\1\310\1\311\2\310\1\u015e\14\310"+
+    "\1\u015e\11\310\1\u015e\5\310\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\4\13\1\336\6\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+    "\1\0\1\5\10\13\5\157\1\321\3\157\1\325\7\157"+
+    "\3\325\3\157\2\325\2\157\1\325\1\157\1\325\3\157"+
+    "\1\322\1\325\14\157\1\325\11\157\1\325\12\157\1\321"+
+    "\3\157\1\u015f\7\157\3\u015f\3\157\2\u015f\2\157\1\u015f"+
+    "\1\157\1\u015f\3\157\1\322\1\u015f\14\157\1\u015f\11\157"+
+    "\1\u015f\5\157\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\5\13\1\174\5\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\3\13\1\u0160\7\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\2\13\1\u0145\3\13\1\0"+
+    "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\1\13\1\u0160"+
+    "\6\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\u0161\4\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\1\u0162\12\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\265"+
+    "\12\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\u0163\5\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+    "\1\13\1\0\2\13\13\0\2\13\1\u0164\3\13\1\0"+
+    "\1\5\10\13\3\0\1\u012b\76\0\1\u012e\155\0\1\u0165"+
+    "\34\0\1\255\136\0\1\u0166\16\0\1\5\4\0\5\5"+
+    "\1\0\2\5\1\0\14\5\1\0\3\5\2\0\1\5"+
+    "\1\0\2\5\13\0\2\5\1\255\3\5\1\0\12\5"+
+    "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+    "\2\0\1\5\1\0\2\5\13\0\2\5\1\u0167\3\5"+
+    "\1\0\12\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+    "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\1\13\1\174\4\13\1\0\1\5\10\13"+
+    "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+    "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+    "\13\0\6\13\1\0\1\5\5\13\1\137\2\13\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\5\13\1\u0168\5\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\310\1\0"+
+    "\7\310\1\152\7\310\3\152\3\310\2\152\2\310\1\152"+
+    "\1\310\1\152\1\310\1\154\2\310\1\152\14\310\1\152"+
+    "\11\310\1\152\6\310\1\0\7\310\1\312\7\310\3\312"+
+    "\3\310\2\312\2\310\1\312\1\310\1\312\1\310\1\154"+
+    "\2\310\1\312\14\310\1\312\11\310\1\312\6\310\1\0"+
+    "\7\310\1\152\7\310\3\152\3\310\2\152\2\310\1\152"+
+    "\1\310\1\152\1\310\1\311\2\310\1\152\14\310\1\152"+
+    "\11\310\1\152\5\310\5\157\1\321\3\157\1\323\7\157"+
+    "\3\323\3\157\2\323\2\157\1\323\1\157\1\323\3\157"+
+    "\1\322\1\323\14\157\1\323\11\157\1\323\5\157\1\5"+
+    "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+    "\4\13\1\u0169\6\13\1\0\3\13\2\0\1\13\1\0"+
+    "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+    "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+    "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\265"+
+    "\5\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\3\13\1\u016a\2\13"+
+    "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\274\12\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\10\13\1\5\4\0\1\5\1\265\3\13\1\100\1\13"+
+    "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+    "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\61\0"+
+    "\1\255\76\0\1\u016b\15\0\1\5\4\0\5\5\1\0"+
+    "\2\5\1\0\14\5\1\0\3\5\2\0\1\5\1\0"+
+    "\2\5\13\0\5\5\1\255\1\0\12\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\5\13\1\u016c"+
+    "\5\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+    "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+    "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+    "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+    "\2\13\1\265\5\13\1\5\4\0\1\5\4\13\1\100"+
+    "\1\13\1\5\1\0\1\5\1\13\1\137\11\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+    "\1\5\10\13\64\0\1\255\12\0\1\5\4\0\1\5"+
+    "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+    "\3\13\2\0\1\13\1\0\2\13\13\0\3\13\1\u013f"+
+    "\2\13\1\0\1\5\10\13";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[21231];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\2\0\3\1\1\11\10\1\1\11\17\1\1\11\4\1"+
+    "\2\11\11\1\1\11\5\1\1\11\5\1\1\11\1\1"+
+    "\1\0\1\1\1\11\12\1\1\0\1\11\40\1\1\11"+
+    "\4\1\1\11\27\1\1\11\7\0\1\11\2\0\1\11"+
+    "\7\0\1\1\1\11\7\1\1\0\43\1\1\11\10\1"+
+    "\1\11\33\1\20\0\54\1\1\0\1\1\2\0\1\1"+
+    "\7\0\32\1\7\0\16\1\2\0\4\1\1\0\1\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[364];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CSharpTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VERBATIMSTRING;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = DELIMITEDCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public CSharpTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public CSharpTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 158) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 35: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 36: break;
+        case 28: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 37: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 38: break;
+        case 30: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 39: break;
+        case 25: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 40: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 41: break;
+        case 29: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 42: break;
+        case 22: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 43: break;
+        case 31: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 44: break;
+        case 19: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 45: break;
+        case 21: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 46: break;
+        case 10: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 47: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken;
+          }
+        case 48: break;
+        case 6: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 49: break;
+        case 13: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken;
+          }
+        case 50: break;
+        case 8: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 51: break;
+        case 9: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 52: break;
+        case 32: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 53: break;
+        case 2: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 54: break;
+        case 23: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 55: break;
+        case 33: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 56: break;
+        case 20: 
+          { start = zzMarkedPos-2; yybegin(VERBATIMSTRING);
+          }
+        case 57: break;
+        case 24: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 58: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 59: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 60: break;
+        case 16: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 61: break;
+        case 18: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 62: break;
+        case 27: 
+          { start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT);
+          }
+        case 63: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT);
+          }
+        case 64: break;
+        case 7: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 65: break;
+        case 5: 
+          { addToken(Token.OPERATOR);
+          }
+        case 66: break;
+        case 26: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos;
+          }
+        case 67: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 68: break;
+        case 1: 
+          { 
+          }
+        case 69: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 70: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case VERBATIMSTRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 365: break;
+            case DOCUMENTCOMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken;
+            }
+            case 366: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 367: break;
+            case DELIMITEDCOMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 368: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex	(revision 25584)
@@ -0,0 +1,643 @@
+/*
+ * 11/13/2004
+ *
+ * CTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in the C programming
+ * language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the C programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>CTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class CTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *                    <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter				= [A-Za-z]
+LetterOrUnderscore	= ({Letter}|[_])
+Digit				= [0-9]
+HexDigit			= {Digit}|[A-Fa-f]
+OctalDigit			= [0-7]
+Exponent			= [eE][+-]?{Digit}+
+
+PreprocessorWord	= define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
+
+Trigraph				= ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
+
+OctEscape1			= ([\\]{OctalDigit})
+OctEscape2			= ([\\]{OctalDigit}{OctalDigit})
+OctEscape3			= ([\\][0-3]{OctalDigit}{OctalDigit})
+OctEscape				= ({OctEscape1}|{OctEscape2}|{OctEscape3})
+HexEscape				= ([\\][xX]{HexDigit}{HexDigit})
+
+AnyChrChr					= ([^\'\n\\])
+Escape					= ([\\]([abfnrtv\'\"\?\\0]))
+UnclosedCharLiteral			= ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
+CharLiteral				= ({UnclosedCharLiteral}[\'])
+ErrorUnclosedCharLiteral		= ([\'][^\'\n]*)
+ErrorCharLiteral			= (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
+AnyStrChr					= ([^\"\n\\])
+FalseTrigraph				= (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
+StringLiteral				= ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+
+
+LineTerminator		= \n
+WhiteSpace		= [ \t\f]
+
+MLCBegin			= "/*"
+MLCEnd			= "*/"
+LineCommentBegin	= "//"
+
+NonFloatSuffix		= (([uU][lL]?)|([lL][uU]?))
+IntegerLiteral		= ({Digit}+{Exponent}?{NonFloatSuffix}?)
+HexLiteral		= ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
+FloatLiteral		= ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
+ErrorNumberFormat	= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+NonSeparator		= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+Identifier		= ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
+ErrorIdentifier	= ({NonSeparator}+)
+
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"auto" |
+	"break" |
+	"case" |
+	"const" |
+	"continue" |
+	"default" |
+	"do" |
+	"else" |
+	"enum" |
+	"extern" |
+	"for" |
+	"goto" |
+	"if" |
+	"register" |
+	"return" |
+	"sizeof" |
+	"static" |
+	"struct" |
+	"switch" |
+	"typedef" |
+	"union" |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+
+	/* Data types. */
+	"char" |
+	"div_t" |
+	"double" |
+	"float" |
+	"int" |
+	"ldiv_t" |
+	"long" |
+	"short" |
+	"signed" |
+	"size_t" |
+	"unsigned" |
+	"void" |
+	"wchar_t"				{ addToken(Token.DATA_TYPE); }
+
+	/* Standard functions */
+	"abort" |
+	"abs" |
+	"acos" |
+	"asctime" |
+	"asin" |
+	"assert" |
+	"atan2" |
+	"atan" |
+	"atexit" |
+	"atof" |
+	"atoi" |
+	"atol" |
+	"bsearch" |
+	"btowc" |
+	"calloc" |
+	"ceil" |
+	"clearerr" |
+	"clock" |
+	"cosh" |
+	"cos" |
+	"ctime" |
+	"difftime" |
+	"div" |
+	"errno" |
+	"exit" |
+	"exp" |
+	"fabs" |
+	"fclose" |
+	"feof" |
+	"ferror" |
+	"fflush" |
+	"fgetc" |
+	"fgetpos" |
+	"fgetwc" |
+	"fgets" |
+	"fgetws" |
+	"floor" |
+	"fmod" |
+	"fopen" |
+	"fprintf" |
+	"fputc" |
+	"fputs" |
+	"fputwc" |
+	"fputws" |
+	"fread" |
+	"free" |
+	"freopen" |
+	"frexp" |
+	"fscanf" |
+	"fseek" |
+	"fsetpos" |
+	"ftell" |
+	"fwprintf" |
+	"fwrite" |
+	"fwscanf" |
+	"getchar" |
+	"getc" |
+	"getenv" |
+	"gets" |
+	"getwc" |
+	"getwchar" |
+	"gmtime" |
+	"isalnum" |
+	"isalpha" |
+	"iscntrl" |
+	"isdigit" |
+	"isgraph" |
+	"islower" |
+	"isprint" |
+	"ispunct" |
+	"isspace" |
+	"isupper" |
+	"isxdigit" |
+	"labs" |
+	"ldexp" |
+	"ldiv" |
+	"localeconv" |
+	"localtime" |
+	"log10" |
+	"log" |
+	"longjmp" |
+	"malloc" |
+	"mblen" |
+	"mbrlen" |
+	"mbrtowc" |
+	"mbsinit" |
+	"mbsrtowcs" |
+	"mbstowcs" |
+	"mbtowc" |
+	"memchr" |
+	"memcmp" |
+	"memcpy" |
+	"memmove" |
+	"memset" |
+	"mktime" |
+	"modf" |
+	"offsetof" |
+	"perror" |
+	"pow" |
+	"printf" |
+	"putchar" |
+	"putc" |
+	"puts" |
+	"putwc" |
+	"putwchar" |
+	"qsort" |
+	"raise" |
+	"rand" |
+	"realloc" |
+	"remove" |
+	"rename" |
+	"rewind" |
+	"scanf" |
+	"setbuf" |
+	"setjmp" |
+	"setlocale" |
+	"setvbuf" |
+	"setvbuf" |
+	"signal" |
+	"sinh" |
+	"sin" |
+	"sprintf" |
+	"sqrt" |
+	"srand" |
+	"sscanf" |
+	"strcat" |
+	"strchr" |
+	"strcmp" |
+	"strcmp" |
+	"strcoll" |
+	"strcpy" |
+	"strcspn" |
+	"strerror" |
+	"strftime" |
+	"strlen" |
+	"strncat" |
+	"strncmp" |
+	"strncpy" |
+	"strpbrk" |
+	"strrchr" |
+	"strspn" |
+	"strstr" |
+	"strtod" |
+	"strtok" |
+	"strtol" |
+	"strtoul" |
+	"strxfrm" |
+	"swprintf" |
+	"swscanf" |
+	"system" |
+	"tanh" |
+	"tan" |
+	"time" |
+	"tmpfile" |
+	"tmpnam" |
+	"tolower" |
+	"toupper" |
+	"ungetc" |
+	"ungetwc" |
+	"va_arg" |
+	"va_end" |
+	"va_start" |
+	"vfprintf" |
+	"vfwprintf" |
+	"vprintf" |
+	"vsprintf" |
+	"vswprintf" |
+	"vwprintf" |
+	"wcrtomb" |
+	"wcscat" |
+	"wcschr" |
+	"wcscmp" |
+	"wcscoll" |
+	"wcscpy" |
+	"wcscspn" |
+	"wcsftime" |
+	"wcslen" |
+	"wcsncat" |
+	"wcsncmp" |
+	"wcsncpy" |
+	"wcspbrk" |
+	"wcsrchr" |
+	"wcsrtombs" |
+	"wcsspn" |
+	"wcsstr" |
+	"wcstod" |
+	"wcstok" |
+	"wcstol" |
+	"wcstombs" |
+	"wcstoul" |
+	"wcsxfrm" |
+	"wctob" |
+	"wctomb" |
+	"wmemchr" |
+	"wmemcmp" |
+	"wmemcpy" |
+	"wmemmove" |
+	"wmemset" |
+	"wprintf" |
+	"wscanf"				{ addToken(Token.FUNCTION); }
+
+	/* Standard-defined macros. */
+	"__DATE__" |
+	"__TIME__" |
+	"__FILE__" |
+	"__LINE__" |
+	"__STDC__"				{ addToken(Token.PREPROCESSOR); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* Preprocessor directives */
+	"#"{WhiteSpace}*{PreprocessorWord}	{ addToken(Token.PREPROCESSOR); }
+
+	/* String/Character Literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+	{ErrorUnclosedCharLiteral}		{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment Literals. */
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Separators. */
+	"(" |
+	")" |
+	"[" |
+	"]" |
+	"{" |
+	"}"							{ addToken(Token.SEPARATOR); }
+
+	/* Operators. */
+	{Trigraph} |
+	"=" |
+	"+" |
+	"-" |
+	"*" |
+	"/" |
+	"%" |
+	"~" |
+	"<" |
+	">" |
+	"<<" |
+	">>" |
+	"==" |
+	"+=" |
+	"-=" |
+	"*=" |
+	"/=" |
+	"%=" |
+	">>=" |
+	"<<=" |
+	"^" |
+	"&" |
+	"&&" |
+	"|" |
+	"||" |
+	"?" |
+	":" |
+	"," |
+	"!" |
+	"++" |
+	"--" |
+	"." |
+	","							{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	/* Some lines will end in '\' to wrap an expression. */
+	"\\"							{ addToken(Token.IDENTIFIER); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Other punctuation, we'll highlight it as "identifiers." */
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<MLC> {
+
+	[^hwf\n\*]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java	(revision 25584)
@@ -0,0 +1,2072 @@
+/* The following code was generated by JFlex 1.4.1 on 1/25/09 9:54 PM */
+
+/*
+ * 11/13/2004
+ *
+ * CTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in the C programming
+ * language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the C programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>CTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class CTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44"+
+    "\1\57\1\60\1\65\1\114\1\33\1\31\1\31\1\51\1\7\1\64"+
+    "\1\37\1\54\1\32\1\47\1\77\1\76\1\41\4\5\2\3\1\70"+
+    "\1\63\1\34\1\30\1\35\1\27\1\61\1\103\1\4\1\111\1\102"+
+    "\1\6\1\55\2\1\1\105\2\1\1\53\1\106\1\107\4\1\1\110"+
+    "\1\104\1\52\2\1\1\42\2\1\1\62\1\40\1\62\1\113\1\2"+
+    "\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66\1\13"+
+    "\1\100\1\72\1\15\1\26\1\14\1\20\1\23\1\101\1\17\1\16"+
+    "\1\67\1\22\1\45\1\71\1\73\1\75\1\74\1\112\1\115\1\112"+
+    "\1\64\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\3\0\1\1\2\2\1\3\1\4\16\2\2\4\1\5"+
+    "\1\4\1\6\4\4\1\2\1\7\1\10\2\2\1\3"+
+    "\1\11\1\4\2\1\4\2\2\4\2\12\1\13\5\12"+
+    "\1\14\2\12\1\2\2\15\2\3\1\16\2\2\1\17"+
+    "\21\2\1\17\50\2\1\0\1\20\1\21\2\22\1\23"+
+    "\1\6\2\10\1\24\7\2\1\15\6\1\1\0\11\2"+
+    "\2\0\1\25\6\0\5\2\1\3\1\0\1\3\1\15"+
+    "\1\16\2\2\1\26\5\2\1\26\17\2\1\27\15\2"+
+    "\1\26\1\2\1\26\45\2\1\6\1\30\1\6\3\22"+
+    "\1\6\2\10\1\31\6\2\1\32\4\1\1\33\4\1"+
+    "\6\0\10\2\10\0\5\2\1\16\1\0\27\2\1\27"+
+    "\36\2\1\26\2\2\1\26\6\2\1\6\1\10\6\2"+
+    "\2\32\7\1\4\0\1\33\4\0\10\2\2\0\1\34"+
+    "\2\0\1\35\47\2\1\32\1\33\3\1\7\0\7\2"+
+    "\4\0\12\2\2\1\1\33\3\0\4\2\2\0\1\33";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[500];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+    "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u0444\0\u0492"+
+    "\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4\0\u0702"+
+    "\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u0750\0\u08d6\0\352"+
+    "\0\u0750\0\u0924\0\u0972\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa\0\u0750"+
+    "\0\u0af8\0\u0750\0\u0b46\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc"+
+    "\0\u0d1a\0\u0750\0\u0d68\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0750"+
+    "\0\u0eee\0\u0f3c\0\u0f8a\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110"+
+    "\0\u115e\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u12e4\0\u1332\0\u1380"+
+    "\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u1506\0\u1554\0\u15a2\0\u15f0"+
+    "\0\u163e\0\u168c\0\u16da\0\u1728\0\u0138\0\u1776\0\u17c4\0\u1812"+
+    "\0\u1860\0\u18ae\0\u18fc\0\u194a\0\u1998\0\u19e6\0\u1a34\0\u1a82"+
+    "\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08\0\u1c56\0\u1ca4\0\u1cf2"+
+    "\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78\0\u1ec6\0\u1f14\0\u1f62"+
+    "\0\u1fb0\0\u1ffe\0\u204c\0\u209a\0\u20e8\0\u2136\0\u2184\0\u21d2"+
+    "\0\u2220\0\u226e\0\u22bc\0\u230a\0\u2358\0\u23a6\0\u0750\0\u0750"+
+    "\0\u23f4\0\u2442\0\u0750\0\u2490\0\u24de\0\u252c\0\u0750\0\u257a"+
+    "\0\u25c8\0\u2616\0\u2664\0\u26b2\0\u2700\0\u274e\0\u279c\0\u27ea"+
+    "\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c\0\u2a5a"+
+    "\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u2c7c\0\u2cca"+
+    "\0\u2d18\0\u0750\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e\0\u2eec"+
+    "\0\u2f3a\0\u2f88\0\u2fd6\0\u3024\0\u3072\0\u30c0\0\u310e\0\u0fd8"+
+    "\0\u315c\0\u0fd8\0\u31aa\0\u31f8\0\u3246\0\u3294\0\u32e2\0\u3330"+
+    "\0\u337e\0\u33cc\0\u0138\0\u341a\0\u3468\0\u34b6\0\u3504\0\u3552"+
+    "\0\u35a0\0\u35ee\0\u363c\0\u368a\0\u36d8\0\u3726\0\u3774\0\u37c2"+
+    "\0\u3810\0\u385e\0\u0138\0\u38ac\0\u38fa\0\u3948\0\u3996\0\u39e4"+
+    "\0\u3a32\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06\0\u3c54"+
+    "\0\u3ca2\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u3e76\0\u3ec4"+
+    "\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6\0\u4134"+
+    "\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356\0\u43a4"+
+    "\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6\0\u4614"+
+    "\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u47e8\0\u4836\0\u4884"+
+    "\0\u48d2\0\u0750\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58\0\u4aa6"+
+    "\0\u4af4\0\u0750\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8"+
+    "\0\u4d16\0\u4d64\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38"+
+    "\0\u4f86\0\u4fd4\0\u5022\0\u5070\0\u50be\0\u510c\0\u515a\0\u51a8"+
+    "\0\u51f6\0\u5244\0\u5292\0\u52e0\0\u532e\0\u537c\0\u53ca\0\u5418"+
+    "\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec\0\u563a\0\u5688"+
+    "\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e\0\u585c\0\u58aa\0\u58f8"+
+    "\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e\0\u5acc\0\u5b1a\0\u5b68"+
+    "\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee\0\u5d3c\0\u5d8a\0\u5dd8"+
+    "\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e\0\u5fac\0\u5ffa\0\u6048"+
+    "\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce\0\u621c\0\u626a\0\u62b8"+
+    "\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e\0\u648c\0\u64da\0\u6528"+
+    "\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae\0\u66fc\0\u674a\0\u6798"+
+    "\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e\0\u696c\0\u69ba\0\u6a08"+
+    "\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e\0\u6bdc\0\u6c2a\0\u6c78"+
+    "\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe\0\u6e4c\0\u6e9a\0\u6ee8"+
+    "\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e\0\u70bc\0\u710a\0\u7158"+
+    "\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de\0\u732c\0\u737a\0\u73c8"+
+    "\0\u7416\0\u7464\0\u74b2\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638"+
+    "\0\u7686\0\u76d4\0\u7722\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8"+
+    "\0\u78f6\0\u7944\0\u7992\0\u3d3e\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca"+
+    "\0\u7b18\0\u7b66\0\u7bb4\0\u7c02\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a"+
+    "\0\u7d88\0\u7dd6\0\u7e24\0\u7e72\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa"+
+    "\0\u7ff8\0\u8046\0\u8094\0\u80e2\0\u8130\0\u817e\0\u81cc\0\u821a"+
+    "\0\u8268\0\u82b6\0\u8304\0\u8352\0\u83a0\0\u83ee\0\u0fd8\0\352"+
+    "\0\u843c\0\u848a\0\u84d8\0\u8526\0\u8574\0\u85c2\0\u8610\0\u865e"+
+    "\0\u86ac\0\u86fa\0\u8748\0\u8796\0\u87e4\0\u8832\0\u8880\0\u3246"+
+    "\0\u88ce\0\u891c\0\u7770\0\u896a\0\u785a\0\u89b8\0\u8a06\0\u8a54"+
+    "\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda\0\u8c28\0\u8c76\0\u8cc4"+
+    "\0\u8d12\0\u0750\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a\0\u8e98\0\u8ee6"+
+    "\0\u8f34\0\u8f82\0\u8fd0\0\u0138";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[500];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\4\1\5\1\6\1\7\1\5\1\7\1\5\1\10"+
+    "\1\11\1\12\1\13\1\14\1\5\1\15\1\16\1\17"+
+    "\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27"+
+    "\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37"+
+    "\1\40\1\7\1\5\1\41\1\42\1\43\1\44\1\45"+
+    "\1\46\1\30\2\5\1\47\1\5\1\50\1\51\2\4"+
+    "\1\31\1\52\1\36\1\30\1\5\1\53\1\36\1\54"+
+    "\4\5\2\7\1\5\1\55\10\5\1\31\1\36\1\56"+
+    "\1\57\12\60\1\61\30\60\1\62\5\60\1\63\14\60"+
+    "\1\64\2\60\1\65\24\60\12\66\1\67\30\66\1\70"+
+    "\22\66\1\71\2\66\1\72\24\66\7\4\1\0\17\4"+
+    "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+    "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\73"+
+    "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\74\1\7\1\74"+
+    "\1\7\1\75\1\0\1\74\1\75\3\74\1\76\4\74"+
+    "\1\77\4\74\11\0\1\74\1\7\1\74\2\0\2\74"+
+    "\1\7\2\0\1\77\1\76\1\100\1\74\1\0\3\74"+
+    "\4\0\2\74\1\0\5\74\2\7\12\74\13\0\1\36"+
+    "\20\0\1\36\65\0\1\4\6\5\1\0\1\5\1\101"+
+    "\1\5\1\102\4\5\1\103\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\104\1\105\1\5\1\106\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\2\5\1\107\16\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\110\1\111\2\5\1\112\1\113\1\114\1\115\1\116"+
+    "\1\5\1\117\1\120\1\121\1\122\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\123\1\0\1\124\20\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\125\1\5\1\126"+
+    "\1\5\1\127\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\130\7\5\1\131\3\5\1\120\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\132\1\5\1\133\2\5"+
+    "\1\134\1\135\1\5\1\136\1\5\1\137\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\140\1\141\1\0"+
+    "\1\142\3\5\1\143\3\5\1\144\10\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\145\12\5\1\146\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\147\14\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\150\3\5\1\151"+
+    "\2\5\1\152\3\5\1\153\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\154\1\155\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\4\5\1\156\12\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\157\5\5\1\160\1\161"+
+    "\1\5\1\162\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\163\2\5\1\164\1\165\4\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\166\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\167"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\170"+
+    "\6\5\1\165\5\5\1\171\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\172\6\5\1\173\3\5\1\174\2\5"+
+    "\11\0\1\4\2\5\2\0\1\5\1\175\1\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\1\5\1\171\17\5\33\0\1\176\116\0"+
+    "\1\36\233\0\1\36\1\0\1\177\16\0\1\200\44\0"+
+    "\27\201\1\202\3\201\1\203\4\201\1\204\2\201\1\0"+
+    "\52\201\34\0\1\30\116\0\1\30\110\0\1\36\6\0"+
+    "\1\36\56\0\40\42\1\205\2\42\1\206\1\207\51\42"+
+    "\1\4\6\5\1\0\2\5\1\210\3\5\1\210\1\5"+
+    "\1\211\2\5\1\137\1\212\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\213\20\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\214\1\215\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\216\1\0"+
+    "\21\5\4\0\3\74\1\7\1\74\1\7\1\75\1\0"+
+    "\1\74\1\75\3\74\1\76\4\74\1\77\4\74\11\0"+
+    "\1\74\1\7\1\217\2\0\2\74\1\7\2\0\1\77"+
+    "\1\76\1\100\1\74\1\0\3\74\4\0\2\74\1\0"+
+    "\2\74\1\217\2\74\2\7\12\74\54\0\1\46\50\0"+
+    "\1\100\1\0\1\100\33\0\1\100\5\0\1\100\26\0"+
+    "\2\100\16\0\7\4\1\0\1\220\1\221\1\4\1\222"+
+    "\1\4\1\223\4\4\1\224\1\225\3\4\11\0\3\4"+
+    "\2\0\3\4\1\226\1\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\1\4\6\5"+
+    "\1\0\3\5\1\227\4\5\1\230\3\5\1\231\1\5"+
+    "\1\232\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\4\5\1\233\14\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\134\2\5\1\234\1\5\1\137\2\5\1\235"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\236\1\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\237"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\120\0\1\36\116\0\1\36\12\60\1\0"+
+    "\30\60\1\0\5\60\1\0\14\60\1\0\2\60\1\0"+
+    "\24\60\13\0\1\240\53\0\1\241\60\0\1\242\152\0"+
+    "\1\243\117\0\1\244\24\0\12\66\1\0\30\66\1\0"+
+    "\22\66\1\0\2\66\1\0\24\66\13\0\1\245\53\0"+
+    "\1\246\115\0\1\247\117\0\1\250\24\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\1\5\1\251\1\0\1\252\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\11\5\1\253\1\5\1\254\3\5"+
+    "\1\255\1\5\4\0\7\74\1\0\17\74\11\0\3\74"+
+    "\2\0\3\74\2\0\2\74\1\0\1\74\1\0\3\74"+
+    "\4\0\2\74\1\0\21\74\4\0\3\74\1\256\1\74"+
+    "\1\256\1\74\1\257\17\74\10\0\1\257\1\74\1\256"+
+    "\1\74\2\0\2\74\1\256\2\0\2\74\1\0\1\74"+
+    "\1\0\3\74\4\0\2\74\1\0\5\74\2\256\12\74"+
+    "\4\0\7\74\1\0\12\74\1\260\4\74\11\0\3\74"+
+    "\2\0\3\74\2\0\1\260\1\74\1\0\1\74\1\0"+
+    "\3\74\4\0\2\74\1\0\21\74\4\0\7\74\1\0"+
+    "\5\74\1\260\11\74\11\0\3\74\2\0\3\74\2\0"+
+    "\1\74\1\260\1\0\1\74\1\0\3\74\4\0\2\74"+
+    "\1\0\21\74\4\0\3\74\1\100\1\74\1\100\1\261"+
+    "\1\0\1\74\1\261\1\262\2\74\1\262\11\74\11\0"+
+    "\1\74\1\100\1\74\2\0\2\74\1\100\2\0\1\74"+
+    "\1\262\1\0\1\262\1\0\3\74\4\0\2\74\1\0"+
+    "\5\74\2\100\12\74\4\0\1\4\6\5\1\0\2\5"+
+    "\1\263\14\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\2\5"+
+    "\1\264\14\5\11\0\1\4\2\5\2\0\1\265\2\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\12\5\1\266\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\12\5\1\267\4\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\270\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\271\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\272\7\5\1\273\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\274\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\275\1\276\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\5\5\1\277\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\300\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\301\7\5\1\136"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\302"+
+    "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\125"+
+    "\3\5\1\303\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\5\5\1\304\11\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\160\2\5\1\305\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\5"+
+    "\1\306\1\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\307\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\310\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\311\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\6\5\1\134\1\312\3\5\1\137\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\313\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\314\4\5\1\315\1\316"+
+    "\2\5\1\317\1\320\1\321\1\322\1\323\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\2\5"+
+    "\1\324\16\5\4\0\1\4\6\5\1\0\1\5\1\325"+
+    "\1\5\1\326\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\4\5\1\327\4\5\1\330\3\5\1\331\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\332\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\4\5\1\333\10\5\1\334\1\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\3\5\1\335\15\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\136\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\336\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+    "\1\337\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\160\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\340\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\341\4\5\1\342\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\343\2\5\1\134\4\5\1\137\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\344\10\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\272\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\345\7\5"+
+    "\1\174\1\346\1\347\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\350\1\0\1\351\20\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\352\1\310\12\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\2\5\1\353\14\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\3\5\1\354\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\355\6\5\1\356\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\357\1\5"+
+    "\1\333\10\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\360\1\270\10\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\14\5\1\361\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\227\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\362\2\5\1\363\6\5\1\364\1\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\275\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\365\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\273\20\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\366\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\367\2\5\1\370\2\5\1\171"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\306"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\371\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\273\1\5"+
+    "\1\144\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\372\6\5\1\373\3\5\1\374\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\375\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\155\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\376\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\276\16\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\360\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\303\1\377\1\u0100\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\216\1\0\21\5\34\0\10\36"+
+    "\56\0\33\u0101\1\u0102\7\u0101\1\0\101\u0101\1\u0103\3\u0101"+
+    "\1\u0102\7\u0101\1\0\57\u0101\1\u0104\4\u0101\1\201\1\u0101"+
+    "\1\201\2\u0101\1\201\4\u0101\1\201\2\u0101\1\201\3\u0101"+
+    "\1\u0105\4\u0101\1\201\1\u0106\1\u0107\1\0\3\201\1\u0106"+
+    "\17\u0101\1\201\3\u0101\1\u0107\2\u0101\2\u0106\16\u0101\5\206"+
+    "\1\42\4\206\1\42\1\206\1\42\2\206\1\42\4\206"+
+    "\1\42\2\206\1\42\3\206\1\42\4\206\2\42\1\u0108"+
+    "\1\0\4\42\17\206\1\42\3\206\1\u0108\2\206\2\42"+
+    "\56\206\1\u0109\3\206\1\u010a\51\206\1\4\6\5\1\0"+
+    "\13\5\1\137\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\213\20\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u010b\1\5\1\u010c\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\1\5\1\u010d\4\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\137\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u010e\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u010f\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u0110\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\3\74\4\u0111\1\0\3\u0111\6\74\1\u0111\2\74\1\u0111"+
+    "\2\74\11\0\1\74\1\u0111\1\74\2\0\1\74\2\u0111"+
+    "\2\0\2\74\1\0\1\u0111\1\0\3\74\4\0\2\74"+
+    "\1\0\5\74\2\u0111\2\74\2\u0111\5\74\1\u0111\4\0"+
+    "\7\4\1\0\1\4\1\u0112\15\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\4\4\1\u0113"+
+    "\1\u0114\1\4\1\u0115\7\4\11\0\3\4\2\0\3\4"+
+    "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+    "\1\0\21\4\4\0\7\4\1\0\2\4\1\u0116\1\4"+
+    "\1\u0117\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\3\4\1\u0118\13\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\4\4"+
+    "\1\u0119\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\7\4\1\u011a\7\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\14\0\1\u011b\1\u011c\1\0"+
+    "\1\u011d\1\0\1\u011e\4\0\1\u011f\1\u0120\24\0\1\226"+
+    "\45\0\1\4\6\5\1\0\16\5\1\u0121\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\315\4\5\1\320\4\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\4\5\1\333\12\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0122\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0123\3\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u0124\1\u0125"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u0126"+
+    "\1\u0127\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\172\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u0128\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\144\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\21\0\1\u0129\123\0\1\u012a\161\0"+
+    "\1\u012b\117\0\1\u012c\41\0\1\u012d\123\0\1\u012e\161\0"+
+    "\1\u012f\117\0\1\u0130\24\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0131\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0132\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\12\5\1\u0133\6\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\14\5\1\u0134\4\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\13\5\1\u0135\5\5\4\0\3\74\1\256\1\74\1\256"+
+    "\1\74\1\0\5\74\1\76\4\74\1\77\4\74\11\0"+
+    "\1\74\1\256\1\74\2\0\2\74\1\256\2\0\1\77"+
+    "\1\76\1\0\1\74\1\0\3\74\4\0\2\74\1\0"+
+    "\5\74\2\256\12\74\7\0\1\256\1\0\1\256\33\0"+
+    "\1\256\5\0\1\256\26\0\2\256\16\0\3\74\1\u0136"+
+    "\1\74\1\u0136\1\74\1\u0137\17\74\10\0\1\u0137\1\74"+
+    "\1\u0136\1\74\2\0\2\74\1\u0136\2\0\2\74\1\0"+
+    "\1\74\1\0\3\74\4\0\2\74\1\0\5\74\2\u0136"+
+    "\12\74\4\0\1\4\6\5\1\0\14\5\1\u0138\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\2\5\1\171\14\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\1\5\1\126\4\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\5\1\u0139\1\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\16\5\1\125\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\125\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u013a\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\273\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u013b\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u013c\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\2\5\1\273\14\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\12\5\1\u013d\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u013e\3\5\1\126\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u013f\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0140"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\273"+
+    "\6\5\1\u0141\3\5\1\310\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\2\5\1\u0142\16\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\367\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\352\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u0143\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\273\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0144\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\273\16\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\354\11\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u0145\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\3\5\1\u0146\13\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u0147\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u0148\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u0149\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u014a\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\u014b\2\5\1\u014c\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u014d\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u014e\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\314\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\2\5\1\u0142\16\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\265"+
+    "\2\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\15\5\1\u014f\1\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u0150\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\6\5\1\u0151\12\5\4\0\1\4\6\5"+
+    "\1\0\5\5\1\u0152\11\5\11\0\1\4\2\5\2\0"+
+    "\1\u0153\1\u0154\1\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\7\5\1\u0155"+
+    "\11\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\273\1\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u0156\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0157\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\310\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\276\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\7\5\1\126\7\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\157\1\171\1\5"+
+    "\1\u0158\1\303\1\u0159\1\u015a\1\5\1\u015b\1\u015c\1\u015d"+
+    "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u015e\1\0\2\5\1\u015f\16\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0160\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0161\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0162"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\227"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u0163"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0164"+
+    "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\12\5\1\u013b"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\336"+
+    "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0121"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0165"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\273"+
+    "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0166"+
+    "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u013f"+
+    "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0167"+
+    "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0168\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\u0169\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\313\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+    "\1\u016a\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\u016b\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u016c\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u016d\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+    "\1\273\2\5\1\u016e\5\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\u016f\20\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\273\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\144\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\125\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\2\5\1\u0170\16\5\4\0\1\4"+
+    "\6\5\1\0\2\5\2\273\1\5\1\273\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u0171\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u0172\4\5\1\273"+
+    "\2\5\1\u016e\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\u016f\20\5\4\0\1\4\6\5"+
+    "\1\0\6\5\1\u0173\2\5\1\u0174\4\5\1\347\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u0175\3\5\1\u0176"+
+    "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u0177\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+    "\1\303\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\216\1\0\21\5\4\0\33\u0101\1\203\7\u0101"+
+    "\1\0\102\u0101\3\201\1\u0105\4\201\3\u0101\1\0\57\u0101"+
+    "\1\201\25\u0101\1\u0102\5\u0101\1\201\1\u0101\1\0\3\u0101"+
+    "\1\201\26\u0101\2\201\16\u0101\33\0\1\u0102\62\0\5\u0101"+
+    "\1\u0104\25\u0101\1\u0102\5\u0101\1\u0104\1\u0101\1\0\3\u0101"+
+    "\1\u0104\26\u0101\2\u0104\21\u0101\4\u0178\1\u0101\3\u0178\6\u0101"+
+    "\1\u0178\2\u0101\1\u0178\6\u0101\1\203\5\u0101\1\u0178\1\u0101"+
+    "\1\0\2\u0101\2\u0178\5\u0101\1\u0178\20\u0101\2\u0178\2\u0101"+
+    "\2\u0178\5\u0101\1\u0178\4\u0101\3\206\4\u0179\1\206\3\u0179"+
+    "\6\206\1\u0179\2\206\1\u0179\13\206\1\u0109\1\u0179\2\206"+
+    "\1\u010a\1\206\2\u0179\5\206\1\u0179\20\206\2\u0179\2\206"+
+    "\2\u0179\5\206\1\u0179\47\206\1\0\52\206\1\4\6\5"+
+    "\1\0\1\313\16\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\14\5\1\u017a\2\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\336\4\5\1\u017b\5\5\1\u017c\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u017d\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\14\5\1\u017e\2\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\u017f\20\5\4\0"+
+    "\3\74\4\u0111\1\0\3\u0111\2\74\1\u0180\3\74\1\u0111"+
+    "\1\u0181\1\74\1\u0111\2\74\11\0\1\74\1\u0111\1\74"+
+    "\2\0\1\74\2\u0111\2\0\1\u0181\1\u0180\1\0\1\u0111"+
+    "\1\0\3\74\4\0\2\74\1\0\5\74\2\u0111\2\74"+
+    "\2\u0111\5\74\1\u0111\4\0\7\4\1\0\2\4\1\223"+
+    "\14\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\1\u0182\16\4\11\0\3\4\2\0\3\4"+
+    "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+    "\1\0\21\4\4\0\7\4\1\0\3\4\1\u0183\2\4"+
+    "\1\u0184\10\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\4\0\7\4\1\0\7\4\1\u0185\7\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\1\u0186"+
+    "\3\4\1\u0119\12\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\11\4\1\u0187\5\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\4\4\1\u0184\12\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\1\u0186\16\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\14\4"+
+    "\1\u0188\2\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\15\0\1\u0189\120\0\1\u018a\1\u018b\1\0\1\u018c\110\0"+
+    "\1\u018d\1\0\1\u018e\114\0\1\u018f\116\0\1\u0190\120\0"+
+    "\1\u0191\76\0\1\4\6\5\1\0\1\5\1\273\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\2\5\1\u0192\1\5"+
+    "\1\u0193\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\u0194\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\2\5"+
+    "\1\171\1\5\1\u0158\1\303\1\u0159\1\u0195\1\5\1\u015b"+
+    "\1\5\1\u015d\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u0196\1\0\2\5\1\u015f\16\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0197\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\14\5\1\u0198\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\u0199\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\5\5\1\270\11\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\15\0\1\u012a"+
+    "\174\0\1\u019a\50\0\1\u019b\146\0\1\u019c\52\0\1\u012e"+
+    "\174\0\1\u019d\50\0\1\u019e\146\0\1\u019f\41\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\16\5\1\u01a0\2\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\1\5\1\u01a0\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\13\5\1\u01a0\5\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\15\5\1\u01a0\3\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\11\5\1\u01a1\7\5\4\0\3\74\1\u0136"+
+    "\1\74\1\u0136\1\74\1\0\2\74\1\262\2\74\1\262"+
+    "\11\74\11\0\1\74\1\u0136\1\74\2\0\2\74\1\u0136"+
+    "\2\0\1\74\1\262\1\0\1\262\1\0\3\74\4\0"+
+    "\2\74\1\0\5\74\2\u0136\12\74\7\0\1\u0136\1\0"+
+    "\1\u0136\33\0\1\u0136\5\0\1\u0136\26\0\2\u0136\16\0"+
+    "\1\4\6\5\1\0\12\5\1\u01a2\4\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\5\5\1\u01a3\11\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\273\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u016a\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u013e\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\u01a4\10\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\273\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\1\5\1\273\17\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\164\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\303\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\273\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\6\5\1\273\2\5\1\273\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\u01a5\20\5\4\0\1\4\6\5\1\0\6\5\1\273"+
+    "\2\5\1\273\1\5\1\164\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\u01a5\20\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\u0121\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\15\5\1\u0170\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\u01a6\20\5\4\0\1\4\6\5"+
+    "\1\0\14\5\1\u01a7\2\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\13\5\1\u01a6\3\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\3\5\1\u01a9\13\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\4\5\1\u01aa\12\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\4\5\1\u01ab\6\5\1\u01ac\3\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\14\5\1\u01ad\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\7\5\1\u0155\11\5\4\0\1\4"+
+    "\6\5\1\0\5\5\1\u01ae\11\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\2\5"+
+    "\1\273\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u01af\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\u0154"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\12\5\1\276\4\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\16\5\1\u0142\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\u010b\12\5\1\354\2\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\1\5\1\126\4\5\1\0\10\5\1\u01b0\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u01b1\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\13\5\1\367\3\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u013e\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01b2\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01b3\1\5"+
+    "\1\311\2\5\1\u01b4\1\272\1\5\1\u0142\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\u013e\1\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u0167\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\1\5\1\u01b5\1\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\u01b6\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\2\5\1\u01b7\14\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\3\5\1\u01b8\13\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\u01b9\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01ba\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\6\5\1\u01bb\10\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\1\u0121\2\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\5\1\u01bc\15\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u01bd\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\125\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\3\5\1\u01be\13\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\10\5\1\u017f\6\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\125\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\15\5\1\u01bf\1\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\5\1\u01c0\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\276\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u01c1"+
+    "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\u016e\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+    "\1\272\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\5\5\1\273\13\5\4\0\1\4\6\5\1\0\4\5"+
+    "\1\u01c2\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+    "\1\272\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+    "\1\u01b4\2\5\1\u0142\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\u013e\1\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\4\5\1\u0170\12\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\u0177\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\10\5\1\u01c3\6\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\3\u0101\4\201\1\u0101"+
+    "\3\201\6\u0101\1\201\2\u0101\1\201\6\u0101\1\203\5\u0101"+
+    "\1\201\1\u0101\1\0\2\u0101\2\201\5\u0101\1\201\20\u0101"+
+    "\2\201\2\u0101\2\201\5\u0101\1\201\4\u0101\3\206\4\42"+
+    "\1\206\3\42\6\206\1\42\2\206\1\42\13\206\1\u0109"+
+    "\1\42\2\206\1\u010a\1\206\2\42\5\206\1\42\20\206"+
+    "\2\42\2\206\2\42\5\206\1\42\4\206\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\1\5\1\236\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+    "\1\u01c4\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u01c5\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+    "\1\u01c6\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\1\5\1\125\17\5\4\0\1\4\6\5\1\0\11\5"+
+    "\1\273\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\21\5\4\0\7\74\1\0\12\74\1\u01c7"+
+    "\4\74\11\0\3\74\2\0\3\74\2\0\1\u01c7\1\74"+
+    "\1\0\1\74\1\0\3\74\4\0\2\74\1\0\21\74"+
+    "\4\0\7\74\1\0\5\74\1\u01c7\11\74\11\0\3\74"+
+    "\2\0\3\74\2\0\1\74\1\u01c7\1\0\1\74\1\0"+
+    "\3\74\4\0\2\74\1\0\21\74\4\0\7\4\1\0"+
+    "\3\4\1\u0183\13\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\2\4\1\u01c8\14\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u01c8\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\10\4\1\u01c9\6\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\1\4\1\u0183\15\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\4\0\7\4\1\0\5\4\1\u01ca\11\4\11\0"+
+    "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+    "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+    "\15\4\1\u01cb\1\4\11\0\3\4\2\0\3\4\2\0"+
+    "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+    "\21\4\16\0\1\u011e\113\0\1\u01cc\120\0\1\u01cd\2\0"+
+    "\1\u01ce\116\0\1\u01cf\106\0\1\u01d0\3\0\1\u0190\122\0"+
+    "\1\u01d1\110\0\1\u01ce\111\0\1\u01d0\131\0\1\u01d2\71\0"+
+    "\1\4\6\5\1\0\3\5\1\u01d3\13\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\u01ba\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\u01d4\16\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\u01b2\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\5\1\u01d5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u01d6\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\10\5\1\u01d7\6\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u01d8\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\16\5\1\u01d9\11\0\1\4\2\5"+
+    "\2\0\1\5\1\273\1\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\36\0\1\u01da\101\0\1\u012a\51\0\1\u019a\26\0\1\u019c"+
+    "\1\u01db\4\u019c\1\u01db\17\u019c\3\u01db\1\u019c\1\u01db\2\0"+
+    "\2\u01db\1\0\2\u019c\2\0\3\u019c\1\0\1\u01db\2\u019c"+
+    "\1\u01db\1\u019c\1\0\1\u01db\1\u019c\5\u01db\2\u019c\1\u01db"+
+    "\21\u019c\2\0\1\u01db\33\0\1\u01dc\101\0\1\u012e\51\0"+
+    "\1\u019d\26\0\1\u019f\1\u01dd\4\u019f\1\u01dd\17\u019f\3\u01dd"+
+    "\1\u019f\1\u01dd\2\0\2\u01dd\1\0\2\u019f\2\0\3\u019f"+
+    "\1\0\1\u01dd\2\u019f\1\u01dd\1\u019f\1\0\1\u01dd\1\u019f"+
+    "\5\u01dd\2\u019f\1\u01dd\21\u019f\2\0\1\u01dd\1\0\1\4"+
+    "\5\5\1\u01de\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+    "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+    "\2\5\1\0\20\5\1\u01de\4\0\1\4\6\5\1\0"+
+    "\5\5\1\u0167\11\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\1\5\1\313\15\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\6\5\1\273\2\5\1\273\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\1\5\1\u013e\15\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\u0121\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\7\5\1\354\7\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\4\5\1\272\12\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\272\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\12\5\1\u01ba\4\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\1\u01df\1\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\13\5\1\u01a4\3\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\1\5\1\u01e0\15\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\1\5\1\155\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\11\5\1\u01e1\5\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\2\5\1\125\14\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+    "\6\5\1\0\13\5\1\u01b4\1\272\1\5\1\u0142\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\1\u013e\1\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\13\5\1\367\3\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\4\5\1\273\14\5\4\0"+
+    "\1\4\6\5\1\0\7\5\1\u013f\7\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\1\273\4\5\1\273\4\5\1\354"+
+    "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\1\5\1\273\17\5\4\0\1\4\6\5\1\0"+
+    "\7\5\1\u01ba\7\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\11\5\1\125\5\5\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+    "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\125"+
+    "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\16\5"+
+    "\1\273\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+    "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+    "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\1\5\1\u01e2\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\1\5\1\u01e3\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01e4\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01e5\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\4\5\1\u01e6\12\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\11\5\1\273\5\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u017f"+
+    "\20\5\4\0\1\4\6\5\1\0\14\5\1\u013e\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+    "\2\5\2\0\1\273\2\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+    "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+    "\1\5\1\4\4\0\2\5\1\0\1\u01e7\20\5\4\0"+
+    "\1\4\6\5\1\0\14\5\1\144\2\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\15\5\1\273\1\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\1\4\6\5\1\0\11\5\1\u01a4\5\5\11\0\1\4"+
+    "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+    "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+    "\7\4\1\0\7\4\1\u01c8\7\4\11\0\3\4\2\0"+
+    "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+    "\2\4\1\0\21\4\4\0\7\4\1\0\12\4\1\u01e8"+
+    "\4\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+    "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+    "\7\4\1\0\16\4\1\u01e9\11\0\3\4\2\0\3\4"+
+    "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+    "\1\0\21\4\17\0\1\u01cd\114\0\1\u01ea\114\0\1\u01ea"+
+    "\124\0\1\u01eb\106\0\1\u01cd\121\0\1\u01ec\125\0\1\u01ed"+
+    "\70\0\1\4\6\5\1\0\5\5\1\u0121\11\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\5\1\u01b0\15\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\10\5\1\u01ee\6\5\11\0"+
+    "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+    "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+    "\4\0\1\4\6\5\1\0\1\273\4\5\1\273\4\5"+
+    "\1\354\3\5\1\120\11\0\1\4\2\5\2\0\3\5"+
+    "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+    "\4\0\2\5\1\0\1\5\1\273\17\5\4\0\1\4"+
+    "\6\5\1\0\16\5\1\u01d9\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\273"+
+    "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\36\0\1\u019c\115\0"+
+    "\1\u019f\63\0\1\4\1\5\1\u01ef\4\5\1\0\17\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\273\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01f0\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\14\5\1\u01d3\2\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u01f1\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\10\5\1\276\6\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\7\5\1\u013e\7\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\12\5\1\270\4\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\1\5\1\u010b\15\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\1\4\6\5\1\0\11\5\1\306\5\5"+
+    "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+    "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+    "\21\5\4\0\7\4\1\0\1\u0184\16\4\11\0\3\4"+
+    "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+    "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\14\4"+
+    "\1\u01c8\2\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+    "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+    "\23\0\1\u01ea\120\0\1\u01f2\121\0\1\u01f3\67\0\1\4"+
+    "\6\5\1\0\16\5\1\120\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\1\5"+
+    "\1\u01f4\4\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\10\5\1\u0172\6\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+    "\1\0\7\5\1\125\7\5\11\0\1\4\2\5\2\0"+
+    "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+    "\1\4\4\0\2\5\1\0\21\5\14\0\1\u01ce\131\0"+
+    "\1\u01ea\71\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[36894];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\3\0\25\1\1\11\4\1\1\11\2\1\1\11\6\1"+
+    "\1\11\1\1\1\11\7\1\1\11\5\1\1\11\105\1"+
+    "\1\0\2\11\2\1\1\11\3\1\1\11\16\1\1\0"+
+    "\11\1\2\0\1\11\6\0\6\1\1\0\122\1\1\11"+
+    "\7\1\1\11\20\1\6\0\10\1\10\0\6\1\1\0"+
+    "\121\1\4\0\1\1\4\0\10\1\2\0\1\1\2\0"+
+    "\55\1\7\0\7\1\4\0\14\1\1\11\3\0\4\1"+
+    "\2\0\1\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[500];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public CTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *                    <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill(){
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public CTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public CTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 184) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 27: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 30: break;
+        case 7: 
+          { addNullToken(); return firstToken;
+          }
+        case 31: break;
+        case 24: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 32: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 33: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 34: break;
+        case 9: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 35: break;
+        case 26: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 36: break;
+        case 18: 
+          { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+          }
+        case 37: break;
+        case 25: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 38: break;
+        case 14: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 39: break;
+        case 15: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 40: break;
+        case 5: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 41: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 42: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 43: break;
+        case 16: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 44: break;
+        case 22: 
+          { addToken(Token.FUNCTION);
+          }
+        case 45: break;
+        case 6: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 46: break;
+        case 8: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 23: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 48: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 49: break;
+        case 19: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 50: break;
+        case 20: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 51: break;
+        case 29: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 52: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 53: break;
+        case 13: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 54: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 55: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 56: break;
+        case 10: 
+          { 
+          }
+        case 57: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 58: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 501: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 502: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 503: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex	(revision 25584)
@@ -0,0 +1,529 @@
+/*
+ * 12/23/2010
+ *
+ * ClojureTokenMaker.java - Scanner for Clojure.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Clojure programming language.<p>
+ *
+ * This was graciously donated by the folks at the
+ * <a href="http://pacific.mpi-cbg.de/wiki/index.php/Fiji">Fiji</a> project.
+ * Its original location was
+ * <a href="http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?p=fiji.git;a=tree;f=src-plugins/Script_Editor/fiji/scripting;hb=935d85d9d88dd780c6d5f2765937ddc18b5008ca">here</a>.
+ * <p>
+ * 
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ClojureTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ *
+ */
+%%
+
+%public
+%class ClojureTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ClojureTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { ";", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			/*case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;*/
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+
+LineCommentBegin						= (";")
+Keyword                                 =  ([:][a-zA-Z?!\-+*/][a-zA-Z0-9?!\-+*/]*)
+NonzeroDigit						    = [1-9]
+Digit							        = ("0"|{NonzeroDigit})
+HexDigit							    = ({Digit}|[A-Fa-f])
+OctalDigit						        = ([0-7])
+EscapedSourceCharacter				    = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape							        = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+AnyCharacterButDoubleQuoteOrBackSlash	= ([^\\\"\n])
+UnclosedStringLiteral					= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral						= ({UnclosedStringLiteral}[\"])
+StringLiteral                           = ([\"])
+CharLiteral                        		= ("\\."|"\\space"|"\\tab"|"\\newline")
+AnyCharacter                            = ([.]*)
+Separator								= ([\(\)\{\}\[\]])
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'])
+
+BooleanLiteral						=("true"|"false")
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+
+Nil                         = ("nil")
+Quote                       = (\('\|`\))
+Unquote                     = (\(\~@\|\~\))
+DispatchStart               = ("#^"|"#^{")
+Dispatch 					= ({DispatchStart}[^\s\t\n;\"}]*([ \t\n;\"]|"}"))
+VarQuote                    = ("#'"[.]*[ \t\n;(\"])
+DefName 					= (\s*[a-zA-Z0-9?!\-+*\./<>]*)
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"<"|"*"|">="|"%"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|">>>")
+AssignmentOperator			= ("=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+Letter					= [A-Za-z]
+LetterOrUnderscore		= ({Letter}|[_])
+Digit					= [0-9]
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+"fn" |
+"if" |
+"cond" |
+"def" |
+"defn" |
+"let" |
+"new" |
+"defmacro" |
+"recur" |
+"loop" |
+"thisfn" |
+"do" |
+"quote" |
+"the-var" |
+"class" |
+"instance?" |
+"throw" |
+"try-finally" |
+"set!" |
+"monitor-enter" |
+"monitor-exit"				{ addToken(Token.RESERVED_WORD); }
+
+"load-file" |
+"eql-ref?" |
+"list" |
+"cons" |
+"conj" |
+"vector" |
+"hash-map" |
+"sorted-map" |
+"sorted-map-by" |
+"meta" |
+"with-meta" |
+"when" |
+"when-not" |
+"nil?" |
+"not" |
+"first" |
+"rest" |
+"second" |
+"ffirst" |
+"frest" |
+"rfirst" |
+"rrest" |
+"eql?" |
+"str" |
+"strcat" |
+"gensym" |
+"apply" |
+"list*" |
+"delay" |
+"lazy-cons" |
+"fnseq" |
+"concat" |
+"inc" |
+"dec" |
+"pos?" |
+"neg?" |
+"zero?" |
+"quot" |
+"rem" |
+"complement" |
+"constantly" |
+"identity" |
+"seq" |
+"count" |
+"assoc" |
+"dissoc" |
+"find" |
+"keys" |
+"vals" |
+"merge" |
+"rseq" |
+"sym" |
+"name" |
+"namespace" |
+"locking" |
+".." |
+"->" |
+"defmulti" |
+"defmethod" |
+"remove-method" |
+"binding" |
+"find-var" |
+"ref" |
+"deref" |
+"commute" |
+"alter" |
+"set" |
+"ensure" |
+"sync" |
+"agent" |
+"agent-of" |
+"agent-errors" |
+"clear-agent-errors" |
+"reduce" |
+"reverse" |
+"comp" |
+"appl" |
+"every" |
+"not-every" |
+"any" |
+"not-any" |
+"map" |
+"pmap" |
+"mapcat" |
+"filter" |
+"take" |
+"take-while" |
+"drop" |
+"drop-while" |
+"zipmap" |
+"cycle" |
+"split-at" |
+"split-with" |
+"repeat" |
+"replicate" |
+"iterate" |
+"range" |
+"doseq" |
+"dotimes" |
+"into" |
+"eval" |
+"import" |
+"unimport" |
+"refer" |
+"unrefer" |
+"in-namespace" |
+"unintern" |
+"into-array" |
+"array" |
+"make-proxy" |
+"implement" |
+"prn" |
+"print" |
+"newline" |
+"*out*" |
+"*current-namespace*" |
+"*print-meta*"
+"doto" |
+"memfn" |
+"read" |
+"*in*" |
+"time" |
+"key" |
+"val" |
+"int" |
+"long" |
+"float" |
+"double" |
+"short" |
+"byte" |
+"boolean" |
+"char" |
+"aget" |
+"aset" |
+"aset-boolean" |
+"aset-int" |
+"aset-long" |
+"aset-float" |
+"aset-double" |
+"aset-short" |
+"aset-byte" |
+"make-array" |
+"peek" |
+"pop" |
+"nth" |
+"get" |
+"and" |
+"or"      				{ addToken(Token.FUNCTION); }
+
+{LineTerminator}				{ addNullToken(); return firstToken; }
+
+{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+{StringLiteral}				{ start = zzMarkedPos-1; yybegin(STRING); }
+	//{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	//{ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+{Nil}                           { addToken(Token.DATA_TYPE); }
+
+{BooleanLiteral}				{ addToken(Token.LITERAL_BOOLEAN); }
+
+
+{Quote}							{ addToken(Token.SEPARATOR); }
+{Unquote}						{ addToken(Token.SEPARATOR); }
+{VarQuote}						{ addToken(Token.SEPARATOR); }
+{Dispatch}						{ addToken(Token.DATA_TYPE); }
+
+{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+{Separator}					{ addToken(Token.SEPARATOR); }
+
+{Operator}					{ addToken(Token.OPERATOR); }
+
+{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+{Keyword}						{ addToken(Token.PREPROCESSOR); }
+{DefName}						{ addToken(Token.IDENTIFIER); }
+
+<<EOF>>						{ addNullToken(); return firstToken; }
+
+.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<STRING> {
+
+	[^\n\"]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	"\"\""				{}
+	"\""					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java	(revision 25584)
@@ -0,0 +1,1871 @@
+/* The following code was generated by JFlex 1.4.1 on 12/23/10 11:06 AM */
+
+/*
+ * 12/23/2010
+ *
+ * ClojureTokenMaker.java - Scanner for Clojure.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Clojure programming language.<p>
+ *
+ * This was graciously donated by the folks at the
+ * <a href="http://pacific.mpi-cbg.de/wiki/index.php/Fiji">Fiji</a> project.
+ * Its original location was
+ * <a href="http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?p=fiji.git;a=tree;f=src-plugins/Script_Editor/fiji/scripting;hb=935d85d9d88dd780c6d5f2765937ddc18b5008ca">here</a>.
+ * <p>
+ * 
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ClojureTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ *
+ */
+
+public class ClojureTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\56\1\15\1\0\1\36\1\34\22\0\1\57\1\67\1\16"+
+    "\1\52\1\71\1\65\1\65\1\12\1\44\1\47\1\64\1\61\1\72"+
+    "\1\43\1\17\1\66\1\4\3\7\4\7\2\5\1\2\1\1\1\62"+
+    "\1\63\1\60\1\35\1\51\3\6\1\41\1\42\1\41\5\3\1\40"+
+    "\13\3\1\37\2\3\1\33\1\11\1\33\1\53\1\70\1\46\1\22"+
+    "\1\26\1\23\1\75\1\24\1\14\1\104\1\73\1\32\1\103\1\106"+
+    "\1\31\1\76\1\27\1\74\1\21\1\77\1\13\1\20\1\25\1\10"+
+    "\1\100\1\30\1\102\1\101\1\105\1\54\1\45\1\55\1\50\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\1\1\2\0\1\2\1\3\1\4\1\1\2\5\1\1"+
+    "\1\2\2\1\1\6\1\7\14\1\1\10\1\4\1\11"+
+    "\1\4\1\10\1\4\1\2\4\4\11\1\1\12\1\13"+
+    "\1\14\2\12\1\15\2\12\1\16\2\17\1\20\1\17"+
+    "\2\21\1\17\1\5\1\17\1\1\1\22\3\0\6\1"+
+    "\1\23\2\1\1\24\51\1\1\23\4\1\4\0\1\4"+
+    "\10\1\1\23\12\1\1\12\4\0\1\20\1\21\1\1"+
+    "\1\20\2\1\3\0\4\1\1\24\5\1\1\24\6\1"+
+    "\2\24\40\1\1\23\1\25\1\24\12\1\1\24\3\1"+
+    "\2\0\2\25\7\1\1\23\10\1\1\24\4\1\4\0"+
+    "\3\1\2\0\5\1\1\24\4\1\2\24\3\1\2\24"+
+    "\3\1\1\26\1\1\1\24\5\1\1\24\3\1\1\24"+
+    "\1\1\1\24\3\1\1\24\3\1\2\0\11\1\1\24"+
+    "\2\1\1\0\1\27\1\0\1\1\2\0\7\1\1\24"+
+    "\37\1\2\0\1\1\1\0\107\1\1\24\27\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[466];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\107\0\216\0\325\0\325\0\u011c\0\u0163\0\u01aa"+
+    "\0\u01f1\0\u0238\0\u027f\0\u02c6\0\u030d\0\325\0\325\0\u0354"+
+    "\0\u039b\0\u03e2\0\u0429\0\u0470\0\u04b7\0\u04fe\0\u0545\0\u058c"+
+    "\0\u05d3\0\u061a\0\u0661\0\325\0\u0163\0\u06a8\0\u06ef\0\u0736"+
+    "\0\325\0\u077d\0\u07c4\0\u080b\0\u0852\0\u0899\0\u08e0\0\u0927"+
+    "\0\u096e\0\u09b5\0\u09fc\0\u0a43\0\u0a8a\0\u0ad1\0\u0b18\0\u0b5f"+
+    "\0\325\0\u0ba6\0\u0bed\0\u0c34\0\325\0\u0c7b\0\u0cc2\0\u0d09"+
+    "\0\u0d50\0\u0d97\0\u0dde\0\u0e25\0\u0d97\0\u0e6c\0\u0eb3\0\u0d97"+
+    "\0\u0efa\0\u0f41\0\325\0\u0f88\0\u0fcf\0\u1016\0\u105d\0\u10a4"+
+    "\0\u10eb\0\u1132\0\u1179\0\u11c0\0\u1207\0\u124e\0\u1295\0\u0163"+
+    "\0\u12dc\0\u1323\0\u136a\0\u13b1\0\u13f8\0\u143f\0\u1486\0\u14cd"+
+    "\0\u1514\0\u155b\0\u15a2\0\u15e9\0\u1630\0\u1677\0\u16be\0\u1705"+
+    "\0\u174c\0\u1793\0\u17da\0\u1821\0\u1868\0\u18af\0\u18f6\0\u193d"+
+    "\0\u1984\0\u19cb\0\u1a12\0\u1a59\0\u1aa0\0\u1ae7\0\u1b2e\0\u1b75"+
+    "\0\u1bbc\0\u1c03\0\u1c4a\0\u1c91\0\u1cd8\0\u1d1f\0\u1d66\0\u1dad"+
+    "\0\u1df4\0\u0163\0\u1e3b\0\u1e82\0\u1ec9\0\u1f10\0\u1f57\0\u1f9e"+
+    "\0\u1fe5\0\u202c\0\u2073\0\u20ba\0\u2101\0\u2148\0\u218f\0\u21d6"+
+    "\0\u221d\0\u2264\0\u22ab\0\u22f2\0\u2339\0\u2380\0\u23c7\0\u240e"+
+    "\0\u2455\0\u249c\0\u24e3\0\u252a\0\u2571\0\u25b8\0\325\0\u25ff"+
+    "\0\u2646\0\u268d\0\u26d4\0\u0d97\0\u271b\0\u2762\0\u27a9\0\u27f0"+
+    "\0\u2837\0\u287e\0\u28c5\0\u290c\0\u2953\0\u299a\0\u29e1\0\u2a28"+
+    "\0\u2a6f\0\u2ab6\0\u2afd\0\u2b44\0\u2b8b\0\u2bd2\0\u2c19\0\u2c60"+
+    "\0\u2ca7\0\u2cee\0\u2d35\0\u2d7c\0\u2dc3\0\u2e0a\0\u2e51\0\u2e98"+
+    "\0\u2edf\0\u2f26\0\u2f6d\0\u2fb4\0\u2ffb\0\u3042\0\u3089\0\u30d0"+
+    "\0\u3117\0\u315e\0\u2a6f\0\u31a5\0\u31ec\0\u3233\0\u327a\0\u32c1"+
+    "\0\u3308\0\u334f\0\u3396\0\u33dd\0\u3424\0\u346b\0\u34b2\0\u34f9"+
+    "\0\u3540\0\u3587\0\u35ce\0\u3615\0\u365c\0\u36a3\0\u36ea\0\u3731"+
+    "\0\u2ffb\0\u3778\0\u37bf\0\u3806\0\u384d\0\u3894\0\u38db\0\u3922"+
+    "\0\u3969\0\u39b0\0\u39f7\0\u3a3e\0\u3a85\0\u3acc\0\u3b13\0\u3b5a"+
+    "\0\u3ba1\0\u3be8\0\325\0\u202c\0\u3c2f\0\u3c76\0\u3cbd\0\u3d04"+
+    "\0\u3d4b\0\u3d92\0\u3dd9\0\u3e20\0\u3e67\0\u3eae\0\u3ef5\0\u3f3c"+
+    "\0\u3f83\0\u3fca\0\u4011\0\u4058\0\u409f\0\u40e6\0\u412d\0\u4174"+
+    "\0\u41bb\0\u4202\0\u4249\0\u4290\0\u42d7\0\u431e\0\u4365\0\u43ac"+
+    "\0\u43f3\0\u443a\0\u4481\0\u44c8\0\u450f\0\u4556\0\u459d\0\u45e4"+
+    "\0\u462b\0\u4672\0\u46b9\0\u4700\0\u4747\0\u4700\0\u478e\0\u47d5"+
+    "\0\u481c\0\u4863\0\u48aa\0\u48f1\0\u4938\0\u497f\0\u0163\0\u49c6"+
+    "\0\u4a0d\0\u4a54\0\u4a9b\0\u4ae2\0\u4b29\0\u4b70\0\u4bb7\0\u4bfe"+
+    "\0\u4c45\0\u4c8c\0\u4cd3\0\u4d1a\0\u3cbd\0\u4d61\0\u4da8\0\u4def"+
+    "\0\u4e36\0\u4e7d\0\u4ec4\0\u4f0b\0\u4f52\0\u4f99\0\u4fe0\0\u5027"+
+    "\0\u506e\0\u50b5\0\u50fc\0\u5143\0\u518a\0\u51d1\0\u5218\0\u525f"+
+    "\0\u52a6\0\u52ed\0\u5334\0\u537b\0\u53c2\0\u5409\0\u5450\0\u5497"+
+    "\0\u54de\0\u5525\0\u556c\0\u55b3\0\u55fa\0\u5641\0\u5688\0\u56cf"+
+    "\0\u5716\0\u575d\0\u57a4\0\u57eb\0\u5832\0\u5879\0\u58c0\0\u5907"+
+    "\0\u594e\0\u5995\0\u59dc\0\u5a23\0\u5a6a\0\u5ab1\0\u5af8\0\u5b3f"+
+    "\0\u5b86\0\u5bcd\0\u5c14\0\u5c5b\0\u5ca2\0\u5ce9\0\u5d30\0\u5d77"+
+    "\0\u5dbe\0\u5e05\0\u5e4c\0\u5e93\0\u5eda\0\u5f21\0\u5f68\0\u5faf"+
+    "\0\u537b\0\u5ff6\0\u603d\0\u6084\0\u60cb\0\u6112\0\u6159\0\u61a0"+
+    "\0\u61e7\0\u622e\0\u6275\0\u62bc\0\u6303\0\u634a\0\u6391\0\u63d8"+
+    "\0\u641f\0\u6466\0\u64ad\0\u64f4\0\u653b\0\u6582\0\u65c9\0\u6610"+
+    "\0\u6657\0\u669e\0\u66e5\0\u672c\0\u6773\0\u67ba\0\u6801\0\u6848"+
+    "\0\u688f\0\u409f\0\u68d6\0\u691d\0\u6964\0\u69ab\0\u69f2\0\u6a39"+
+    "\0\u6a80\0\u6ac7\0\u6b0e\0\u6b55\0\u6b9c\0\u6be3\0\u6c2a\0\u4bb7"+
+    "\0\u6c71\0\u6cb8\0\u6cff\0\u6d46\0\u6d8d\0\u6dd4\0\u6e1b\0\u6e62"+
+    "\0\u6ea9\0\u6ef0\0\u6f37\0\u6f7e\0\u6fc5\0\u700c\0\u7053\0\u709a"+
+    "\0\u70e1\0\u7128\0\u716f\0\u71b6\0\u71fd\0\u7244\0\u728b\0\u72d2"+
+    "\0\u7319\0\u7360\0\u73a7\0\u73ee\0\u7435\0\u747c\0\u74c3\0\u750a"+
+    "\0\u7551\0\u7598\0\u75df\0\u7626\0\u766d\0\u76b4\0\u76fb\0\u7742"+
+    "\0\u7789\0\u77d0\0\u7817\0\u785e\0\u78a5\0\u78ec\0\u7933\0\u797a"+
+    "\0\u79c1\0\u7a08";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[466];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\4\1\5\1\6\1\7\1\10\1\11\1\7\1\11"+
+    "\1\12\1\13\1\4\1\14\1\15\1\16\1\17\1\20"+
+    "\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30"+
+    "\1\31\1\32\1\33\1\34\1\4\1\35\1\36\4\7"+
+    "\1\37\1\40\2\4\1\34\1\41\1\4\1\42\1\41"+
+    "\2\34\2\36\1\43\1\35\1\44\1\45\1\46\1\41"+
+    "\1\35\1\44\3\4\1\47\1\50\1\51\1\52\1\53"+
+    "\1\54\3\7\1\55\1\56\1\57\15\60\1\61\1\62"+
+    "\70\60\14\63\1\64\1\65\12\63\1\66\42\63\1\67"+
+    "\13\63\112\0\1\70\2\0\1\70\1\0\1\70\2\0"+
+    "\2\70\3\0\13\70\2\0\1\70\1\0\5\70\15\0"+
+    "\1\70\2\0\1\70\1\0\2\70\3\0\14\70\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\1\71\2\0\1\72\1\73\1\74\1\72\1\73"+
+    "\1\72\1\71\1\0\1\72\1\75\2\0\1\76\4\72"+
+    "\1\77\4\72\1\100\1\72\2\0\1\7\1\0\1\101"+
+    "\1\100\1\75\1\77\1\7\2\0\1\71\2\0\2\71"+
+    "\5\0\3\7\1\0\1\7\1\0\2\7\2\71\1\0"+
+    "\2\72\1\75\4\72\1\101\4\72\1\71\2\0\1\72"+
+    "\2\11\1\72\1\11\1\72\1\71\1\0\1\72\1\75"+
+    "\2\0\1\76\4\72\1\77\4\72\1\100\1\72\2\0"+
+    "\1\7\1\0\1\72\1\100\1\75\1\77\1\7\2\0"+
+    "\1\71\2\0\2\71\5\0\3\7\1\0\1\7\1\0"+
+    "\2\7\2\71\1\0\2\72\1\75\11\72\3\0\6\7"+
+    "\2\0\2\7\2\0\10\7\1\102\3\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\17\0\1\103\1\104\4\0\1\105\1\0"+
+    "\1\106\62\0\6\7\2\0\1\107\1\110\2\0\1\7"+
+    "\1\111\1\7\1\112\1\7\1\113\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\107\1\110\2\0"+
+    "\3\7\1\114\4\7\1\115\1\7\1\116\1\117\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\1\7\2\76\1\7\1\76"+
+    "\1\7\2\0\2\7\2\0\1\120\13\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\2\7"+
+    "\1\121\2\7\1\122\1\123\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\124\1\125\4\7\1\126\5\7\3\0\6\7\2\0"+
+    "\1\127\1\7\2\0\5\7\1\130\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\131\1\7\1\132\10\7\3\0\6\7"+
+    "\2\0\1\133\1\7\2\0\1\7\1\134\1\135\5\7"+
+    "\1\136\1\7\1\137\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\11\7"+
+    "\1\140\2\7\3\0\6\7\2\0\2\7\2\0\12\7"+
+    "\1\141\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\142\1\143\4\7"+
+    "\1\144\5\7\3\0\6\7\2\0\2\7\2\0\10\7"+
+    "\1\145\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\4\7\1\146\1\147"+
+    "\6\7\3\0\6\7\2\0\1\150\1\7\2\0\3\7"+
+    "\1\151\7\7\1\152\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\153\13\7"+
+    "\3\0\6\7\2\0\2\7\2\0\13\7\1\154\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\155\4\7\1\156\5\7\3\0"+
+    "\6\7\2\0\2\7\2\0\3\7\1\157\1\7\1\160"+
+    "\1\161\4\7\1\162\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\163"+
+    "\12\7\3\0\6\7\2\0\2\7\2\0\13\7\1\164"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\165\13\7\3\0\6\7\2\0"+
+    "\2\7\2\0\3\7\1\166\1\7\1\167\5\7\1\170"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\171\12\7\3\0\6\7"+
+    "\2\0\1\7\1\172\2\0\6\7\1\173\1\7\1\174"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\2\7\1\175\1\176\10\7"+
+    "\36\0\1\36\17\0\2\36\32\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\1\120"+
+    "\2\7\1\0\1\7\1\0\2\7\3\0\14\7\12\0"+
+    "\1\177\35\0\1\200\50\0\1\201\40\0\1\202\36\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\1\203\2\7\1\41\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\41\1\7"+
+    "\1\0\2\7\3\0\14\7\63\0\1\41\26\0\6\7"+
+    "\2\0\2\7\2\0\2\7\1\204\1\7\1\205\6\7"+
+    "\1\206\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\207\12\7\3\0"+
+    "\6\7\2\0\2\7\2\0\3\7\1\210\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\120\1\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\1\211\1\7\2\0\5\7\1\212\5\7\1\213"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\214\12\7\3\0\6\7"+
+    "\2\0\2\7\2\0\3\7\1\215\1\7\1\216\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\217\12\7\3\0\5\7"+
+    "\1\220\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\3\7\1\221"+
+    "\1\7\1\222\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\5\7\1\223\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\224\5\7\1\225\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\5\7\1\226\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\15\60\2\0\70\60\16\0"+
+    "\1\227\70\0\14\63\2\0\12\63\1\0\42\63\1\0"+
+    "\13\63\25\0\1\230\4\0\1\231\104\0\1\232\103\0"+
+    "\1\233\64\0\6\70\2\0\2\70\3\0\13\70\2\0"+
+    "\1\70\1\0\5\70\15\0\1\70\2\0\1\70\1\0"+
+    "\2\70\3\0\14\70\1\71\2\0\7\71\1\0\2\71"+
+    "\3\0\13\71\4\0\4\71\3\0\1\71\2\0\2\71"+
+    "\15\0\2\71\1\0\15\71\2\0\6\72\1\71\1\0"+
+    "\2\72\2\0\1\7\13\72\2\0\1\7\1\0\4\72"+
+    "\1\7\2\0\1\71\2\0\2\71\5\0\3\7\1\0"+
+    "\1\7\1\0\2\7\2\71\1\0\14\72\1\71\2\0"+
+    "\1\72\1\73\1\74\1\72\1\73\1\72\1\71\1\0"+
+    "\1\72\1\75\2\0\1\76\4\72\1\77\4\72\1\234"+
+    "\1\72\2\0\1\7\1\0\1\72\1\234\1\75\1\77"+
+    "\1\7\2\0\1\71\2\0\2\71\5\0\3\7\1\0"+
+    "\1\7\1\0\2\7\2\71\1\0\2\72\1\75\11\72"+
+    "\1\71\2\0\1\72\2\74\1\72\1\74\1\72\1\71"+
+    "\1\0\1\72\1\75\2\0\1\76\4\72\1\77\6\72"+
+    "\2\0\1\7\1\0\2\72\1\75\1\77\1\7\2\0"+
+    "\1\71\2\0\2\71\5\0\3\7\1\0\1\7\1\0"+
+    "\2\7\2\71\1\0\2\72\1\75\11\72\1\71\2\0"+
+    "\1\72\2\76\1\72\1\76\1\72\1\71\1\0\1\72"+
+    "\1\75\2\0\1\7\4\72\1\77\6\72\2\0\1\7"+
+    "\1\0\2\72\1\75\1\77\1\7\2\0\1\71\2\0"+
+    "\2\71\5\0\3\7\1\0\1\7\1\0\2\7\2\71"+
+    "\1\0\2\72\1\75\11\72\1\71\2\0\1\72\2\235"+
+    "\1\72\1\235\1\72\1\71\1\0\2\72\2\0\1\7"+
+    "\13\72\2\0\1\7\1\0\4\72\1\236\2\0\1\71"+
+    "\2\0\2\71\5\0\1\7\1\236\1\7\1\0\1\7"+
+    "\1\0\2\7\2\71\1\0\14\72\1\71\2\0\1\72"+
+    "\4\237\1\72\1\71\1\0\1\72\1\237\2\0\1\7"+
+    "\2\72\3\237\1\72\1\237\4\72\2\0\1\7\1\0"+
+    "\2\72\2\237\1\7\2\0\1\71\2\0\2\71\5\0"+
+    "\3\7\1\0\1\7\1\0\2\7\2\71\1\0\2\72"+
+    "\1\237\11\72\3\0\6\7\2\0\1\240\1\7\2\0"+
+    "\13\7\1\241\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\21\0\1\242"+
+    "\107\0\1\243\110\0\1\244\65\0\6\7\2\0\2\7"+
+    "\2\0\5\7\1\245\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\13\7\1\246\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\247\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\10\7\1\250\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\7\1\251"+
+    "\2\0\1\7\1\252\1\253\1\254\1\255\7\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\2\7\1\256\1\257\1\7\1\260\6\7"+
+    "\3\0\6\7\2\0\2\7\2\0\12\7\1\261\1\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\1\7\1\111\12\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\262\12\7\3\0\6\7\2\0\1\245"+
+    "\1\7\2\0\10\7\1\263\1\7\1\137\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\12\7\1\264\1\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\4\7\1\265\1\7\1\266"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\4\7\1\120\7\7\3\0"+
+    "\6\7\2\0\1\267\1\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\7\1\270\12\7\3\0\6\7"+
+    "\2\0\1\271\1\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\10\7\1\272"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\3\7\1\120\10\7\3\0"+
+    "\6\7\2\0\2\7\2\0\10\7\1\120\2\7\1\273"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\5\7\1\274\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\1\7\1\275\1\120"+
+    "\11\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\3\7\1\276\10\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\277\1\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\1\7\1\300\3\7\1\301\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\2\7"+
+    "\1\302\11\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\2\7"+
+    "\1\120\3\7\1\120\5\7\3\0\6\7\2\0\2\7"+
+    "\2\0\6\7\1\303\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\5\7\1\304\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\3\7\1\305\1\7\1\306\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\3\7"+
+    "\1\50\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\5\7"+
+    "\1\273\2\0\2\7\2\0\10\7\1\307\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\3\7\1\310\10\7\3\0\6\7\2\0"+
+    "\2\7\2\0\4\7\1\311\7\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\1\7\1\312"+
+    "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\12\7\1\313\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\3\7\1\314"+
+    "\1\7\1\315\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\5\7\1\316\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\6\7\1\317\5\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\13\7\1\320\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\321\10\7\3\0\6\7\2\0\1\322\1\7"+
+    "\2\0\5\7\1\323\5\7\1\324\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\10\7\1\325"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\326"+
+    "\12\7\3\0\6\7\2\0\2\7\2\0\6\7\1\321"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\3\7\1\327"+
+    "\10\7\3\0\6\7\2\0\2\7\2\0\11\7\1\330"+
+    "\2\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\11\7\1\275\2\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\120\13\7\3\0\6\7\2\0\2\7\2\0\12\7"+
+    "\1\331\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\6\7\1\332\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\6\7"+
+    "\1\333\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\5\7\1\334\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\12\7\1\335\1\7\3\0\6\7"+
+    "\2\0\2\7\2\0\6\7\1\172\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\1\7"+
+    "\1\336\12\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\3\7\1\337\1\340\3\7\1\341"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\342\12\7\3\0"+
+    "\6\7\2\0\2\7\2\0\5\7\1\343\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\1\7\1\344\2\7\1\120\1\7\1\345\5\7\2\0"+
+    "\1\7\1\0\4\7\1\346\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\5\7\1\347\6\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\2\7\1\350\11\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\45\0\1\351\112\0\1\352"+
+    "\36\0\1\34\13\0\2\34\1\201\24\0\1\34\11\0"+
+    "\2\34\27\0\1\202\1\353\13\202\2\353\1\202\1\0"+
+    "\34\202\2\353\1\354\27\202\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\1\35"+
+    "\2\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\1\355\1\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\5\7\1\356\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\10\7\1\357\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\5\7\1\360\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\1\7\1\361\12\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\362\12\7\3\0\6\7\2\0\1\363"+
+    "\1\364\2\0\4\7\1\120\5\7\1\277\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\1\7\1\365\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\5\7\1\366\2\0\2\7\2\0\1\7\1\111\4\7"+
+    "\1\367\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\2\7\1\267\11\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\13\7\1\370\3\0\6\7\2\0\1\250\1\7"+
+    "\2\0\6\7\1\371\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\372\10\7\3\0\6\7\2\0\2\7\2\0\10\7"+
+    "\1\373\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+    "\1\374\12\7\3\0\6\7\2\0\2\7\2\0\12\7"+
+    "\1\375\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\4\7\1\376\7\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\6\7"+
+    "\1\120\1\7\1\377\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\u0100\1\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\2\7\1\u0101\11\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\6\7\1\375\5\7\21\0\1\u0102\116\0\1\u0103\105\0"+
+    "\1\u0104\103\0\1\u0105\61\0\1\71\2\0\1\72\2\235"+
+    "\1\72\1\235\1\72\1\71\1\0\1\72\1\75\2\0"+
+    "\1\7\13\72\2\0\1\7\1\0\2\72\1\75\1\72"+
+    "\1\7\2\0\1\71\2\0\2\71\5\0\3\7\1\0"+
+    "\1\7\1\0\2\7\2\71\1\0\2\72\1\75\11\72"+
+    "\3\0\1\7\2\235\1\7\1\235\1\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\1\71\2\0"+
+    "\1\72\4\237\1\72\1\71\1\0\1\72\1\237\2\0"+
+    "\1\7\2\72\3\237\1\72\1\237\2\72\1\234\1\72"+
+    "\2\0\1\7\1\0\1\72\1\234\2\237\1\7\2\0"+
+    "\1\71\2\0\2\71\5\0\3\7\1\0\1\7\1\0"+
+    "\2\7\2\71\1\0\2\72\1\237\11\72\3\0\6\7"+
+    "\2\0\2\7\2\0\5\7\1\u0106\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\10\7"+
+    "\1\u0107\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\3\7\1\u0108\10\7"+
+    "\22\0\1\u0109\112\0\1\103\110\0\1\u010a\61\0\6\7"+
+    "\2\0\2\7\2\0\1\7\1\252\12\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\245\1\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\4\7\1\120"+
+    "\7\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\11\7\1\321\2\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\50\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\6\7\1\120"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\262\4\7\1\u010b\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\2\7\1\120\11\7\3\0"+
+    "\5\7\1\u010c\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\5\7\1\u010d\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u010e"+
+    "\12\7\3\0\6\7\2\0\2\7\2\0\5\7\1\u010f"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\1\7\1\316\12\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\3\7\1\252"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\2\7\1\u0110"+
+    "\11\7\3\0\6\7\2\0\2\7\2\0\13\7\1\u0111"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\u0112\12\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\1\7"+
+    "\1\172\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\4\7\1\262\7\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\1\252\1\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\6\7"+
+    "\1\u0113\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\4\7\1\120\7\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\10\7"+
+    "\1\252\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\13\7"+
+    "\1\120\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\120\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\2\7\1\120\11\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\3\7\1\u0114\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\272\12\7\3\0"+
+    "\6\7\2\0\2\7\2\0\6\7\1\u0115\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\12\7\1\u0116\1\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\6\7\1\120\1\7\1\u0117"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\1\7\1\u0118\12\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\3\7\1\u0119"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\1\7\1\u011a\2\7\1\262\7\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\2\7\1\172\5\7\1\120\3\7\3\0"+
+    "\6\7\2\0\2\7\2\0\2\7\1\u011b\11\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\3\7\1\u011c\10\7\3\0\6\7\2\0"+
+    "\2\7\2\0\12\7\1\321\1\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\5\7\1\u011d\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\120\1\0\4\7\1\u011e\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\12\7\1\120\1\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\u0114\1\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\5\7\1\u011f\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u0120\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\u0121\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\5\7\1\120"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u0122"+
+    "\12\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u0123\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\1\7\1\u0124\12\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\2\7\1\u0125\11\7\3\0\6\7\2\0\2\7"+
+    "\2\0\12\7\1\u0126\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\5\7\1\u0127\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\12\7\1\u0128\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u0129\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\u012a\13\7\3\0\6\7"+
+    "\2\0\2\7\2\0\10\7\1\u012b\3\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\6\7\1\u012c\5\7\3\0\6\7"+
+    "\2\0\2\7\2\0\6\7\1\u012d\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\2\7\1\u012e\11\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\13\7"+
+    "\1\u0125\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\11\7\1\120\2\7\3\0\6\7\2\0"+
+    "\2\7\2\0\2\7\1\172\11\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\u012f\1\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\6\7\1\u0130\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\u0131\12\7\3\0\6\7\2\0\2\7"+
+    "\2\0\10\7\1\u0132\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\10\7\1\u0133\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\12\7\1\u0134\1\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+    "\1\270\12\7\46\0\1\u0135\105\0\1\u0136\44\0\6\7"+
+    "\2\0\2\7\2\0\13\7\1\u0137\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\1\u0138\1\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\120\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\6\7\1\357\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\1\u0139\13\7\3\0\6\7\2\0"+
+    "\2\7\2\0\2\7\1\u0121\11\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\5\7\1\u013a"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\10\7\1\172\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\u013b\10\7\3\0\6\7\2\0\2\7\2\0"+
+    "\1\7\1\300\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\7\7\1\311\4\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\13\7\1\u013c\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\5\7\1\u013d\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\3\7"+
+    "\1\120\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\1\7\1\u013e\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\13\7\1\u013f"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\6\7\1\u0140\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\1\7\1\120\12\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\6\7\1\u0141\5\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\1\7\1\u0142\12\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\275\12\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\3\7\1\132\10\7\2\0\1\u0143\130\0\1\u0102"+
+    "\101\0\1\u0144\110\0\1\u0145\70\0\6\7\2\0\1\7"+
+    "\1\303\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\6\7\1\u0146\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\2\7\1\124\11\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\23\0"+
+    "\1\u0147\114\0\1\u0148\60\0\6\7\2\0\2\7\2\0"+
+    "\13\7\1\u0149\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\1\172\1\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\4\7\1\321"+
+    "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\5\7\1\u014a"+
+    "\6\7\3\0\6\7\2\0\1\u014b\1\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\4\7\1\u014c\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\6\7\1\u014d\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\10\7\1\254\3\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\5\7\1\u014e\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\6\7\1\120\5\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u014f\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\6\7"+
+    "\1\u0150\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\1\7\1\172\12\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\u0151\1\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\6\7\1\u0152\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\12\7\1\u0134"+
+    "\1\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\5\7\1\156"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\321\1\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\1\u0153\1\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\1\7\1\u0154\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u0155\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\11\7\1\172\2\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\5\7\1\u0156\6\7\3\0\6\7\2\0\1\7"+
+    "\1\u0157\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\13\7\1\u0158\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\5\7"+
+    "\1\u0159\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\1\7\1\u015a\12\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\13\7"+
+    "\1\u015b\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\3\7\1\u015c\1\7\1\u015d\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u015e\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+    "\1\u015f\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u0160\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\4\7\1\u0161\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\3\7\1\156\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\3\7\1\u0162\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u0163\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\3\7"+
+    "\1\u0164\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\6\7\1\u0165\5\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\5\7"+
+    "\1\u0166\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\47\0\1\34"+
+    "\107\0\1\u0135\41\0\6\7\2\0\2\7\2\0\10\7"+
+    "\1\u0167\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\1\u0168\1\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u0101\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\7"+
+    "\1\120\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\5\7\1\u0169\2\0\2\7\2\0\3\7\1\u016a\1\7"+
+    "\1\u016b\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\u016c\10\7\3\0\6\7\2\0\2\7\2\0\14\7"+
+    "\2\0\1\7\1\0\4\7\1\u016d\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\10\7\1\120\3\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\6\7\1\u016e"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\172\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\50\12\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\6\7\1\u016f"+
+    "\5\7\66\0\1\u0170\21\0\2\u0171\6\u0144\1\0\1\u0171"+
+    "\2\u0144\2\0\1\u0171\13\u0144\1\u0171\1\0\1\u0171\1\0"+
+    "\4\u0144\2\u0171\2\0\4\u0171\6\0\1\u0171\1\0\3\u0171"+
+    "\1\u0144\2\u0171\1\u0144\1\u0171\14\u0144\2\0\1\u0143\15\0"+
+    "\1\u0102\71\0\6\7\2\0\2\7\2\0\5\7\1\u0172"+
+    "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\24\0\1\103\114\0"+
+    "\1\u0173\57\0\6\7\2\0\2\7\2\0\4\7\1\u012f"+
+    "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\u0174\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\1\7\1\321"+
+    "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\5\7\1\142"+
+    "\6\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u0175\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\2\7\1\u0176\11\7"+
+    "\3\0\6\7\2\0\1\7\1\u0177\2\0\1\7\1\u0178"+
+    "\5\7\1\u0179\2\7\1\u017a\1\273\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\2\7\1\u017b\11\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\4\7\1\u017c\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+    "\1\u017d\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\3\7\1\u017e"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\u017f\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\13\7\1\u0180"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\11\7\1\u0181\2\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\3\7\1\u010c\10\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\10\7\1\172\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\10\7\1\341\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\3\7\1\u013e\10\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\2\7\1\u0182\11\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\10\7\1\321\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\10\7\1\u0114\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\5\7\1\u0183\6\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\3\7\1\u0184\10\7\3\0\6\7\2\0\2\7"+
+    "\2\0\10\7\1\u0185\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\4\7\1\u0186\7\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\7"+
+    "\1\u0187\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\10\7\1\u0188\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\3\7\1\u0189\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\u018a\10\7\3\0\6\7\2\0\2\7\2\0"+
+    "\13\7\1\u018b\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+    "\1\u018c\10\7\3\0\6\7\2\0\2\7\2\0\6\7"+
+    "\1\u018d\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\5\7\1\u018e\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\12\7"+
+    "\1\u018f\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\4\7\1\u0190\7\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\6\7"+
+    "\1\u0191\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\5\7\1\u0192\6\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\2\7"+
+    "\1\u0193\1\u0189\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\u0194\12\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\3\7\1\120\10\7\66\0"+
+    "\1\u0144\23\0\6\7\2\0\1\u013e\1\7\2\0\14\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\27\0\1\u0147\62\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+    "\1\u0195\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\3\7\1\252"+
+    "\5\7\1\u0196\2\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\4\7\1\u0197\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\12\7"+
+    "\1\116\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\124"+
+    "\13\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\155\4\7\1\156\5\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\u0158\12\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\u0198\12\7\3\0"+
+    "\6\7\2\0\2\7\2\0\5\7\1\u0199\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\1\7\1\u013a\12\7\3\0\6\7\2\0"+
+    "\2\7\2\0\3\7\1\u019a\10\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\10\7\1\u019b"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\1\7\1\275\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\10\7\1\u019c\3\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\u0187\13\7\3\0"+
+    "\6\7\2\0\2\7\2\0\3\7\1\u010d\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\315\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\5\7\1\u019d\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\252\12\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\u019e\12\7\3\0\6\7\2\0\2\7\2\0"+
+    "\13\7\1\311\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\4\7\1\u019f\7\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\1\133\1\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\u01a0\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\6\7\1\u0114"+
+    "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\273\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\4\7\1\u01a1\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\10\7\1\u01a2\3\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\6\7\1\u01a3\5\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u01a4"+
+    "\1\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\u01a5\13\7\3\0\6\7\2\0\1\u01a6\1\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\1\u01a7\1\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\3\7\1\u01a8\10\7\3\0\6\7\2\0\2\7"+
+    "\2\0\13\7\1\u01a9\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\3\7\1\u01aa\10\7\3\0\5\7\1\366\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\1\u01ab\1\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\11\7\1\u01ac\2\7\3\0\6\7\2\0"+
+    "\2\7\2\0\6\7\1\u01ad\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\3\7\1\u01ae"+
+    "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\6\7\1\371\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\10\7\1\u0192"+
+    "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+    "\2\7\2\0\5\7\1\u01af\6\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\3\7\1\u01b0\10\7\3\0\6\7\2\0"+
+    "\2\7\2\0\6\7\1\u01b1\5\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\13\7\1\120"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\172\12\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\1\7\1\254\12\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\1\7\1\u01b2\12\7"+
+    "\3\0\6\7\2\0\2\7\2\0\14\7\2\0\1\7"+
+    "\1\0\4\7\1\u01b3\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\u016b\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\6\7\1\161\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\3\7\1\u01b4\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\1\u01b5\1\7\2\0\14\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\5\7"+
+    "\1\u01b6\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\12\7\1\u0114\1\7\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\12\7"+
+    "\1\u01b7\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\172\1\0\5\7"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\2\7\2\0\5\7\1\u01b8\6\7"+
+    "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+    "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\2\7"+
+    "\2\0\14\7\2\0\1\7\1\0\4\7\1\u01b9\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\7\7\1\u0114\4\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\u01ba\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\2\7\1\u01bb\11\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\1\7\1\u01bc\12\7\3\0"+
+    "\6\7\2\0\2\7\2\0\10\7\1\u01bd\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\12\7\1\u01be\1\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\6\7\1\u01bf\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\10\7\1\u01c0\3\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\10\7\1\u01c1\3\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\7\7\1\u01c2\4\7\3\0\6\7\2\0"+
+    "\2\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u01c3"+
+    "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+    "\3\0\6\7\2\0\1\u0192\1\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\6\7\1\u01c4\5\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\6\7\1\172\5\7\3\0\6\7\2\0\2\7\2\0"+
+    "\3\7\1\u01c5\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\3\7\1\u01c6\10\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\6\7\1\u01c7\5\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\13\7\1\167\2\0\1\7"+
+    "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+    "\3\0\14\7\3\0\6\7\2\0\2\7\2\0\7\7"+
+    "\1\u0114\4\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+    "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+    "\2\0\2\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+    "\1\u01c8\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\14\7\3\0\6\7\2\0\2\7\2\0\14\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\u01c9\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+    "\1\7\1\0\2\7\3\0\3\7\1\u01ca\10\7\3\0"+
+    "\6\7\2\0\2\7\2\0\5\7\1\u010c\6\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\u0199\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\2\7\1\u01cb\11\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\u01cc\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\u01cd\12\7\3\0\6\7\2\0\2\7\2\0"+
+    "\1\7\1\u01ce\12\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\6\7\1\u01cf\5\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\2\7\1\u01d0\11\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\14\7\2\0\1\7\1\0"+
+    "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+    "\1\7\1\120\12\7\3\0\6\7\2\0\2\7\2\0"+
+    "\3\7\1\u01d1\10\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+    "\6\7\2\0\2\7\2\0\4\7\1\u01d2\7\7\2\0"+
+    "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+    "\2\7\3\0\14\7\3\0\6\7\2\0\2\7\2\0"+
+    "\5\7\1\357\6\7\2\0\1\7\1\0\5\7\14\0"+
+    "\3\7\1\0\1\7\1\0\2\7\3\0\14\7";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[31311];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\1\1\2\0\2\11\10\1\2\11\14\1\1\11\4\1"+
+    "\1\11\17\1\1\11\3\1\1\11\15\1\1\11\3\0"+
+    "\70\1\4\0\24\1\1\11\4\0\6\1\3\0\104\1"+
+    "\2\0\1\11\26\1\4\0\3\1\2\0\52\1\2\0"+
+    "\14\1\1\0\1\1\1\0\1\1\2\0\47\1\2\0"+
+    "\1\1\1\0\137\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[466];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ClojureTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { ";", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			/*case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;*/
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public ClojureTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public ClojureTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 160) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 14: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 24: break;
+        case 6: 
+          { addNullToken(); return firstToken;
+          }
+        case 25: break;
+        case 18: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 26: break;
+        case 9: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 27: break;
+        case 16: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 28: break;
+        case 17: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 29: break;
+        case 19: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 30: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 31: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 32: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 33: break;
+        case 20: 
+          { addToken(Token.FUNCTION);
+          }
+        case 34: break;
+        case 21: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 35: break;
+        case 2: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 36: break;
+        case 22: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 37: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 38: break;
+        case 23: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 39: break;
+        case 15: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 40: break;
+        case 7: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 41: break;
+        case 3: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 42: break;
+        case 5: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 43: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 44: break;
+        case 12: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 45: break;
+        case 10: 
+          { 
+          }
+        case 46: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 467: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 468: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 469: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex	(revision 25584)
@@ -0,0 +1,562 @@
+/*
+ * 7/28/2009
+ *
+ * DelphiTokenMaker.java - Scanner for the Delphi programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Delphi programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated DelphiTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class DelphiTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*" comment.
+	 */
+	public static final int INTERNAL_MLC2			= -1;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "{$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE	= -2;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE2	= -3;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DelphiTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_MLC2:
+				state = MLC2;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE:
+				state = COMPILER_DIRECTIVE;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE2:
+				state = COMPILER_DIRECTIVE2;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= [A-Za-z]
+LetterOrUnderscore				= ({Letter}|"_")
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit})
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedStringLiteral		= ([\'][^\']*)
+StringLiteral				= ({UnclosedStringLiteral}[\'])
+EscapeSequence				= ("#"{Digit}*)
+
+MLCBegin					= "{"
+MLCEnd						= "}"
+MLC2Begin					= "(*"
+MLC2End						= "*)"
+CompilerDirective1Begin		= ({MLCBegin}"$")
+CompilerDirective2Begin		= ({MLC2Begin}"$")
+LineCommentBegin			= "//"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral				= ("true"|"false")
+
+Separator					= ([\(\)\[\]])
+Separator2					= ([\;,.])
+
+Operator					= ([\^\@\:\=\<\>\+\-\/\*])
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state MLC2
+%state COMPILER_DIRECTIVE
+%state COMPILER_DIRECTIVE2
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"array" |
+	"as" |
+	"at" |
+	"asm" |
+	"begin" |
+	"case" |
+	"class" |
+	"const" |
+	"constructor" |
+	"destructor" |
+	"dispinterface" |
+	"div" |
+	"do" |
+	"downto" |
+	"else" |
+	"end" |
+	"except" |
+	"exports" |
+	"file" |
+	"final" |
+	"finalization" |
+	"finally" |
+	"for" |
+	"function" |
+	"goto" |
+	"if" |
+	"implementation" |
+	"in" |
+	"inherited" |
+	"initialization" |
+	"inline" |
+	"interface" |
+	"is" |
+	"label" |
+	"mod" |
+	"not" |
+	"object" |
+	"of" |
+	"on" |
+	"or" |
+	"out" |
+	"packed" |
+	"procedure" |
+	"program" |
+	"property" |
+	"raise" |
+	"record" |
+	"repeat" |
+	"resourcestring" |
+	"set" |
+	"sealed" |
+	"shl" |
+	"shr" |
+	"static" |
+	"string" |
+	"then" |
+	"threadvar" |
+	"to" |
+	"try" |
+	"type" |
+	"unit" |
+	"unsafe" |
+	"until" |
+	"uses" |
+	"var" |
+	"while" |
+	"with" |
+	"xor" 					{ addToken(Token.RESERVED_WORD); }
+
+	/* Directives. */
+	"absolute" |
+	"abstract" |
+	"assembler" |
+	"automated" |
+	"cdecl" |
+	"contains" |
+	"default" |
+	"deprecated" |
+	"dispid" |
+	"dynamic" |
+	"export" |
+	"external" |
+	"far" |
+	"forward" |
+	"implements" |
+	"index" |
+	"library" |
+	"local" |
+	"message" |
+	"name" |
+	"namespaces" |
+	"near" |
+	"nil" |
+	"nodefault" |
+	"overload" |
+	"override" |
+	"package" |
+	"pascal" |
+	"platform" |
+	"private" |
+	"protected" |
+	"public" |
+	"published" |
+	"read" |
+	"readonly" |
+	"register" |
+	"reintroduce" |
+	"requires" |
+	"resident" |
+	"safecall" |
+	"self" |
+	"stdcall" |
+	"stored" |
+	"varargs" |
+	"virtual" |
+	"write" |
+	"writeonly"				{ addToken(Token.FUNCTION); }
+
+	/* Data types. */
+	"shortint" |
+	"byte" |
+	"char" |
+	"smallint" |
+	"integer" |
+	"word" |
+	"longint" |
+	"cardinal" |
+	"boolean" |
+	"bytebool" |
+	"wordbool" |
+	"longbool" |
+	"real" |
+	"single" |
+	"double" |
+	"extended" |
+	"comp" |
+	"currency" |
+	"pointer"					{ addToken(Token.DATA_TYPE); }
+
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{EscapeSequence}				{ addToken(Token.PREPROCESSOR); }
+
+	/* Comment literals. */
+	{CompilerDirective1Begin}	{start = zzMarkedPos-2; yybegin(COMPILER_DIRECTIVE); }
+	{CompilerDirective2Begin}	{start = zzMarkedPos-3; yybegin(COMPILER_DIRECTIVE2); }
+	{MLCBegin}					{ start = zzMarkedPos-1; yybegin(MLC); }
+	{MLC2Begin}						{ start = zzMarkedPos-2; yybegin(MLC2); }
+	{LineCommentBegin}				{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\}]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.COMMENT_MULTILINE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<MLC2> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
+	{MLC2End}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
+
+}
+
+
+<COMPILER_DIRECTIVE> {
+	[^\n\}]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.PREPROCESSOR); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
+}
+
+
+<COMPILER_DIRECTIVE2> {
+	[^\n\*]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
+	{MLC2End}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
+}
+
+
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java	(revision 25584)
@@ -0,0 +1,1631 @@
+/* The following code was generated by JFlex 1.4.1 on 8/19/09 10:23 AM */
+
+/*
+ * 7/28/2009
+ *
+ * DelphiTokenMaker.java - Scanner for the Delphi programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Delphi programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated DelphiTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class DelphiTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int COMPILER_DIRECTIVE = 3;
+  public static final int EOL_COMMENT = 5;
+  public static final int YYINITIAL = 0;
+  public static final int COMPILER_DIRECTIVE2 = 4;
+  public static final int MLC = 1;
+  public static final int MLC2 = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\13\1\12\1\0\1\13\1\7\22\0\1\13\1\42\1\7"+
+    "\1\10\1\11\1\42\1\42\1\14\1\17\1\21\1\20\1\27\1\42"+
+    "\1\27\1\30\1\22\1\4\7\6\2\3\1\45\1\42\1\44\1\46"+
+    "\1\44\1\42\1\43\3\5\1\25\1\26\1\25\5\1\1\24\13\1"+
+    "\1\23\2\1\1\41\1\0\1\41\1\44\1\2\1\0\1\36\1\55"+
+    "\1\60\1\62\1\34\1\35\1\56\1\47\1\51\1\66\1\67\1\37"+
+    "\1\54\1\57\1\61\1\50\1\70\1\32\1\40\1\31\1\33\1\63"+
+    "\1\52\1\64\1\53\1\65\1\15\1\7\1\16\1\42\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\6\0\1\1\1\2\2\3\1\2\1\4\1\5\1\6"+
+    "\1\7\1\10\1\11\1\12\1\11\1\12\11\2\1\12"+
+    "\14\2\1\13\1\14\1\15\4\13\1\16\2\13\1\17"+
+    "\1\20\1\13\1\21\2\13\1\22\3\13\1\23\1\3"+
+    "\1\24\1\23\1\24\1\23\1\25\1\23\1\26\1\27"+
+    "\1\30\1\31\3\2\1\32\15\2\1\32\20\2\1\32"+
+    "\31\2\1\32\3\2\4\0\1\33\1\34\4\0\1\24"+
+    "\1\0\2\25\1\35\22\2\1\36\2\2\1\32\73\2"+
+    "\1\32\1\2\10\0\1\37\1\2\1\40\1\36\56\2"+
+    "\1\40\2\2\1\36\16\2\2\0\1\41\2\0\1\42"+
+    "\13\2\1\32\40\2\1\32\10\2\4\0\10\2\1\36"+
+    "\65\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[437];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\71\0\162\0\253\0\344\0\u011d\0\u0156\0\u018f"+
+    "\0\u01c8\0\u0201\0\u023a\0\u0273\0\u023a\0\u02ac\0\u02e5\0\u031e"+
+    "\0\u0357\0\u023a\0\u023a\0\u0390\0\u03c9\0\u0402\0\u043b\0\u0474"+
+    "\0\u04ad\0\u04e6\0\u051f\0\u0558\0\u0591\0\u0156\0\u05ca\0\u0603"+
+    "\0\u063c\0\u0675\0\u06ae\0\u06e7\0\u0720\0\u0759\0\u0792\0\u07cb"+
+    "\0\u0804\0\u083d\0\u0876\0\u023a\0\u023a\0\u08af\0\u08e8\0\u0921"+
+    "\0\u095a\0\u023a\0\u0993\0\u09cc\0\u023a\0\u023a\0\u0a05\0\u023a"+
+    "\0\u0a3e\0\u0a77\0\u023a\0\u0ab0\0\u0ae9\0\u0b22\0\u0b5b\0\u0b5b"+
+    "\0\u0b5b\0\u0b94\0\u0bcd\0\u0c06\0\u0c3f\0\u0c78\0\u023a\0\u023a"+
+    "\0\u0cb1\0\u023a\0\u0cea\0\u0d23\0\u0d5c\0\u018f\0\u0d95\0\u0dce"+
+    "\0\u0e07\0\u0e40\0\u0e79\0\u0eb2\0\u0eeb\0\u0f24\0\u0f5d\0\u0f96"+
+    "\0\u0fcf\0\u1008\0\u1041\0\u107a\0\u10b3\0\u10ec\0\u1125\0\u115e"+
+    "\0\u1197\0\u11d0\0\u1209\0\u1242\0\u127b\0\u12b4\0\u12ed\0\u1326"+
+    "\0\u135f\0\u1398\0\u13d1\0\u140a\0\u1443\0\u147c\0\u14b5\0\u14ee"+
+    "\0\u1527\0\u1560\0\u1599\0\u15d2\0\u160b\0\u1644\0\u167d\0\u16b6"+
+    "\0\u16ef\0\u1728\0\u1761\0\u179a\0\u17d3\0\u180c\0\u1845\0\u187e"+
+    "\0\u18b7\0\u18f0\0\u1929\0\u1962\0\u199b\0\u19d4\0\u1a0d\0\u1a46"+
+    "\0\u1a7f\0\u1ab8\0\u1af1\0\u1b2a\0\u1b63\0\u1b9c\0\u023a\0\u023a"+
+    "\0\u1bd5\0\u1c0e\0\u1c47\0\u1c80\0\u1cb9\0\u1cf2\0\u0b5b\0\u1d2b"+
+    "\0\u023a\0\u1d64\0\u1d9d\0\u1dd6\0\u1e0f\0\u1e48\0\u1e81\0\u1eba"+
+    "\0\u1ef3\0\u1f2c\0\u1f65\0\u1f9e\0\u1fd7\0\u2010\0\u2049\0\u2082"+
+    "\0\u20bb\0\u20f4\0\u212d\0\u018f\0\u2166\0\u219f\0\u21d8\0\u2211"+
+    "\0\u224a\0\u2283\0\u22bc\0\u22f5\0\u232e\0\u2367\0\u23a0\0\u23d9"+
+    "\0\u2412\0\u244b\0\u2484\0\u24bd\0\u24f6\0\u252f\0\u2568\0\u25a1"+
+    "\0\u25da\0\u2613\0\u264c\0\u2685\0\u26be\0\u26f7\0\u2730\0\u2769"+
+    "\0\u27a2\0\u27db\0\u2814\0\u284d\0\u2886\0\u28bf\0\u28f8\0\u2931"+
+    "\0\u296a\0\u29a3\0\u29dc\0\u2a15\0\u2a4e\0\u2a87\0\u2ac0\0\u2af9"+
+    "\0\u2b32\0\u2b6b\0\u2ba4\0\u2bdd\0\u2c16\0\u2c4f\0\u2c88\0\u2cc1"+
+    "\0\u2cfa\0\u2d33\0\u2d6c\0\u2da5\0\u2dde\0\u2e17\0\u2e50\0\u2e89"+
+    "\0\u2ec2\0\u2efb\0\u2f34\0\u2f6d\0\u2fa6\0\u2fdf\0\u3018\0\u3051"+
+    "\0\u308a\0\u30c3\0\u30fc\0\u3135\0\u018f\0\u316e\0\u018f\0\u31a7"+
+    "\0\u31e0\0\u3219\0\u3252\0\u328b\0\u32c4\0\u32fd\0\u3336\0\u336f"+
+    "\0\u33a8\0\u33e1\0\u341a\0\u3453\0\u348c\0\u34c5\0\u34fe\0\u3537"+
+    "\0\u3570\0\u35a9\0\u35e2\0\u361b\0\u3654\0\u368d\0\u36c6\0\u36ff"+
+    "\0\u3738\0\u3771\0\u37aa\0\u37e3\0\u381c\0\u3855\0\u388e\0\u38c7"+
+    "\0\u3900\0\u3939\0\u3972\0\u39ab\0\u39e4\0\u3a1d\0\u3a56\0\u3a8f"+
+    "\0\u3ac8\0\u3b01\0\u3b3a\0\u3b73\0\u3bac\0\u3be5\0\u3c1e\0\u3c57"+
+    "\0\u3c90\0\u3cc9\0\u3d02\0\u3d3b\0\u3d74\0\u3dad\0\u3de6\0\u3e1f"+
+    "\0\u3e58\0\u3e91\0\u3eca\0\u3f03\0\u3f3c\0\u3f75\0\u3fae\0\u3fe7"+
+    "\0\u4020\0\u4059\0\u4092\0\u40cb\0\u4104\0\u413d\0\u4176\0\u41af"+
+    "\0\u41e8\0\u4221\0\u425a\0\u4293\0\u42cc\0\u4305\0\u433e\0\u4377"+
+    "\0\u43b0\0\u43e9\0\u4422\0\u445b\0\u4494\0\u44cd\0\u4506\0\u453f"+
+    "\0\u4578\0\u45b1\0\u45ea\0\u4623\0\u465c\0\u4695\0\u46ce\0\u4707"+
+    "\0\u4740\0\u4779\0\u47b2\0\u47eb\0\u4824\0\u485d\0\u4896\0\u48cf"+
+    "\0\u4908\0\u4941\0\u497a\0\u49b3\0\u49ec\0\u4a25\0\u4a5e\0\u4a97"+
+    "\0\u4ad0\0\u4b09\0\u3eca\0\u4b42\0\u4b7b\0\u4bb4\0\u4bed\0\u4c26"+
+    "\0\u4c5f\0\u4c98\0\u4cd1\0\u4d0a\0\u4092\0\u4d43\0\u413d\0\u4d7c"+
+    "\0\u4db5\0\u4dee\0\u4e27\0\u4e60\0\u4e99\0\u4ed2\0\u4f0b\0\u1fd7"+
+    "\0\u4f44\0\u4f7d\0\u4fb6\0\u4fef\0\u5028\0\u5061\0\u509a\0\u50d3"+
+    "\0\u510c\0\u5145\0\u517e\0\u51b7\0\u51f0\0\u5229\0\u5262\0\u529b"+
+    "\0\u52d4\0\u530d\0\u5346\0\u537f\0\u53b8\0\u53f1\0\u542a\0\u5463"+
+    "\0\u549c\0\u54d5\0\u550e\0\u5547\0\u5580\0\u55b9\0\u55f2\0\u562b"+
+    "\0\u5664\0\u569d\0\u56d6\0\u570f\0\u5748\0\u5781\0\u57ba\0\u57f3"+
+    "\0\u582c\0\u5865\0\u589e\0\u58d7\0\u5910\0\u5949\0\u5982\0\u59bb"+
+    "\0\u59f4\0\u5a2d\0\u5a66\0\u5a9f\0\u5ad8";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[437];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\7\2\10\1\11\1\12\1\10\1\11\1\13\1\14"+
+    "\1\10\1\15\1\16\1\17\1\20\1\13\1\21\1\22"+
+    "\1\23\1\24\4\10\1\22\1\25\1\26\1\27\1\30"+
+    "\1\31\1\32\1\33\1\34\1\35\1\23\1\13\1\36"+
+    "\3\22\1\10\1\37\1\40\1\41\1\10\1\42\1\43"+
+    "\1\44\1\45\1\46\1\47\1\50\1\51\1\52\4\10"+
+    "\12\53\1\54\3\53\1\55\16\53\1\56\11\53\1\57"+
+    "\2\53\1\60\16\53\12\61\1\62\5\61\1\63\14\61"+
+    "\1\56\11\61\1\57\2\61\1\60\16\61\12\64\1\65"+
+    "\3\64\1\66\52\64\12\67\1\70\5\67\1\71\50\67"+
+    "\12\72\1\73\22\72\1\74\11\72\1\75\2\72\1\76"+
+    "\16\72\7\7\1\0\2\7\11\0\4\7\2\0\10\7"+
+    "\2\0\1\7\3\0\23\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\22\10"+
+    "\3\77\2\11\1\77\1\11\1\0\2\77\11\0\1\77"+
+    "\1\100\1\101\1\102\1\0\1\103\3\77\1\102\1\101"+
+    "\1\77\1\100\1\77\2\0\1\77\3\0\13\77\1\101"+
+    "\11\77\1\104\1\105\1\77\1\105\1\0\2\77\11\0"+
+    "\1\106\1\100\1\101\1\102\1\0\1\103\3\77\1\102"+
+    "\1\101\1\77\1\100\1\77\2\0\1\77\3\0\13\77"+
+    "\1\101\1\77\1\106\4\77\71\0\3\7\2\14\1\7"+
+    "\1\14\1\0\2\7\11\0\4\7\2\0\10\7\2\0"+
+    "\1\7\3\0\22\7\13\0\1\16\55\0\14\17\1\107"+
+    "\54\17\11\0\1\110\77\0\1\111\72\0\1\112\51\0"+
+    "\2\103\1\0\1\103\62\0\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\113\6\10\2\0"+
+    "\1\7\3\0\1\114\3\10\1\115\5\10\1\116\7\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\117\1\10\1\120\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\7\10\1\121\2\0\1\7\3\0\10\10\1\122"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\123\1\10\2\0\1\7\3\0\10\10"+
+    "\1\124\4\10\1\125\4\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\2\10\1\126\2\10\1\127"+
+    "\2\10\2\0\1\7\3\0\2\10\1\130\7\10\1\131"+
+    "\7\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\116\1\132\1\133\4\10\1\134\2\0\1\7"+
+    "\3\0\6\10\1\135\13\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\5\10\1\136\2\10\2\0"+
+    "\1\7\3\0\2\10\1\137\7\10\1\140\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\141"+
+    "\2\10\1\142\1\10\1\143\2\10\2\0\1\7\3\0"+
+    "\1\144\1\10\1\145\2\10\1\146\14\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\147"+
+    "\1\150\2\10\1\151\1\152\1\10\2\0\1\7\3\0"+
+    "\12\10\1\153\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\4\10\1\116\2\10\1\116\2\0"+
+    "\1\7\3\0\5\10\1\154\2\10\1\155\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\156\6\10\2\0\1\7\3\0\1\157\1\10\1\160"+
+    "\7\10\1\161\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\162\4\10\2\0\1\7"+
+    "\3\0\12\10\1\124\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\163\4\10\2\0"+
+    "\1\7\3\0\4\10\1\164\5\10\1\165\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\166\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\167"+
+    "\1\10\1\170\2\10\2\0\1\7\3\0\2\10\1\171"+
+    "\7\10\1\172\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\2\10\1\173\2\10\1\174\1\175"+
+    "\1\10\2\0\1\7\3\0\1\176\11\10\1\177\1\200"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\116\1\201\1\10\1\116\3\10\2\0"+
+    "\1\7\3\0\6\10\1\202\1\10\1\116\3\10\1\203"+
+    "\5\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\204\4\10\2\0\1\7\3\0\2\10"+
+    "\1\205\1\10\1\206\5\10\1\207\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\210"+
+    "\2\10\2\0\1\7\3\0\2\10\1\211\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\212\7\10\12\53\1\0"+
+    "\3\53\1\0\16\53\1\0\11\53\1\0\2\53\1\0"+
+    "\16\53\31\0\1\213\17\0\1\214\50\0\1\215\111\0"+
+    "\1\216\16\0\12\61\1\0\5\61\1\0\14\61\1\0"+
+    "\11\61\1\0\2\61\1\0\16\61\21\0\1\217\47\0"+
+    "\12\64\1\0\3\64\1\0\52\64\12\67\1\0\5\67"+
+    "\1\0\50\67\21\0\1\220\47\0\12\72\1\0\22\72"+
+    "\1\0\11\72\1\0\2\72\1\0\16\72\31\0\1\221"+
+    "\17\0\1\222\50\0\1\223\111\0\1\224\16\0\7\77"+
+    "\1\0\2\77\11\0\4\77\2\0\10\77\2\0\1\77"+
+    "\3\0\25\77\2\225\1\77\1\225\1\0\2\77\11\0"+
+    "\4\77\1\226\1\0\10\77\2\0\1\77\3\0\25\77"+
+    "\2\103\1\77\1\103\1\0\2\77\11\0\2\77\1\101"+
+    "\1\102\2\0\3\77\1\102\1\101\3\77\2\0\1\77"+
+    "\3\0\13\77\1\101\11\77\2\104\1\77\1\104\1\0"+
+    "\2\77\11\0\2\77\1\101\1\102\1\0\1\103\3\77"+
+    "\1\102\1\101\3\77\2\0\1\77\3\0\13\77\1\101"+
+    "\11\77\1\104\1\105\1\77\1\105\1\0\2\77\11\0"+
+    "\1\77\1\227\1\101\1\102\1\0\1\103\3\77\1\102"+
+    "\1\101\1\77\1\227\1\77\2\0\1\77\3\0\13\77"+
+    "\1\101\11\77\4\230\1\0\2\77\11\0\2\77\2\230"+
+    "\2\0\3\77\3\230\2\77\2\0\1\77\3\0\6\77"+
+    "\1\230\2\77\1\230\1\77\1\230\6\77\11\0\1\231"+
+    "\57\0\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\2\10\1\232\5\10\2\0\1\7\3\0\4\10"+
+    "\1\116\15\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\233\1\10\1\234\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\1\10"+
+    "\1\235\20\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\236\1\10\1\237\2\0\1\7"+
+    "\3\0\1\10\1\240\1\241\4\10\1\242\1\10\1\243"+
+    "\7\10\1\244\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\123"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\245\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\246\6\10\1\247\2\0\1\7\3\0\2\10\1\201"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\7\10\1\235\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\13\10\1\116\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\250\7\10"+
+    "\2\0\1\7\3\0\1\10\1\251\7\10\1\252\10\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\253\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\254\4\10\1\255\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\235\1\10\2\0\1\7\3\0\10\10\1\256"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\257\6\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\10\1\260\6\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\261"+
+    "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\7\10\1\262\2\0"+
+    "\1\7\3\0\5\10\1\116\14\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\7\10\1\263\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\6\10"+
+    "\1\264\13\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\265"+
+    "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\10\10\1\266\1\267"+
+    "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\270\3\10\1\271\2\10\2\0\1\7"+
+    "\3\0\12\10\1\272\1\273\6\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\116\4\10\1\274"+
+    "\1\275\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\4\10\1\276"+
+    "\3\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\10\1\116\4\10"+
+    "\1\116\1\10\2\0\1\7\3\0\12\10\1\277\7\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\300\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\301\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\2\10\1\302\7\10\1\303\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\6\10\1\304\13\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\7\10\1\305"+
+    "\2\0\1\7\3\0\11\10\1\306\10\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\307"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\310\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\1\10\1\311\20\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\312\5\10\1\313\1\10\2\0"+
+    "\1\7\3\0\1\314\1\10\1\315\10\10\1\316\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\317\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\320\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\321\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\322\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\7\10\1\323\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\7\10\1\324\12\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\325\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\12\10\1\326\7\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\327\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\330\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\5\10\1\331"+
+    "\14\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\254\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\116\7\10\2\0\1\7\3\0\13\10\1\332\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\10\1\333\6\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\334\5\10\1\235\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\335\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\336"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\5\10\1\337\2\10\1\340\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\341"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\116\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\17\10"+
+    "\1\342\2\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\3\10\1\343\4\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\4\10\1\344\2\10\1\345\2\0\1\7\3\0"+
+    "\1\10\1\346\20\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\7\10\1\347\2\0\1\7\3\0"+
+    "\14\10\1\116\5\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\10\10"+
+    "\1\350\11\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\2\10\1\351\5\10\2\0\1\7\3\0"+
+    "\3\10\1\352\16\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\353\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\354\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\116\6\10\2\0\1\7\3\0\22\10"+
+    "\50\0\1\355\57\0\1\356\62\0\1\357\111\0\1\360"+
+    "\66\0\1\361\57\0\1\362\62\0\1\363\111\0\1\364"+
+    "\16\0\3\77\2\225\1\77\1\225\1\0\2\77\11\0"+
+    "\2\77\1\101\1\77\2\0\4\77\1\101\3\77\2\0"+
+    "\1\77\3\0\13\77\1\101\6\77\3\0\2\225\1\0"+
+    "\1\225\62\0\3\77\4\230\1\0\2\77\11\0\1\77"+
+    "\1\227\2\230\2\0\3\77\3\230\1\227\1\77\2\0"+
+    "\1\77\3\0\6\77\1\230\2\77\1\230\1\77\1\230"+
+    "\6\77\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\365\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\366\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\116\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\116"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\6\10\1\367\1\10"+
+    "\2\0\1\7\3\0\13\10\1\370\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\2\10\1\371\7\10\1\372\7\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+    "\1\373\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\10\10\1\374\11\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\375\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\12\10\1\376\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\2\10\1\377\5\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\7\10\1\116\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\u0100\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\u0101\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0102"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\12\10\1\u0103\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u0104\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\u0105\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\7\10\1\232\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\u0106\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\3\10\1\u0107\16\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u0108"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\12\10\1\u0109\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u010a\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u010b\7\10\2\0\1\7\3\0"+
+    "\12\10\1\u010c\7\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u0100\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u010d\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\7\10\1\u010e\12\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\171\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u010f\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0110\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u0111\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\u0112\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\6\10\1\u0113\1\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\4\10\1\254\3\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\273\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\u0114\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\7\10\1\u0115\12\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\6\10\1\u0116\1\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\14\10\1\u0117\5\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u0118\7\10\2\0\1\7\3\0"+
+    "\1\10\1\u0119\5\10\1\u011a\1\10\1\u011b\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+    "\1\u011c\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\11\10\1\267\10\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\20\10\1\u011d\1\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\u011e\7\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\10\10\1\u011f"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\u0120\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\u0121\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u0122\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0123"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\u0124\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u0125\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u0126\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\235\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\1\116\21\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\13\10\1\u0127\6\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\7\10\1\u0128\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\234"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\u0127\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\u0129\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\116\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\254"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u012a\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u012b\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\u012c\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\u012d"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\7\10\1\245\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\367\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\1\10\1\367\20\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\u012e\6\10\1\u012f"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\11\10\1\171\10\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u0130\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u0131\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0132\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\u0133\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0134"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\1\10\1\u0135\20\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\5\10\1\u0136\2\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\6\10"+
+    "\1\u0115\13\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\10\10\1\166"+
+    "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0137\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\u0138\7\10\2\0\1\7\3\0\22\10\45\0\1\u0139"+
+    "\57\0\1\355\104\0\1\u013a\50\0\1\u013b\105\0\1\u013c"+
+    "\57\0\1\361\104\0\1\u013d\50\0\1\u013e\40\0\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\u013f\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\12\10\1\u0140\7\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\13\10\1\u0141\6\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\2\10\1\u0142\5\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\201\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u0143\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\7\10\1\u0144\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\124"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\u0145\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\6\10\1\116\1\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\4\10\1\235\3\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u0146\6\10\2\0\1\7\3\0"+
+    "\10\10\1\u0147\11\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\u0148\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\1\10\1\201"+
+    "\20\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u0149\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+    "\1\u014a\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u014b"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\4\10\1\116\15\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\5\10\1\u014c\14\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\5\10"+
+    "\1\u014d\14\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u014e\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\u014f\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\u0150\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u0151\3\10\1\u0152\13\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\u0153\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\2\10\1\u0154\17\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0155"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\5\10\1\u0156\2\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\124\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u0157\7\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\u0158\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\u0157\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+    "\1\u0159\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u015a"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u015b\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u015c\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\u015d\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\u015e"+
+    "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\124\1\10\1\u015f\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\4\10\1\u0160\3\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u0161\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+    "\1\u0162\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0163"+
+    "\6\10\2\0\1\7\3\0\7\10\1\u0161\12\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\235\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0164"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\u0165\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\15\10\1\254\4\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\3\10\1\370\4\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\u0152"+
+    "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u015f\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\3\10\1\u0166\4\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\7\10"+
+    "\1\u0167\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\4\10\1\344\3\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u0168\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+    "\1\u0169\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\u016a\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u016b\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\11\10\1\201\10\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u016c"+
+    "\4\10\1\u016d\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\2\10"+
+    "\1\u016e\5\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u016f"+
+    "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u0170\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\2\10\1\u0171\17\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\5\10"+
+    "\1\u0172\14\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u0173\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\2\10\1\267\5\10\2\0\1\7\3\0\22\10"+
+    "\22\0\1\u0174\106\0\1\355\4\0\1\u0139\24\0\1\u013b"+
+    "\1\u0175\4\u013b\1\0\1\u0175\1\u013b\2\0\1\u0175\2\0"+
+    "\3\u0175\5\u013b\2\u0175\10\u013b\3\u0175\1\0\2\u0175\22\u013b"+
+    "\22\0\1\u0176\106\0\1\361\4\0\1\u013c\24\0\1\u013e"+
+    "\1\u0177\4\u013e\1\0\1\u0177\1\u013e\2\0\1\u0177\2\0"+
+    "\3\u0177\5\u013e\2\u0177\10\u013e\3\u0177\1\0\2\u0177\22\u013e"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\13\10\1\u0178\6\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\u0179\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u017a"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\10\1\u017b\6\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u017c\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\u017d\7\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\10\1\u017e\6\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\267\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\13\10\1\u017f\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0180\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\2\10\1\u0181\17\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\6\10\1\u0108\1\10\2\0\1\7"+
+    "\3\0\2\10\1\u0182\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\u0155\6\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\u0183\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\u0184"+
+    "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0185\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\2\10\1\u0159\5\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\u0186\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\10\10\1\u0187\11\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\12\10\1\u0188\7\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\7\10\1\116\12\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\116\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\254"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\6\10\1\171\1\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\u0151\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+    "\1\367\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0189\7\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\11\10\1\u0183\10\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\1\10\1\u018a\6\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\u018b\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\13\10\1\u018c\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\7\10\1\u018d\2\0\1\7\3\0\11\10\1\254\10\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\7\10\1\u0189\12\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\u018e\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\336"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\5\10\1\u018f\14\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\4\10\1\u0190\3\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+    "\1\u0191\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\5\10\1\u0192\2\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0193\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\1\10\1\u0194\20\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\u0195\11\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\10\10\1\u0196\11\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\2\10\1\u0197\17\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\2\10\1\u0198\17\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\12\10"+
+    "\1\u0199\7\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\6\10\1\u019a\1\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\2\10\1\u019b\5\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\11\10\1\u014c\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\10\10\1\u019c\2\10\1\254\6\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\2\10\1\u019d\17\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\7\10\1\u019e\12\10\22\0\1\u013b"+
+    "\70\0\1\u013e\46\0\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\14\10"+
+    "\1\u019f\5\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\6\10\1\u0186\1\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\10\10\1\u019a\11\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\11\10\1\u01a0\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\12\10\1\u01a1\7\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\330"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\3\10\1\u019e\4\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u01a2\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\12\10"+
+    "\1\234\7\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\16\10\1\u01a3"+
+    "\3\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\1\u0111\7\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+    "\1\u017d\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\11\10\1\u019a\10\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\4\10\1\254\15\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\367\7\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\12\10\1\u01a4"+
+    "\7\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\254\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\u0108\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\5\10\1\116\14\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\2\10\1\u01a5\5\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\1\u0111\21\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\10\1\u01a6\6\10\2\0\1\7\3\0"+
+    "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\3\10\1\u01a7\4\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\5\10\1\u01a8\2\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\u0113"+
+    "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\6\10\1\u01a9\1\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\10\10\1\367\11\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\5\10\1\u01aa\2\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\11\10\1\u01ab"+
+    "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u01a4\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\10\10\1\u019e\11\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+    "\2\0\1\7\3\0\13\10\1\u0189\6\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u0155"+
+    "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\1\254\7\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+    "\1\u01ac\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u01ad\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\10\10\2\0\1\7\3\0\11\10\1\254\10\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\7\10"+
+    "\1\254\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\5\10\1\212\2\10"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\3\10\1\u01ae\4\10\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\13\10"+
+    "\1\u01af\6\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\367"+
+    "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\5\10\1\u0105\2\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\6\10\1\367\1\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+    "\1\235\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+    "\1\7\3\0\5\10\1\254\14\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\10\10\1\u01b0\11\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+    "\11\10\1\235\10\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+    "\1\u0182\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\10\10\2\0\1\7\3\0\11\10\1\u017e"+
+    "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+    "\2\0\10\10\2\0\1\7\3\0\4\10\1\367\15\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\52\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+    "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u01b1"+
+    "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\7\10\1\u01b2\2\0"+
+    "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+    "\11\0\4\10\2\0\2\10\1\u01b3\5\10\2\0\1\7"+
+    "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+    "\4\10\2\0\1\u01b4\7\10\2\0\1\7\3\0\22\10"+
+    "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+    "\1\10\1\u0163\6\10\2\0\1\7\3\0\22\10\1\7"+
+    "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\u01b5"+
+    "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+    "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+    "\3\0\11\10\1\u0189\10\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\5\10\1\u0105\1\10\1\254"+
+    "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+    "\1\10\11\0\4\10\2\0\1\10\1\270\6\10\2\0"+
+    "\1\7\3\0\22\10";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[23313];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\6\0\4\1\1\11\1\1\1\11\4\1\2\11\30\1"+
+    "\2\11\4\1\1\11\2\1\2\11\1\1\1\11\2\1"+
+    "\1\11\13\1\2\11\1\1\1\11\100\1\4\0\2\11"+
+    "\4\0\1\1\1\0\2\1\1\11\123\1\10\0\104\1"+
+    "\2\0\1\1\2\0\66\1\4\0\76\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[437];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*" comment.
+	 */
+	public static final int INTERNAL_MLC2			= -1;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "{$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE	= -2;
+
+	/**
+	 * Token type specific to DelphiTokenMaker; denotes a line ending
+	 * with an unterminated "(*$" compiler directive.
+	 */
+	public static final int INTERNAL_COMPILER_DIRECTIVE2	= -3;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DelphiTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_MLC2:
+				state = MLC2;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE:
+				state = COMPILER_DIRECTIVE;
+				start = text.offset;
+				break;
+			case INTERNAL_COMPILER_DIRECTIVE2:
+				state = COMPILER_DIRECTIVE2;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public DelphiTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public DelphiTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 158) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken;
+          }
+        case 35: break;
+        case 4: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 36: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 37: break;
+        case 27: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 38: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 39: break;
+        case 21: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 40: break;
+        case 20: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 41: break;
+        case 26: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 42: break;
+        case 16: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.PREPROCESSOR);
+          }
+        case 43: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 44: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken;
+          }
+        case 45: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 46: break;
+        case 18: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 25: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 48: break;
+        case 30: 
+          { addToken(Token.FUNCTION);
+          }
+        case 49: break;
+        case 7: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 50: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken;
+          }
+        case 51: break;
+        case 32: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 52: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 53: break;
+        case 31: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 54: break;
+        case 22: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 55: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 56: break;
+        case 29: 
+          { start = zzMarkedPos-3; yybegin(COMPILER_DIRECTIVE2);
+          }
+        case 57: break;
+        case 24: 
+          { start = zzMarkedPos-2; yybegin(MLC2);
+          }
+        case 58: break;
+        case 33: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 59: break;
+        case 19: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 60: break;
+        case 28: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR);
+          }
+        case 61: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.COMMENT_MULTILINE);
+          }
+        case 62: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 63: break;
+        case 10: 
+          { addToken(Token.OPERATOR);
+          }
+        case 64: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(MLC);
+          }
+        case 65: break;
+        case 23: 
+          { start = zzMarkedPos-2; yybegin(COMPILER_DIRECTIVE);
+          }
+        case 66: break;
+        case 11: 
+          { 
+          }
+        case 67: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 68: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case COMPILER_DIRECTIVE: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken;
+            }
+            case 438: break;
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 439: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 440: break;
+            case COMPILER_DIRECTIVE2: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken;
+            }
+            case 441: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 442: break;
+            case MLC2: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken;
+            }
+            case 443: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex	(revision 25584)
@@ -0,0 +1,345 @@
+/*
+ * 04/12/2012
+ *
+ * DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for DTD files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+%%
+
+%public
+%class DtdTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_START					= -1;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ELEMENT					= -2;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ATTLIST			= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_COMMENT			= -(1<<11);
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DtdTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		prevState = YYINITIAL;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case INTERNAL_INTAG_START:
+				state = INTAG_START;
+				break;
+			case INTERNAL_INTAG_ELEMENT:
+				state = INTAG_ELEMENT;
+				break;
+			case INTERNAL_INTAG_ATTLIST:
+				state = INTAG_ATTLIST;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = YYINITIAL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Whitespace			= ([ \t\f])
+LineTerminator			= ([\n])
+UnclosedString		= ([\"][^\"]*)
+UnclosedChar		= ([\'][^\']*)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ([A-Za-z_0-9\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$A-Za-z0-9])
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state INTAG_START
+%state INTAG_ELEMENT
+%state INTAG_ATTLIST
+
+%%
+
+<YYINITIAL> {
+	([^ \t\f<]+)				{ /* Not really valid */ addToken(Token.IDENTIFIER); }
+	"<!--"						{ start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT); }
+	"<!"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG_START); }
+	"<"							{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	{LineTerminator} |
+	<<EOF>>						{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+	"-->"						{ int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState); }
+	"-"							{}
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken; }
+}
+
+<INTAG_START> {
+	("ELEMENT")					{ addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ELEMENT); }
+	("ATTLIST")					{ addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ATTLIST); }
+	([^ \t\f>]+)				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	(">")						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	<<EOF>>						{ addEndToken(INTERNAL_INTAG_START); return firstToken; }
+}
+
+<INTAG_ELEMENT> {
+	([^ \t\f>]+)				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	(">")						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	<<EOF>>						{ addEndToken(INTERNAL_INTAG_ELEMENT); return firstToken; }
+}
+
+<INTAG_ATTLIST> {
+	("CDATA"|"#IMPLIED"|"#REQUIRED")	{ addToken(Token.MARKUP_PROCESSING_INSTRUCTION); }
+	([^ \t\f>\"\']+)			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	({UnclosedString}[\"]?)		{ addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	({UnclosedChar}[\']?)		{ addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	(">")						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	<<EOF>>						{ addEndToken(INTERNAL_INTAG_ATTLIST); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java	(revision 25584)
@@ -0,0 +1,828 @@
+/* The following code was generated by JFlex 1.4.1 on 4/14/12 10:23 AM */
+
+/*
+ * 04/12/2012
+ *
+ * DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for DTD files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+
+public class DtdTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INTAG_START = 2;
+  public static final int INTAG_ELEMENT = 3;
+  public static final int YYINITIAL = 0;
+  public static final int INTAG_ATTLIST = 4;
+  public static final int COMMENT = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\1\24\1\3\1\41"+
+    "\1\7\1\5\1\5\1\4\5\5\1\25\1\22\1\6\12\7\1\20"+
+    "\1\5\1\23\1\5\1\26\2\5\1\34\1\7\1\37\1\40\1\27"+
+    "\3\7\1\35\2\7\1\30\1\31\1\32\1\7\1\42\1\44\1\43"+
+    "\1\36\1\33\1\45\5\7\1\5\1\0\1\5\1\0\1\5\1\0"+
+    "\4\7\1\17\1\14\1\7\1\10\1\15\2\7\1\16\3\7\1\12"+
+    "\2\7\1\13\1\11\2\7\1\21\3\7\3\0\1\5\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\5\0\1\1\1\2\1\3\1\4\1\5\4\4\1\3"+
+    "\1\6\2\3\2\7\2\10\2\7\1\11\5\0\2\3"+
+    "\1\10\3\7\5\0\1\12\2\3\3\7\1\13\2\0"+
+    "\1\14\2\3\3\7\2\0\2\3\1\15\2\7\2\3"+
+    "\2\7\1\16\1\17\1\7";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[70];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\46\0\114\0\162\0\230\0\276\0\344\0\u010a"+
+    "\0\u0130\0\u0156\0\u017c\0\u01a2\0\u01c8\0\u01ee\0\u0214\0\u0156"+
+    "\0\u023a\0\u0260\0\u0286\0\u02ac\0\u02d2\0\u02f8\0\u031e\0\u0344"+
+    "\0\u036a\0\u0390\0\u03b6\0\u03dc\0\u0402\0\u0428\0\u044e\0\u0474"+
+    "\0\u0156\0\u049a\0\u04c0\0\u04e6\0\u050c\0\u0532\0\u0558\0\u057e"+
+    "\0\u05a4\0\u0156\0\u05ca\0\u05f0\0\u0616\0\u063c\0\u0662\0\u0156"+
+    "\0\u0688\0\u06ae\0\u06d4\0\u06fa\0\u0720\0\u0746\0\u076c\0\u0792"+
+    "\0\u07b8\0\u06d4\0\u07de\0\u0804\0\u02ac\0\u082a\0\u0850\0\u0876"+
+    "\0\u089c\0\u08c2\0\u08e8\0\u0214\0\u0214\0\u090e";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[70];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\6\1\7\21\6\1\10\22\6\2\11\1\12\5\11"+
+    "\1\13\3\11\1\14\4\11\1\15\3\11\1\16\20\11"+
+    "\1\17\1\7\24\17\1\20\1\21\4\17\1\22\11\17"+
+    "\1\23\1\7\24\23\1\20\17\23\1\24\1\7\1\24"+
+    "\1\25\1\26\21\24\1\20\10\24\1\27\1\24\1\30"+
+    "\4\24\1\6\1\0\21\6\1\0\22\6\1\0\1\7"+
+    "\70\0\1\31\21\0\2\11\1\0\5\11\1\0\3\11"+
+    "\1\0\4\11\1\0\3\11\1\0\20\11\57\0\1\32"+
+    "\45\0\1\33\3\0\1\34\51\0\1\35\51\0\1\36"+
+    "\20\0\1\17\1\0\24\17\1\0\20\17\1\0\24\17"+
+    "\1\0\1\17\1\37\16\17\1\0\24\17\1\0\4\17"+
+    "\1\40\12\17\1\23\1\0\24\23\1\0\17\23\1\24"+
+    "\1\0\1\24\2\0\21\24\1\0\17\24\3\25\1\41"+
+    "\42\25\4\26\1\41\41\26\1\24\1\0\1\24\2\0"+
+    "\21\24\1\0\11\24\1\42\6\24\1\0\1\24\2\0"+
+    "\21\24\1\0\6\24\1\43\5\24\1\44\2\24\25\0"+
+    "\1\45\31\0\1\46\46\0\1\47\51\0\1\50\50\0"+
+    "\1\51\52\0\1\52\17\0\1\17\1\0\24\17\1\0"+
+    "\1\53\17\17\1\0\24\17\1\0\4\17\1\54\12\17"+
+    "\1\24\1\0\1\24\2\0\21\24\1\0\5\24\1\55"+
+    "\12\24\1\0\1\24\2\0\21\24\1\0\2\24\1\56"+
+    "\15\24\1\0\1\24\2\0\21\24\1\0\1\57\16\24"+
+    "\25\0\1\60\32\0\1\61\53\0\1\62\44\0\1\47"+
+    "\50\0\1\63\23\0\1\17\1\0\24\17\1\0\2\17"+
+    "\1\64\15\17\1\0\24\17\1\0\1\17\1\65\15\17"+
+    "\1\24\1\0\1\24\2\0\21\24\1\0\4\24\1\66"+
+    "\13\24\1\0\1\24\2\0\21\24\1\0\13\24\1\67"+
+    "\4\24\1\0\1\24\2\0\21\24\1\0\15\24\1\70"+
+    "\1\24\13\0\1\47\4\0\1\62\33\0\1\71\43\0"+
+    "\2\72\12\63\1\72\1\63\1\72\1\0\2\72\1\0"+
+    "\12\63\1\72\4\63\1\17\1\0\24\17\1\0\1\73"+
+    "\17\17\1\0\24\17\1\0\6\17\1\74\10\17\1\24"+
+    "\1\0\1\24\2\0\21\24\1\0\5\24\1\75\12\24"+
+    "\1\0\1\24\2\0\21\24\1\0\1\24\1\76\16\24"+
+    "\1\0\1\24\2\0\21\24\1\0\16\24\1\77\6\0"+
+    "\1\63\37\0\1\17\1\0\24\17\1\0\3\17\1\100"+
+    "\14\17\1\0\24\17\1\0\7\17\1\101\7\17\1\24"+
+    "\1\0\1\24\2\0\21\24\1\0\6\24\1\102\11\24"+
+    "\1\0\1\24\2\0\21\24\1\0\6\24\1\103\10\24"+
+    "\1\17\1\0\24\17\1\0\4\17\1\104\13\17\1\0"+
+    "\24\17\1\0\4\17\1\105\12\17\1\24\1\0\1\24"+
+    "\2\0\21\24\1\0\1\106\17\24\1\0\1\24\2\0"+
+    "\21\24\1\0\14\24\1\102\3\24\1\0\1\24\2\0"+
+    "\21\24\1\0\11\24\1\75\5\24";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[2356];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\5\0\4\1\1\11\5\1\1\11\11\1\5\0\2\1"+
+    "\1\11\3\1\5\0\1\11\5\1\1\11\2\0\6\1"+
+    "\2\0\14\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[70];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_START					= -1;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ELEMENT					= -2;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_INTAG_ATTLIST			= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_COMMENT			= -(1<<11);
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public DtdTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		prevState = YYINITIAL;
+
+		// Start off in the proper state.
+		int state = YYINITIAL;
+		switch (initialTokenType) {
+			case INTERNAL_INTAG_START:
+				state = INTAG_START;
+				break;
+			case INTERNAL_INTAG_ELEMENT:
+				state = INTAG_ELEMENT;
+				break;
+			case INTERNAL_INTAG_ATTLIST:
+				state = INTAG_ATTLIST;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = YYINITIAL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public DtdTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public DtdTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 138) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 3: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 16: break;
+        case 12: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 17: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 18: break;
+        case 1: 
+          { /* Not really valid */ addToken(Token.IDENTIFIER);
+          }
+        case 19: break;
+        case 9: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG_START);
+          }
+        case 20: break;
+        case 6: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 21: break;
+        case 11: 
+          { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT);
+          }
+        case 22: break;
+        case 7: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 23: break;
+        case 10: 
+          { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState);
+          }
+        case 24: break;
+        case 15: 
+          { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ATTLIST);
+          }
+        case 25: break;
+        case 14: 
+          { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ELEMENT);
+          }
+        case 26: break;
+        case 13: 
+          { addToken(Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 27: break;
+        case 4: 
+          { 
+          }
+        case 28: break;
+        case 5: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken;
+          }
+        case 29: break;
+        case 8: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 30: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INTAG_START: {
+              addEndToken(INTERNAL_INTAG_START); return firstToken;
+            }
+            case 71: break;
+            case INTAG_ELEMENT: {
+              addEndToken(INTERNAL_INTAG_ELEMENT); return firstToken;
+            }
+            case 72: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 73: break;
+            case INTAG_ATTLIST: {
+              addEndToken(INTERNAL_INTAG_ATTLIST); return firstToken;
+            }
+            case 74: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken;
+            }
+            case 75: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex	(revision 25584)
@@ -0,0 +1,481 @@
+/*
+ * 03/23/2005
+ *
+ * FortranTokenMaker.java - Scanner for the Fortran programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Fortran programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated FortranTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class FortranTokenMaker
+%extends AbstractJFlexTokenMaker
+%implements TokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  We must have this here as there is no default,
+	 * no-parameter constructor generated by JFlex.
+	 */
+	public FortranTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "!", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+LineTerminator			= (\n)
+WhiteSpace			= ([ \t\f])
+
+Column1CommentBegin		= ([C\*])
+Column1Comment2Begin	= (D)
+AnywhereCommentBegin	= (\!)
+
+Identifier			= ([A-Za-z0-9_$]+)
+
+StringDelimiter		= (\")
+CharDelimiter			= (\')
+
+Operators1			= ("<"|">"|"<="|">="|"&"|"/="|"==")
+Operators2			= (\.(lt|gt|eq|ne|le|ge|and|or)\.)
+Operator				= ({Operators1}|{Operators2})
+
+Boolean				= (\.(true|false)\.)
+
+%state STRING
+%state CHAR
+
+%%
+
+/* Keywords */
+<YYINITIAL> "INCLUDE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PROGRAM"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MODULE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SUBROUTINE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FUNCTION"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONTAINS"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "USE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CALL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "RETURN"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IMPLICIT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXPLICIT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NONE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATA"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PARAMETER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATABLE"			{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATED"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEALLOCATE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INTEGER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DOUBLE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PRECISION"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COMPLEX"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOGICAL"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CHARACTER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIMENSION"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "KIND"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CASE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SELECT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEFAULT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONTINUE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CYCLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DO"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WHILE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IF"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSEIF"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "THEN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSEWHERE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "END"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDIF"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDDO"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FORALL"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WHERE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXIT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "GOTO"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PAUSE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "STOP"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "BACKSPACE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CLOSE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDFILE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INQUIRE"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "OPEN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PRINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "READ"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REWIND"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WRITE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FORMAT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AIMAG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ANINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CEILING"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CMPLX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONJG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DBLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCMPLX"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DFLOAT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DPROD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOAT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOOR"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IFIX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IMAG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOGICAL"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MODULO"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SNGL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TRANSFER"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ZEXT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ACOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AIMAG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALOG10"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMOD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ANINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ASIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ATAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ATAN2"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CCOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CHAR"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CLOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CMPLX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONJG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COSH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CSIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CSQRT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DACOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DASIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATAN2"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DBLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCOS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCOSH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DDIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEXP"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DLOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DLOG10"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMAX1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMIN1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMOD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DNINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DPROD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DREAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSINH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSQRT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DTAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DTANH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXP"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOAT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IABS"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ICHAR"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDIM"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDNINT"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IFIX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INDEX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ISIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LEN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LGE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LGT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LLE"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LLT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOG"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOG10"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN0"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN1"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MOD"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NINT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIGN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SINH"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SNGL"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SQRT"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TAN"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TANH"					{ addToken(Token.RESERVED_WORD); }
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{CharDelimiter}				{ start = zzMarkedPos-1; yybegin(CHAR); }
+	{StringDelimiter}				{ start = zzMarkedPos-1; yybegin(STRING); }
+
+	/* Comment Literals. */
+	/* Note that we cannot combine these as JFLex doesn't like combining an */
+	/* expression containing the beginning-of-line character '^'. */
+	{Column1CommentBegin}	{
+							// Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+						}
+	{Column1Comment2Begin}	{
+							// Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_DOCUMENTATION);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+						}
+	{AnywhereCommentBegin}	{ addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Boolean literals. */
+	{Boolean}						{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or char literal. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<CHAR> {
+	[^\'\n]*						{}
+	\'							{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	\n							{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+<STRING> {
+	[^\"\n]*						{}
+	\"							{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\n							{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java	(revision 25584)
@@ -0,0 +1,1011 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 03/23/2005
+ *
+ * FortranTokenMaker.java - Scanner for the Fortran programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Fortran programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated FortranTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class FortranTokenMaker extends AbstractJFlexTokenMaker implements TokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+  public static final int CHAR = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\2\1\1\1\0\1\2\23\0\1\2\1\5\1\10\1\0"+
+    "\1\6\1\0\1\14\1\11\2\0\1\3\3\0\1\16\1\15\1\45"+
+    "\1\50\1\51\7\6\2\0\1\12\1\13\1\12\2\0\1\25\1\37"+
+    "\1\7\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17"+
+    "\1\36\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6"+
+    "\1\44\1\40\1\43\1\47\4\0\1\6\1\0\1\25\1\37\1\34"+
+    "\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17\1\36"+
+    "\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6\1\44"+
+    "\1\40\1\43\1\47\uff85\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\1\0\2\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+    "\1\2\1\5\1\10\1\11\1\12\1\2\1\12\24\2"+
+    "\1\1\1\13\1\14\1\1\1\15\1\16\7\2\1\17"+
+    "\20\2\7\0\41\2\1\17\27\2\1\17\10\2\1\17"+
+    "\3\2\4\0\2\17\3\2\2\17\20\2\1\17\10\2"+
+    "\2\17\3\2\1\17\2\2\1\17\6\2\1\17\2\0"+
+    "\3\2\1\17\4\2\1\17\26\2\1\0\20\2\1\20"+
+    "\12\2\1\17";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[257];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\52\0\124\0\176\0\176\0\250\0\176\0\322"+
+    "\0\176\0\374\0\u0126\0\176\0\176\0\u0150\0\u0150\0\176"+
+    "\0\u017a\0\u01a4\0\u01ce\0\u01f8\0\u0222\0\u024c\0\u0276\0\u02a0"+
+    "\0\u02ca\0\u02f4\0\u031e\0\u0348\0\u0372\0\u0126\0\u039c\0\u03c6"+
+    "\0\u03f0\0\u041a\0\u0444\0\u046e\0\u0498\0\176\0\176\0\u04c2"+
+    "\0\176\0\176\0\u04ec\0\u0516\0\u0540\0\u056a\0\u0594\0\u05be"+
+    "\0\u05e8\0\u0612\0\u063c\0\u0666\0\u0690\0\u06ba\0\u06e4\0\u070e"+
+    "\0\u0738\0\u0762\0\u078c\0\u07b6\0\u07e0\0\u080a\0\u0834\0\u085e"+
+    "\0\u0888\0\u08b2\0\u08dc\0\u0906\0\u0930\0\u095a\0\u0984\0\u09ae"+
+    "\0\u09d8\0\u0a02\0\u0a2c\0\u0a56\0\u0a80\0\u0aaa\0\u0ad4\0\u0afe"+
+    "\0\u0b28\0\u0b52\0\u0b7c\0\u0ba6\0\u0bd0\0\u0bfa\0\u0c24\0\u0c4e"+
+    "\0\u0c78\0\u0ca2\0\u0ccc\0\u0cf6\0\u0d20\0\u0d4a\0\u0d74\0\u0d9e"+
+    "\0\u0dc8\0\u0df2\0\u0e1c\0\u0e46\0\u0e70\0\u0e9a\0\u0ec4\0\u0eee"+
+    "\0\u0f18\0\u0f42\0\u0f6c\0\u0f96\0\u0fc0\0\u0fea\0\u1014\0\u103e"+
+    "\0\u1068\0\u1092\0\u10bc\0\u10e6\0\u1110\0\u113a\0\u1164\0\u118e"+
+    "\0\u11b8\0\u11e2\0\u120c\0\u1236\0\u1260\0\u128a\0\u12b4\0\u12de"+
+    "\0\u1308\0\u1332\0\u135c\0\u1386\0\u13b0\0\u13da\0\u1404\0\u142e"+
+    "\0\u1458\0\u1482\0\u14ac\0\u14d6\0\u1500\0\u152a\0\u1554\0\u157e"+
+    "\0\u15a8\0\u15d2\0\u15fc\0\374\0\u1626\0\u1650\0\u167a\0\u16a4"+
+    "\0\u16ce\0\u16f8\0\u1722\0\u174c\0\u1776\0\u17a0\0\u17ca\0\u17f4"+
+    "\0\u181e\0\u1848\0\u1872\0\u189c\0\u18c6\0\u18f0\0\u191a\0\u1944"+
+    "\0\u196e\0\u1998\0\u19c2\0\u19ec\0\u1a16\0\u1a40\0\u1a6a\0\u16f8"+
+    "\0\u1a94\0\u1abe\0\u1ae8\0\u1b12\0\u1b3c\0\u1b66\0\u1b90\0\u1bba"+
+    "\0\u1be4\0\u1c0e\0\u1c38\0\u174c\0\u1c62\0\u1c8c\0\u1cb6\0\u1ce0"+
+    "\0\u1d0a\0\u1d34\0\u1d5e\0\u1d88\0\u1db2\0\u1ddc\0\u1e06\0\u1e30"+
+    "\0\u1e5a\0\u1e84\0\u1eae\0\u1ed8\0\u1f02\0\u1f2c\0\u1b12\0\u1f56"+
+    "\0\u1f80\0\u1faa\0\u1fd4\0\u1ffe\0\u2028\0\u2052\0\u207c\0\u20a6"+
+    "\0\u20d0\0\u20fa\0\u2124\0\u214e\0\u2178\0\u21a2\0\u21cc\0\u21f6"+
+    "\0\u2220\0\u224a\0\u2274\0\u229e\0\u22c8\0\u22f2\0\u231c\0\u2346"+
+    "\0\u2370\0\u239a\0\u23c4\0\u23ee\0\u2418\0\u2442\0\u246c\0\u2496"+
+    "\0\u24c0\0\u24ea\0\u2514\0\u253e\0\u2568\0\176\0\u2592\0\u25bc"+
+    "\0\u25e6\0\u2610\0\u263a\0\u2664\0\u268e\0\u26b8\0\u26e2\0\u270c"+
+    "\0\u13da";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[257];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13"+
+    "\1\14\1\15\1\16\1\17\1\20\1\17\1\21\1\22"+
+    "\1\23\1\24\1\25\1\12\1\26\1\27\1\30\1\31"+
+    "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
+    "\2\12\1\42\1\12\1\43\2\12\1\44\2\12\1\45"+
+    "\1\46\6\45\1\47\41\45\1\50\1\51\7\50\1\52"+
+    "\40\50\54\0\1\6\53\0\1\53\1\0\1\12\1\54"+
+    "\7\0\1\55\1\56\1\12\1\57\1\12\1\60\1\61"+
+    "\1\62\1\63\1\12\1\64\1\65\1\66\1\54\1\67"+
+    "\1\70\1\71\12\12\4\0\1\12\1\0\2\12\7\0"+
+    "\33\12\4\0\1\12\1\0\1\12\1\72\7\0\1\73"+
+    "\2\12\1\74\2\12\1\75\1\76\3\12\1\77\1\12"+
+    "\1\72\1\12\1\100\2\12\1\101\1\12\1\102\6\12"+
+    "\13\0\1\20\55\0\1\103\1\104\1\103\1\105\1\0"+
+    "\1\106\1\107\1\110\2\0\1\111\24\0\1\12\1\0"+
+    "\2\12\7\0\1\112\1\12\1\112\1\113\3\12\1\114"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\6\12\1\115"+
+    "\1\12\1\116\11\12\1\117\10\12\4\0\1\12\1\0"+
+    "\2\12\7\0\7\12\1\120\23\12\4\0\1\12\1\0"+
+    "\2\12\7\0\1\121\4\12\1\122\13\12\1\123\11\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\124\4\12"+
+    "\1\125\16\12\4\0\1\12\1\0\1\12\1\72\7\0"+
+    "\1\126\1\127\3\12\1\60\5\12\1\130\1\131\1\72"+
+    "\1\12\1\132\1\133\12\12\4\0\1\12\1\0\2\12"+
+    "\7\0\16\12\1\117\14\12\4\0\1\12\1\0\2\12"+
+    "\7\0\3\12\1\134\27\12\4\0\1\12\1\0\2\12"+
+    "\7\0\13\12\1\135\17\12\4\0\1\12\1\0\2\12"+
+    "\7\0\1\136\6\12\1\137\1\12\1\140\21\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\12\1\141\1\12\1\142"+
+    "\1\143\1\144\3\12\1\145\2\12\1\146\16\12\4\0"+
+    "\1\147\1\0\1\12\1\150\7\0\5\12\1\151\1\152"+
+    "\3\12\1\153\1\154\1\12\1\150\1\12\1\155\13\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\156\1\12"+
+    "\1\157\22\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\160\1\161\4\12\1\162\16\12\4\0\1\12\1\0"+
+    "\2\12\7\0\6\12\1\163\24\12\4\0\1\12\1\0"+
+    "\2\12\7\0\14\12\1\164\16\12\4\0\1\12\1\0"+
+    "\2\12\7\0\10\12\1\165\11\12\1\166\10\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\167\27\12\1\45"+
+    "\1\0\6\45\1\0\41\45\1\50\1\0\7\50\1\0"+
+    "\40\50\4\0\1\12\1\0\2\12\7\0\14\12\1\170"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\7\12\1\171"+
+    "\7\12\1\100\13\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\172\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\115\24\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\173\3\12\1\174\6\12\1\175\11\12\4\0"+
+    "\1\12\1\0\2\12\7\0\14\12\1\125\16\12\4\0"+
+    "\1\12\1\0\1\12\1\72\7\0\1\12\1\176\11\12"+
+    "\1\130\1\12\1\72\2\12\1\133\12\12\4\0\1\12"+
+    "\1\0\2\12\7\0\11\12\1\177\21\12\4\0\1\12"+
+    "\1\0\2\12\7\0\3\12\1\200\27\12\4\0\1\12"+
+    "\1\0\2\12\7\0\1\201\32\12\4\0\1\12\1\0"+
+    "\2\12\7\0\4\12\1\143\7\12\1\146\16\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\202\11\12\1\203"+
+    "\13\12\4\0\1\12\1\0\2\12\7\0\10\12\1\204"+
+    "\22\12\4\0\1\12\1\0\2\12\7\0\6\12\1\205"+
+    "\1\206\4\12\1\207\16\12\4\0\1\12\1\0\2\12"+
+    "\7\0\1\135\32\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\133\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\210\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\14\12\1\211\16\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\212\12\12\1\135\4\12\1\133\12\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\213\5\12\1\214\3\12"+
+    "\1\215\13\12\4\0\1\12\1\0\2\12\7\0\4\12"+
+    "\1\143\7\12\1\113\16\12\4\0\1\12\1\0\2\12"+
+    "\7\0\16\12\1\216\14\12\4\0\1\12\1\0\2\12"+
+    "\7\0\6\12\1\217\24\12\4\0\1\12\1\0\1\12"+
+    "\1\71\7\0\15\12\1\71\15\12\20\0\1\220\1\0"+
+    "\1\220\56\0\1\221\45\0\1\220\50\0\1\220\53\0"+
+    "\1\222\54\0\1\220\47\0\1\223\30\0\1\12\1\0"+
+    "\2\12\7\0\1\12\1\224\1\12\1\224\27\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\224\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\2\12\1\225\30\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\214\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\6\12\1\226\24\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\113\27\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\12\1\227\31\12\4\0"+
+    "\1\12\1\0\2\12\7\0\13\12\1\230\17\12\4\0"+
+    "\1\231\1\0\2\12\7\0\33\12\4\0\1\12\1\0"+
+    "\2\12\7\0\14\12\1\202\1\12\1\232\14\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\135\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\202\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\233\6\12\1\172\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\234\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\113\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\5\12\1\202\11\12"+
+    "\1\235\13\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\236\1\206\4\12\1\237\16\12\4\0\1\12\1\0"+
+    "\2\12\7\0\13\12\1\224\17\12\4\0\1\12\1\0"+
+    "\2\12\7\0\1\12\1\240\4\12\1\241\16\12\1\42"+
+    "\5\12\4\0\1\12\1\0\2\12\7\0\3\12\1\224"+
+    "\27\12\4\0\1\12\1\0\2\12\7\0\7\12\1\242"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\10\12\1\243"+
+    "\22\12\4\0\1\12\1\0\2\12\7\0\5\12\1\244"+
+    "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\175"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\1\245\32\12"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\202\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\2\12\1\212\30\12"+
+    "\4\0\1\12\1\0\2\12\7\0\20\12\1\246\12\12"+
+    "\4\0\1\12\1\0\2\12\7\0\2\12\1\113\2\12"+
+    "\1\214\25\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+    "\1\60\6\12\1\247\16\12\4\0\1\12\1\0\2\12"+
+    "\7\0\22\12\1\250\10\12\4\0\1\251\1\0\1\12"+
+    "\1\252\7\0\1\12\1\253\2\12\1\254\10\12\1\252"+
+    "\15\12\4\0\1\12\1\0\2\12\7\0\20\12\1\133"+
+    "\12\12\4\0\1\12\1\0\2\12\7\0\14\12\1\255"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\14\12\1\256"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\6\12\1\257"+
+    "\7\12\1\260\14\12\4\0\1\12\1\0\2\12\7\0"+
+    "\10\12\1\261\1\32\21\12\4\0\1\12\1\0\2\12"+
+    "\7\0\3\12\1\262\3\12\1\263\4\12\1\125\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\21\12\1\264\11\12"+
+    "\4\0\1\265\1\0\2\12\7\0\33\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\264\25\12\4\0\1\12"+
+    "\1\0\1\12\1\266\7\0\15\12\1\266\15\12\4\0"+
+    "\1\12\1\0\2\12\7\0\5\12\1\206\25\12\4\0"+
+    "\1\12\1\0\2\12\7\0\14\12\1\267\16\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\270\10\12\1\71"+
+    "\16\12\4\0\1\12\1\0\2\12\7\0\21\12\1\202"+
+    "\11\12\4\0\1\12\1\0\2\12\7\0\17\12\1\224"+
+    "\13\12\4\0\1\12\1\0\2\12\7\0\13\12\1\214"+
+    "\17\12\4\0\1\12\1\0\2\12\7\0\2\12\1\271"+
+    "\30\12\4\0\1\12\1\0\2\12\7\0\1\272\32\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\273\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\16\12\1\224\14\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\274\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\20\12\1\71\12\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\212\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\275\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\12\1\224\31\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\276\27\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\206\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\21\12\1\277\11\12"+
+    "\4\0\1\224\1\0\2\12\7\0\33\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\277\25\12\4\0\1\12"+
+    "\1\0\2\12\7\0\2\12\1\224\10\12\1\135\17\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\300\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\224\32\12\4\0\1\12"+
+    "\1\0\2\12\7\0\1\12\1\301\25\12\1\257\3\12"+
+    "\4\0\1\12\1\0\2\12\7\0\22\12\1\224\10\12"+
+    "\4\0\1\12\1\0\2\12\7\0\16\12\1\302\14\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\255\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\10\12\1\303\22\12\16\0"+
+    "\1\20\63\0\1\304\25\0\1\220\64\0\1\305\36\0"+
+    "\1\12\1\0\2\12\7\0\14\12\1\306\14\12\1\307"+
+    "\1\12\4\0\1\12\1\0\2\12\7\0\5\12\1\310"+
+    "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\224"+
+    "\23\12\4\0\1\12\1\0\2\12\7\0\3\12\1\311"+
+    "\27\12\4\0\1\227\1\0\2\12\7\0\12\12\1\312"+
+    "\1\12\1\313\16\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\314\32\12\4\0\1\12\1\0\2\12\7\0\7\12"+
+    "\1\315\23\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+    "\1\316\25\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\257\24\12\4\0\1\12\1\0\2\12\7\0\21\12"+
+    "\1\317\11\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+    "\1\317\25\12\4\0\1\12\1\0\2\12\7\0\11\12"+
+    "\1\320\21\12\4\0\1\224\1\0\2\12\7\0\1\224"+
+    "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\202"+
+    "\1\321\23\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\322\10\12\1\275\13\12\4\0\1\12\1\0\1\12"+
+    "\1\323\7\0\15\12\1\323\15\12\4\0\1\12\1\0"+
+    "\2\12\7\0\3\12\1\324\27\12\4\0\1\12\1\0"+
+    "\2\12\7\0\10\12\1\325\22\12\4\0\1\12\1\0"+
+    "\2\12\7\0\5\12\1\202\11\12\1\224\13\12\4\0"+
+    "\1\12\1\0\2\12\7\0\6\12\1\321\24\12\4\0"+
+    "\1\12\1\0\2\12\7\0\3\12\1\255\27\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\326\32\12\4\0\1\12"+
+    "\1\0\2\12\7\0\3\12\1\327\27\12\4\0\1\12"+
+    "\1\0\2\12\7\0\11\12\1\330\21\12\4\0\1\12"+
+    "\1\0\2\12\7\0\21\12\1\224\11\12\4\0\1\12"+
+    "\1\0\2\12\7\0\2\12\1\113\30\12\4\0\1\12"+
+    "\1\0\2\12\7\0\2\12\1\224\30\12\4\0\1\12"+
+    "\1\0\2\12\7\0\6\12\1\331\24\12\4\0\1\12"+
+    "\1\0\1\12\1\332\7\0\15\12\1\332\15\12\4\0"+
+    "\1\12\1\0\2\12\7\0\2\12\1\333\30\12\4\0"+
+    "\1\12\1\0\2\12\7\0\26\12\1\224\2\12\1\224"+
+    "\1\12\4\0\1\12\1\0\2\12\7\0\11\12\1\334"+
+    "\21\12\4\0\1\12\1\0\2\12\7\0\23\12\1\335"+
+    "\7\12\4\0\1\12\1\0\2\12\7\0\1\12\1\135"+
+    "\31\12\4\0\1\12\1\0\2\12\7\0\10\12\1\135"+
+    "\22\12\4\0\1\12\1\0\2\12\7\0\31\12\1\307"+
+    "\1\12\4\0\1\12\1\0\2\12\7\0\1\336\32\12"+
+    "\4\0\1\12\1\0\2\12\7\0\11\12\1\337\21\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\202\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\5\12\1\340\25\12"+
+    "\4\0\1\12\1\0\2\12\7\0\31\12\1\224\1\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\341\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\342\5\12"+
+    "\1\343\16\12\4\0\1\12\1\0\2\12\7\0\1\251"+
+    "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\344"+
+    "\24\12\22\0\1\345\61\0\1\304\23\0\1\12\1\0"+
+    "\1\12\1\200\7\0\15\12\1\200\15\12\4\0\1\12"+
+    "\1\0\2\12\7\0\26\12\1\224\4\12\4\0\1\12"+
+    "\1\0\2\12\7\0\13\12\1\346\17\12\4\0\1\12"+
+    "\1\0\2\12\7\0\14\12\1\313\10\12\1\347\5\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\71\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\12\12\1\224\20\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\350\16\12"+
+    "\4\0\1\12\1\0\1\12\1\351\7\0\15\12\1\351"+
+    "\15\12\4\0\1\12\1\0\2\12\7\0\32\12\1\224"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\113\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\224\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\212\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\12\1\352\31\12\4\0"+
+    "\1\12\1\0\1\12\1\202\7\0\15\12\1\202\15\12"+
+    "\4\0\1\12\1\0\2\12\7\0\7\12\1\353\23\12"+
+    "\4\0\1\12\1\0\2\12\7\0\11\12\1\354\21\12"+
+    "\4\0\1\12\1\0\2\12\7\0\2\12\1\355\30\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\270\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\17\12\1\356\13\12"+
+    "\4\0\1\12\1\0\2\12\7\0\14\12\1\340\16\12"+
+    "\4\0\1\12\1\0\2\12\7\0\10\12\1\357\22\12"+
+    "\4\0\1\12\1\0\2\12\7\0\1\360\32\12\4\0"+
+    "\1\12\1\0\2\12\7\0\13\12\1\361\17\12\4\0"+
+    "\1\12\1\0\2\12\7\0\7\12\1\362\23\12\4\0"+
+    "\1\12\1\0\2\12\7\0\1\202\32\12\4\0\1\12"+
+    "\1\0\2\12\7\0\13\12\1\352\17\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\257\25\12\4\0\1\12"+
+    "\1\0\2\12\7\0\14\12\1\363\16\12\4\0\1\12"+
+    "\1\0\2\12\7\0\5\12\1\364\25\12\4\0\1\12"+
+    "\1\0\1\12\1\365\7\0\15\12\1\365\15\12\16\0"+
+    "\1\366\37\0\1\12\1\0\2\12\7\0\12\12\1\355"+
+    "\20\12\4\0\1\12\1\0\2\12\7\0\22\12\1\367"+
+    "\10\12\4\0\1\12\1\0\1\12\1\370\7\0\15\12"+
+    "\1\370\15\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+    "\1\371\24\12\4\0\1\12\1\0\2\12\7\0\14\12"+
+    "\1\372\16\12\4\0\1\12\1\0\2\12\7\0\11\12"+
+    "\1\373\21\12\4\0\1\135\1\0\2\12\7\0\33\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\321\27\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\365\27\12"+
+    "\4\0\1\12\1\0\2\12\7\0\6\12\1\170\24\12"+
+    "\4\0\1\12\1\0\2\12\7\0\3\12\1\224\3\12"+
+    "\1\224\23\12\4\0\1\12\1\0\2\12\7\0\16\12"+
+    "\1\374\14\12\4\0\1\12\1\0\1\12\1\375\7\0"+
+    "\15\12\1\375\15\12\4\0\1\12\1\0\2\12\7\0"+
+    "\5\12\1\133\25\12\4\0\1\12\1\0\2\12\7\0"+
+    "\11\12\1\135\21\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\12\1\355\31\12\4\0\1\12\1\0\2\12\7\0"+
+    "\3\12\1\270\27\12\4\0\1\12\1\0\2\12\7\0"+
+    "\14\12\1\202\16\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\12\1\376\31\12\4\0\1\12\1\0\2\12\7\0"+
+    "\7\12\1\113\23\12\4\0\1\12\1\0\2\12\7\0"+
+    "\1\12\1\377\31\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\u0100\24\12\4\0\1\12\1\0\2\12\7\0"+
+    "\6\12\1\267\24\12\4\0\1\12\1\0\2\12\7\0"+
+    "\3\12\1\u0101\2\12\1\177\24\12\4\0\1\12\1\0"+
+    "\2\12\7\0\14\12\1\124\16\12\4\0\1\12\1\0"+
+    "\1\12\1\135\7\0\15\12\1\135\15\12";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[10038];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\1\0\2\1\2\11\1\1\1\11\1\1\1\11\2\1"+
+    "\2\11\2\1\1\11\25\1\2\11\1\1\2\11\30\1"+
+    "\7\0\106\1\4\0\60\1\2\0\37\1\1\0\20\1"+
+    "\1\11\13\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[257];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  We must have this here as there is no default,
+	 * no-parameter constructor generated by JFlex.
+	 */
+	public FortranTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "!", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public FortranTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public FortranTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 168) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 15: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 17: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 18: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 19: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 20: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 21: break;
+        case 10: 
+          { addToken(Token.OPERATOR);
+          }
+        case 22: break;
+        case 5: 
+          { // Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+          }
+        case 23: break;
+        case 16: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 24: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 25: break;
+        case 7: 
+          { addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 26: break;
+        case 6: 
+          { // Since we change zzStartRead, we have the unfortunate
+							// side-effect of not being able to use the '^' operator.
+							// So we must check whether we're really at the beginning
+							// of the line ourselves...
+							if (zzStartRead==s.offset) {
+								addToken(zzStartRead,zzEndRead, Token.COMMENT_DOCUMENTATION);
+								addNullToken();
+								return firstToken;
+							}
+							else {
+								addToken(Token.IDENTIFIER);
+							}
+          }
+        case 27: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(CHAR);
+          }
+        case 28: break;
+        case 14: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 29: break;
+        case 12: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 30: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 31: break;
+        case 1: 
+          { 
+          }
+        case 32: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 258: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 259: break;
+            case CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 260: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex	(revision 25584)
@@ -0,0 +1,676 @@
+/*
+ * 09/28/2007
+ *
+ * GroovyTokenMaker.java - Scanner for the Groovy programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Groovy programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated GroovyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class GroovyTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public GroovyTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = MULTILINE_STRING_DOUBLE;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = MULTILINE_STRING_SINGLE;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='['
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= [A-Za-z]
+LetterOrUnderscore				= ({Letter}|"_")
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+AnyCharacterButApostropheOrBackSlash	= ([^\\'])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape							= ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+CharLiteral				= ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
+UnclosedCharLiteral			= ([\'][^\'\n]*)
+ErrorCharLiteral			= ({UnclosedCharLiteral}[\'])
+
+MLCBegin					= "/*"
+MLCEnd					= "*/"
+DocCommentBegin			= "/**"
+LineCommentBegin			= "//"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral				= ("true"|"false")
+Regex						= ([~]?"/"([^\*\\/]|\\.)([^/\\]|\\.)*"/")
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+GroovyOperator				= ("=~")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator}|{GroovyOperator})
+
+CurrentBlockTag				= ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+ProposedBlockTag			= ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
+BlockTag					= ({CurrentBlockTag}|{ProposedBlockTag})
+InlineTag					= ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+// Variables in strings
+VariableStart				= ([\$])
+BracedVariable				= ({VariableStart}\{[^\}]+\})
+UnbracedVariable			= ({VariableStart}{Identifier})
+Variable					= ({BracedVariable}|{UnbracedVariable})
+
+Annotation				= ("@"{Identifier}?)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state MLC
+%state DOCCOMMENT
+%state MULTILINE_STRING_DOUBLE
+%state MULTILINE_STRING_SINGLE
+%state STRING_DOUBLE
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"continue" |
+	"default" |
+	"do" |
+	"else" |
+	"extends" |
+	"final" |
+	"finally" |
+	"for" |
+	"if" |
+	"it" |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"native" |
+	"new" |
+	"null" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"return" |
+	"static" |
+	"strictfp" |
+	"super" |
+	"switch" |
+	"synchronized" |
+	"this" |
+	"throw" |
+	"throws" |
+	"transient" |
+	"try" |
+	"void" |
+	"volatile" |
+	"while"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Groovy keywords */
+	"as" |
+	"assert" |
+	"def" |
+	"mixin" |
+	"property" |
+	"test" |
+	"using" |
+	"in"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Data types. */
+	"boolean" |
+	"byte" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"short"					{ addToken(Token.DATA_TYPE); }
+
+	/* Booleans. */
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	/* java.lang stuff */
+	"Appendable" |
+	"CharSequence" |
+	"Cloneable" |
+	"Comparable" |
+	"Iterable" |
+	"Readable" |
+	"Runnable" |
+	"Boolean" |
+	"Byte" |
+	"Character" |
+	"Character.Subset" |
+	"Character.UnicodeBlock" |
+	"Class" |
+	"ClassLoader" |
+	"Compiler" |
+	"Double" |
+	"Enum" |
+	"Float" |
+	"InheritableThreadLocal" |
+	"Integer" |
+	"Long" |
+	"Math" |
+	"Number" |
+	"Object" |
+	"Package" |
+	"Process" |
+	"ProcessBuilder" |
+	"Runtime" |
+	"RuntimePermission" |
+	"SecurityManager" |
+	"Short" |
+	"StackTraceElement" |
+	"StrictMath" |
+	"String" |
+	"StringBuffer" |
+	"StringBuilder" |
+	"System" |
+	"Thread" |
+	"ThreadGroup" |
+	"ThreadLocal" |
+	"Throwable" |
+	"Void" |
+	"Thread.State" |
+	"ArithmeticException" |
+	"ArrayIndexOutOfBoundsException" |
+	"ArrayStoreException" |
+	"ClassCastException" |
+	"ClassNotFoundException" |
+	"CloneNotSupportedException" |
+	"EnumConstantNotPresentException" |
+	"Exception" |
+	"IllegalAccessException" |
+	"IllegalArgumentException" |
+	"IllegalMonitorStateException" |
+	"IllegalStateException" |
+	"IllegalThreadStateException" |
+	"IndexOutOfBoundsException" |
+	"InstantiationException" |
+	"InterruptedException" |
+	"NegativeArraySizeException" |
+	"NoSuchFieldException" |
+	"NoSuchMethodException" |
+	"NullPointerException" |
+	"NumberFormatException" |
+	"RuntimeException" |
+	"SecurityException" |
+	"StringIndexOutOfBoundsException" |
+	"TypeNotPresentException" |
+	"UnsupportedOperationException" |
+	"AbstractMethodError" |
+	"AssertionError" |
+	"ClassCircularityError" |
+	"ClassFormatError" |
+	"Error" |
+	"ExceptionInInitializerError" |
+	"IllegalAccessError" |
+	"IncompatibleClassChangeError" |
+	"InstantiationError" |
+	"InternalError" |
+	"LinkageError" |
+	"NoClassDefFoundError" |
+	"NoSuchFieldError" |
+	"NoSuchMethodError" |
+	"OutOfMemoryError" |
+	"StackOverflowError" |
+	"ThreadDeath" |
+	"UnknownError" |
+	"UnsatisfiedLinkError" |
+	"UnsupportedClassVersionError" |
+	"VerifyError" |
+	"VirtualMachineError" 			{ addToken(Token.FUNCTION); }
+
+	/* Commonly used methods added to Object class */
+	"addShutdownHook" |
+	"any" |
+	"asBoolean" |
+	"asType" |
+	"collect" |
+	"dump" |
+	"each" |
+	"eachWithIndex" |
+	"every" |
+	"find" |
+	"findAll" |
+	"findIndexOf" |
+	"findIndexValues" |
+	"findLastIndexOf" |
+	"getAt" |
+	"getMetaClass" |
+	"getMetaPropertyValues" |
+	"getProperties" |
+	"grep" |
+	"hasProperty" |
+	"identity" |
+	"inject" |
+	"inspect" |
+	"invokeMethod" |
+	"is" |
+	"isCase" |
+	"iterator" |
+	"metaClass" |
+	"print" |
+	"printf" |
+	"println" |
+	"putAt" |
+	"respondsTo" |
+	"setMetaClass" |
+	"sleep" |
+	"split" |
+	"sprintf" |
+	"toString" |
+	"use" |
+	"with" 			{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* Multiline string literals. */
+	\"\"\"						{ start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE); }
+	\'\'\'						{ start = zzMarkedPos-3; yybegin(MULTILINE_STRING_SINGLE); }
+
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	\"								{ start = zzMarkedPos-1; yybegin(STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{DocCommentBegin}				{ start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Regular expressions. */
+	{Regex}	{
+				boolean highlightedAsRegex = false;
+				if (zzBuffer[zzStartRead]=='~' || firstToken==null) {
+					addToken(Token.REGEX);
+					highlightedAsRegex = true;
+				}
+				else {
+					// If this is *likely* to be a regex, based on
+					// the previous token, highlight it as such.
+					Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+					if (regexCanFollow(t)) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+				}
+				// If it doesn't *appear* to be a regex, highlight it as
+				// individual tokens.
+				if (!highlightedAsRegex) {
+					int temp = zzStartRead + 1;
+					addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+					zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+				}
+			}
+
+	/* Annotations. */
+	{Annotation}					{ addToken(Token.ANNOTATION); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCCOMMENT> {
+
+	[^hwf\@\{\n\<\*]+			{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+
+	"@"{BlockTag}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	"@"							{}
+	"{@"{InlineTag}[^\}]*"}"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	"{"							{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+	"<"[/]?({Letter}[^\>]*)?">"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
+	\<							{}
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+	\*							{}
+	<<EOF>>						{ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
+
+
+<MULTILINE_STRING_DOUBLE> {
+	[^\"\\\$\n]*				{}
+	\\.?						{ /* Skip escaped chars, handles case: '\"""'. */ }
+	\"\"\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{Variable}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}			{}
+	\"						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<MULTILINE_STRING_SINGLE> {
+	[^\'\\\n]*				{}
+	\\.?						{ /* Skip escaped chars, handles case: "\'''". */ }
+	\'\'\'					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_CHAR); }
+	\'						{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+<STRING_DOUBLE> {
+	[^\n\\\$\"]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken; }
+}
+
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java	(revision 25584)
@@ -0,0 +1,3379 @@
+/* The following code was generated by JFlex 1.4.1 on 3/11/12 12:25 AM */
+
+/*
+ * 09/28/2007
+ *
+ * GroovyTokenMaker.java - Scanner for the Groovy programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Groovy programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated GroovyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class GroovyTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int MULTILINE_STRING_DOUBLE = 3;
+  public static final int DOCCOMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+  public static final int STRING_DOUBLE = 5;
+  public static final int MULTILINE_STRING_SINGLE = 4;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\21\1\20\1\0\1\21\1\15\22\0\1\21\1\51\1\12"+
+    "\1\16\1\17\1\51\1\53\1\7\2\42\1\23\1\44\1\43\1\31"+
+    "\1\32\1\22\1\4\3\6\4\6\2\3\1\54\1\43\1\45\1\46"+
+    "\1\50\1\52\1\76\1\100\1\5\1\101\1\65\1\30\1\26\1\114"+
+    "\1\116\1\104\2\1\1\25\1\107\1\110\1\111\1\113\1\1\1\72"+
+    "\1\102\1\106\1\105\1\115\1\117\1\24\2\1\1\42\1\11\1\42"+
+    "\1\47\1\2\1\0\1\36\1\14\1\61\1\57\1\35\1\27\1\70"+
+    "\1\55\1\63\1\112\1\73\1\37\1\64\1\13\1\56\1\60\1\103"+
+    "\1\34\1\40\1\33\1\10\1\67\1\66\1\62\1\71\1\77\1\74"+
+    "\1\47\1\75\1\41\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\3\0\2\1\1\0\1\2\1\3\2\4\1\3\1\5"+
+    "\1\3\1\6\2\3\1\2\1\7\1\10\2\11\4\3"+
+    "\1\11\7\3\1\11\1\12\1\3\6\11\13\3\1\13"+
+    "\13\3\1\1\1\14\5\1\1\15\10\1\1\16\2\1"+
+    "\1\17\2\1\1\20\1\21\1\22\1\23\1\24\1\2"+
+    "\1\25\1\4\1\26\1\25\1\26\1\25\1\27\1\25"+
+    "\2\3\1\5\1\30\1\5\1\0\1\3\1\0\6\3"+
+    "\2\0\1\31\1\32\1\11\25\3\1\33\12\3\2\0"+
+    "\1\11\3\3\1\33\7\3\3\33\1\34\14\3\1\13"+
+    "\33\3\1\35\4\0\1\36\4\0\1\37\16\0\1\16"+
+    "\1\0\1\40\2\0\1\20\1\22\1\2\1\26\1\0"+
+    "\2\27\2\3\1\30\1\41\1\5\1\42\1\5\1\0"+
+    "\1\34\1\3\1\43\5\3\1\44\1\45\46\3\1\33"+
+    "\13\3\1\46\21\3\1\2\44\3\33\0\1\47\2\0"+
+    "\1\50\1\2\1\3\1\42\1\5\1\0\4\3\1\51"+
+    "\4\3\2\34\2\3\1\52\5\3\1\34\43\3\1\2"+
+    "\43\3\2\0\1\53\2\0\1\54\15\0\1\55\11\0"+
+    "\1\40\1\2\1\3\1\5\1\0\2\3\1\33\6\3"+
+    "\1\33\16\3\1\34\14\3\1\2\4\3\1\34\37\3"+
+    "\34\0\1\2\1\3\1\5\1\0\34\3\1\2\14\3"+
+    "\1\34\16\3\1\34\2\3\1\34\7\3\24\0\22\3"+
+    "\1\34\1\2\33\3\1\0\12\3\1\34\2\3\5\0"+
+    "\1\55\4\0\54\3\1\0\13\3\11\0\3\3\1\34"+
+    "\22\3\1\34\23\3\1\0\13\3\5\0\20\3\1\0"+
+    "\20\3\1\0\10\3\5\0\16\3\2\0\15\3\1\0"+
+    "\5\3\2\0\13\3\2\0\15\3\1\34\16\3\2\0"+
+    "\20\3\2\0\12\3\2\0\10\3\1\0\5\3\1\0"+
+    "\5\3\1\0\4\3\1\0\4\3\1\0\2\3\1\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1110];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\120\0\240\0\360\0\u0140\0\u0190\0\u01e0\0\u0230"+
+    "\0\u0280\0\u02d0\0\u0320\0\u0370\0\u03c0\0\u0410\0\u0460\0\u04b0"+
+    "\0\u0500\0\u0500\0\u0550\0\u05a0\0\u05f0\0\u0640\0\u0690\0\u06e0"+
+    "\0\u0730\0\u0780\0\u07d0\0\u0820\0\u0870\0\u08c0\0\u0910\0\u0960"+
+    "\0\u09b0\0\u0a00\0\u0500\0\u0500\0\u0a50\0\u0aa0\0\u0af0\0\u0b40"+
+    "\0\u0500\0\u0b90\0\u0be0\0\u0c30\0\u0c80\0\u0cd0\0\u0d20\0\u0d70"+
+    "\0\u0dc0\0\u0e10\0\u0e60\0\u0eb0\0\u0f00\0\u0f50\0\u0fa0\0\u0ff0"+
+    "\0\u1040\0\u1090\0\u10e0\0\u1130\0\u1180\0\u11d0\0\u1220\0\u1270"+
+    "\0\u12c0\0\u1310\0\u0500\0\u1360\0\u13b0\0\u1400\0\u1450\0\u14a0"+
+    "\0\u0500\0\u14f0\0\u1540\0\u1590\0\u15e0\0\u1630\0\u1680\0\u16d0"+
+    "\0\u1720\0\u1770\0\u17c0\0\u1810\0\u0500\0\u1860\0\u18b0\0\u1900"+
+    "\0\u0500\0\u1950\0\u0500\0\u0500\0\u19a0\0\u19f0\0\u19f0\0\u19f0"+
+    "\0\u1a40\0\u1a90\0\u1ae0\0\u1b30\0\u1b80\0\u1bd0\0\u1c20\0\u1c70"+
+    "\0\u1cc0\0\u1d10\0\u1d60\0\u1db0\0\u1e00\0\u1e50\0\u1ea0\0\u1ef0"+
+    "\0\u1f40\0\u1f90\0\u1fe0\0\u2030\0\u2080\0\u20d0\0\u2120\0\u2030"+
+    "\0\u2170\0\u21c0\0\u2210\0\u2260\0\u22b0\0\u2300\0\u2350\0\u23a0"+
+    "\0\u23f0\0\u2440\0\u2490\0\u24e0\0\u2530\0\u2580\0\u25d0\0\u2620"+
+    "\0\u2670\0\u26c0\0\u2710\0\u2760\0\u27b0\0\u2800\0\u2850\0\u28a0"+
+    "\0\u28f0\0\u2940\0\u2990\0\u29e0\0\u2a30\0\u2a80\0\u2ad0\0\u2b20"+
+    "\0\u2b70\0\u05f0\0\u2bc0\0\u2c10\0\u2c60\0\u2cb0\0\u2d00\0\u2d50"+
+    "\0\u2da0\0\u2df0\0\u2e40\0\u2e90\0\u2ee0\0\u2f30\0\u2f80\0\u0230"+
+    "\0\u2fd0\0\u3020\0\u3070\0\u30c0\0\u3110\0\u3160\0\u31b0\0\u3200"+
+    "\0\u3250\0\u32a0\0\u32f0\0\u3340\0\u3390\0\u33e0\0\u3430\0\u3480"+
+    "\0\u34d0\0\u3520\0\u3570\0\u35c0\0\u3610\0\u3660\0\u36b0\0\u3700"+
+    "\0\u3750\0\u37a0\0\u37f0\0\u3840\0\u3890\0\u38e0\0\u3930\0\u3980"+
+    "\0\u39d0\0\u3a20\0\u3a70\0\u3ac0\0\u3b10\0\u3b60\0\u3bb0\0\u3c00"+
+    "\0\u3c50\0\u3ca0\0\u0500\0\u3cf0\0\u3d40\0\u3d90\0\u3de0\0\u0500"+
+    "\0\u3e30\0\u3e80\0\u3ed0\0\u3f20\0\u0500\0\u3f70\0\u3fc0\0\u4010"+
+    "\0\u4060\0\u40b0\0\u4100\0\u4150\0\u41a0\0\u41f0\0\u4240\0\u4290"+
+    "\0\u42e0\0\u4330\0\u4380\0\u0500\0\u43d0\0\u4420\0\u4470\0\u44c0"+
+    "\0\u0500\0\u0500\0\u4510\0\u4560\0\u45b0\0\u19f0\0\u4600\0\u4650"+
+    "\0\u46a0\0\u0500\0\u0500\0\u46f0\0\u1d60\0\u4740\0\u4790\0\u0230"+
+    "\0\u47e0\0\u0500\0\u4830\0\u4880\0\u48d0\0\u4920\0\u4970\0\u0500"+
+    "\0\u49c0\0\u4a10\0\u4a60\0\u4ab0\0\u4b00\0\u4b50\0\u4ba0\0\u4bf0"+
+    "\0\u4c40\0\u4c90\0\u4ce0\0\u4d30\0\u4d80\0\u4dd0\0\u4e20\0\u4e70"+
+    "\0\u4ec0\0\u4f10\0\u4f60\0\u4fb0\0\u5000\0\u5050\0\u50a0\0\u50f0"+
+    "\0\u5140\0\u5190\0\u51e0\0\u5230\0\u5280\0\u52d0\0\u5320\0\u5370"+
+    "\0\u53c0\0\u5410\0\u5460\0\u54b0\0\u5500\0\u5550\0\u55a0\0\u55f0"+
+    "\0\u5640\0\u5690\0\u56e0\0\u5730\0\u5780\0\u57d0\0\u5820\0\u5870"+
+    "\0\u58c0\0\u5910\0\u5960\0\u0230\0\u59b0\0\u5a00\0\u5a50\0\u5aa0"+
+    "\0\u5af0\0\u5b40\0\u5b90\0\u5be0\0\u5c30\0\u5c80\0\u5cd0\0\u5d20"+
+    "\0\u5d70\0\u5dc0\0\u5e10\0\u5e60\0\u5eb0\0\u5f00\0\u5f50\0\u5fa0"+
+    "\0\u5ff0\0\u6040\0\u6090\0\u60e0\0\u6130\0\u6180\0\u61d0\0\u6220"+
+    "\0\u6270\0\u62c0\0\u6310\0\u6360\0\u63b0\0\u6400\0\u6450\0\u64a0"+
+    "\0\u64f0\0\u6540\0\u6590\0\u65e0\0\u6630\0\u6680\0\u66d0\0\u6720"+
+    "\0\u6770\0\u67c0\0\u6810\0\u6860\0\u68b0\0\u6900\0\u6950\0\u69a0"+
+    "\0\u69f0\0\u6a40\0\u6a90\0\u6ae0\0\u6b30\0\u6b80\0\u6bd0\0\u6c20"+
+    "\0\u6c70\0\u6cc0\0\u6d10\0\u6d60\0\u6db0\0\u6e00\0\u6e50\0\u6ea0"+
+    "\0\u6ef0\0\u6f40\0\u6f90\0\u6fe0\0\u7030\0\u7080\0\u70d0\0\u7120"+
+    "\0\u7170\0\u71c0\0\u7210\0\u7260\0\u72b0\0\u0500\0\u7300\0\u7350"+
+    "\0\u0500\0\u73a0\0\u73f0\0\u0500\0\u7440\0\u7490\0\u74e0\0\u7530"+
+    "\0\u7580\0\u75d0\0\u0500\0\u7620\0\u7670\0\u76c0\0\u7710\0\u7760"+
+    "\0\u77b0\0\u7800\0\u7850\0\u0230\0\u78a0\0\u78f0\0\u7940\0\u7990"+
+    "\0\u79e0\0\u7a30\0\u7a80\0\u7ad0\0\u7b20\0\u7b70\0\u7bc0\0\u7c10"+
+    "\0\u7c60\0\u7cb0\0\u7d00\0\u7d50\0\u7da0\0\u7df0\0\u7e40\0\u7e90"+
+    "\0\u7ee0\0\u7f30\0\u7f80\0\u7fd0\0\u8020\0\u8070\0\u80c0\0\u8110"+
+    "\0\u8160\0\u81b0\0\u8200\0\u8250\0\u82a0\0\u82f0\0\u8340\0\u8390"+
+    "\0\u83e0\0\u8430\0\u8480\0\u84d0\0\u8520\0\u8570\0\u85c0\0\u8610"+
+    "\0\u8660\0\u86b0\0\u8700\0\u8750\0\u87a0\0\u87f0\0\u8840\0\u8890"+
+    "\0\u88e0\0\u8930\0\u8980\0\u89d0\0\u8a20\0\u8a70\0\u8ac0\0\u8b10"+
+    "\0\u8b60\0\u8bb0\0\u8c00\0\u8c50\0\u8ca0\0\u8cf0\0\u8d40\0\u8d90"+
+    "\0\u8de0\0\u8e30\0\u8e80\0\u8ed0\0\u8f20\0\u8f70\0\u8fc0\0\u9010"+
+    "\0\u9060\0\u90b0\0\u9100\0\u9150\0\u91a0\0\u91f0\0\u9240\0\u9290"+
+    "\0\u92e0\0\u9330\0\u9380\0\u93d0\0\u9420\0\u9470\0\u94c0\0\u9510"+
+    "\0\u9560\0\u95b0\0\u9600\0\u9650\0\u0500\0\u96a0\0\u96f0\0\u9740"+
+    "\0\u9790\0\u97e0\0\u9830\0\u9880\0\u98d0\0\u9920\0\u0500\0\u9970"+
+    "\0\u99c0\0\u9a10\0\u9a60\0\u9ab0\0\u9b00\0\u9b50\0\u9ba0\0\u9bf0"+
+    "\0\u9c40\0\u9c90\0\u9ce0\0\u9d30\0\u4e20\0\u9d80\0\u9dd0\0\u9e20"+
+    "\0\u9e70\0\u9ec0\0\u9f10\0\u9f60\0\u9fb0\0\ua000\0\ua050\0\ua0a0"+
+    "\0\ua0f0\0\ua140\0\ua190\0\ua1e0\0\ua230\0\ua280\0\ua2d0\0\ua320"+
+    "\0\ua370\0\ua3c0\0\ua410\0\ua460\0\ua4b0\0\ua500\0\ua550\0\ua5a0"+
+    "\0\ua5f0\0\ua640\0\ua690\0\ua6e0\0\ua730\0\ua780\0\ua7d0\0\ua820"+
+    "\0\ua870\0\ua8c0\0\ua910\0\ua960\0\ua9b0\0\uaa00\0\uaa50\0\uaaa0"+
+    "\0\uaaf0\0\uab40\0\uab90\0\uabe0\0\uac30\0\uac80\0\uacd0\0\uad20"+
+    "\0\uad70\0\uadc0\0\uae10\0\uae60\0\uaeb0\0\uaf00\0\uaf50\0\uafa0"+
+    "\0\uaff0\0\ub040\0\ub090\0\ub0e0\0\ub130\0\ub180\0\u9150\0\ub1d0"+
+    "\0\u9240\0\ub220\0\ub270\0\ub2c0\0\ub310\0\ub360\0\ub3b0\0\ub400"+
+    "\0\ub450\0\ub4a0\0\ub4f0\0\ub540\0\ub590\0\ub5e0\0\ub630\0\ub680"+
+    "\0\ub6d0\0\ub720\0\ub770\0\ub7c0\0\ub810\0\ub860\0\ub8b0\0\ub900"+
+    "\0\ub950\0\ub9a0\0\ub9f0\0\uba40\0\uba90\0\ubae0\0\ubb30\0\ubb80"+
+    "\0\ubbd0\0\ubc20\0\ubc70\0\ubcc0\0\ubd10\0\ubd60\0\ubdb0\0\ube00"+
+    "\0\ube50\0\ubea0\0\ubef0\0\ubf40\0\ubf90\0\ubfe0\0\uc030\0\uc080"+
+    "\0\uc0d0\0\uc120\0\uc170\0\uc1c0\0\uc210\0\uc260\0\uc2b0\0\uc300"+
+    "\0\uc350\0\uc3a0\0\uc3f0\0\uc440\0\uc490\0\uc4e0\0\uc530\0\uc580"+
+    "\0\uc5d0\0\uc620\0\uc670\0\uc6c0\0\uc710\0\uc760\0\uc7b0\0\uc800"+
+    "\0\uc850\0\uc8a0\0\uc8f0\0\uc940\0\uc990\0\uc9e0\0\uca30\0\uca80"+
+    "\0\ucad0\0\ucb20\0\ucb70\0\ucbc0\0\ucc10\0\ucc60\0\uccb0\0\ucd00"+
+    "\0\ucd50\0\ucda0\0\ucdf0\0\uce40\0\uce90\0\ucee0\0\ucf30\0\ucf80"+
+    "\0\ucfd0\0\ud020\0\ud070\0\ud0c0\0\ud110\0\ud160\0\ud1b0\0\ud200"+
+    "\0\ud250\0\ud2a0\0\ud2f0\0\ud340\0\ud390\0\ud3e0\0\ud430\0\ud480"+
+    "\0\ud4d0\0\ud520\0\ud570\0\ud5c0\0\ud610\0\ud660\0\ud6b0\0\ud700"+
+    "\0\ud750\0\ud7a0\0\ud7f0\0\ud840\0\ud890\0\ud8e0\0\ud930\0\ud980"+
+    "\0\ud9d0\0\uda20\0\uda70\0\udac0\0\udb10\0\udb60\0\udbb0\0\udc00"+
+    "\0\udc50\0\udca0\0\udcf0\0\udd40\0\udd90\0\udde0\0\ude30\0\ude80"+
+    "\0\uded0\0\udf20\0\udf70\0\udfc0\0\ue010\0\ue060\0\ue0b0\0\ue100"+
+    "\0\ue150\0\ue1a0\0\ue1f0\0\ue240\0\ue290\0\ue2e0\0\ue330\0\ue380"+
+    "\0\ue3d0\0\ue420\0\ue470\0\ue4c0\0\ue510\0\ue560\0\ue5b0\0\ue600"+
+    "\0\ue650\0\ue6a0\0\ue6f0\0\ue740\0\ue790\0\ue7e0\0\ue830\0\ue880"+
+    "\0\ue8d0\0\ue920\0\ue970\0\ue9c0\0\uea10\0\uea60\0\ueab0\0\ueb00"+
+    "\0\ueb50\0\ueba0\0\uebf0\0\uec40\0\uec90\0\uece0\0\ued30\0\ued80"+
+    "\0\uedd0\0\uee20\0\uee70\0\ueec0\0\uef10\0\uef60\0\uefb0\0\uf000"+
+    "\0\uf050\0\uf0a0\0\uf0f0\0\uf140\0\uf190\0\uf1e0\0\uf230\0\uf280"+
+    "\0\uf2d0\0\uf320\0\uf370\0\uf3c0\0\uf410\0\uf460\0\uf4b0\0\uf500"+
+    "\0\uf550\0\uf5a0\0\uf5f0\0\uf640\0\uf690\0\uf6e0\0\uf730\0\uf780"+
+    "\0\uf7d0\0\uf820\0\uf870\0\uf8c0\0\uf910\0\uf960\0\uf9b0\0\ufa00"+
+    "\0\ufa50\0\ufaa0\0\ufaf0\0\ufb40\0\ufb90\0\ufbe0\0\ufc30\0\ufc80"+
+    "\0\ufcd0\0\ufd20\0\ufd70\0\ufdc0\0\ufe10\0\ufe60\0\ufeb0\0\uff00"+
+    "\0\uff50\0\uffa0\0\ufff0\1\100\1\220\1\340\1\u0130\1\u0180"+
+    "\1\u01d0\1\u0220\1\u0270\1\u02c0\1\u0310\1\u0360\1\u03b0\1\u0400"+
+    "\1\u0450\1\u04a0\1\u04f0\1\u0540\1\u0590\1\u05e0\1\u0630\1\u0680"+
+    "\1\u06d0\1\u0720\1\u0770\1\u07c0\1\u0810\1\u0860\1\u08b0\1\u0900"+
+    "\1\u0950\1\u09a0\1\u09f0\1\u0a40\1\u0a90\1\u0ae0\1\u0b30\1\u0b80"+
+    "\1\u0bd0\1\u0c20\1\u0c70\1\u0cc0\1\u0d10\1\u0d60\1\u0db0\1\u0e00"+
+    "\1\u0e50\1\u0ea0\1\u0ef0\1\u0f40\1\u0f90\1\u0fe0\1\u1030\1\u1080"+
+    "\1\u10d0\1\u1120\1\u1170\1\u11c0\1\u1210\1\u1260\1\u12b0\1\u1300"+
+    "\1\u1350\1\u13a0\1\u13f0\1\u1440\1\u1490\1\u14e0\1\u1530\1\u1580"+
+    "\1\u15d0\1\u1620\1\u1670\1\u16c0\1\u1710\1\u1760\1\u17b0\1\u1800"+
+    "\1\u1850\1\u18a0\1\u18f0\1\u1940\1\u1990\1\u19e0\1\u1a30\1\u1a80"+
+    "\1\u1ad0\1\u1b20\1\u1b70\1\u1bc0\1\u1c10\1\u1c60\1\u1cb0\1\u1d00"+
+    "\1\u1d50\1\u1da0\1\u1df0\1\u1e40\1\u1e90\1\u1ee0\1\u1f30\1\u1f80"+
+    "\1\u1fd0\1\u2020\1\u2070\1\u20c0\1\u2110\1\u2160\1\u21b0\1\u2200"+
+    "\1\u2250\1\u22a0\1\u22f0\1\u2340\1\u2390\1\u23e0\1\u2430\1\u2480"+
+    "\1\u24d0\1\u2520\1\u2570\1\u25c0\1\u2610\1\u2660\1\u26b0\1\u2700"+
+    "\1\u2750\1\u27a0\1\u27f0\1\u2840\1\u2890\1\u28e0\1\u2930\1\u2980"+
+    "\1\u29d0\1\u2a20\1\u2a70\1\u2ac0\1\u2b10\1\u2b60\1\u2bb0\1\u2c00"+
+    "\1\u2c50\1\u2ca0\1\u2cf0\1\u2d40\1\u2d90\1\u2de0\1\u2e30\1\u2e80"+
+    "\1\u2ed0\1\u2f20\1\u2f70\1\u2fc0\1\u3010\1\u3060\1\u30b0\1\u3100"+
+    "\1\u3150\1\u31a0\1\u31f0\1\u3240\1\u3290\1\u32e0\1\u3330\1\u3380"+
+    "\1\u33d0\1\u3420\1\u3470\1\u34c0\1\u3510\0\u0500\1\u3560\1\u35b0"+
+    "\1\u3600\1\u3650\1\u36a0\1\u36f0\1\u3740\1\u3790\1\u37e0\1\u3830"+
+    "\1\u3880\1\u38d0\1\u3920\1\u3970\1\u39c0\1\u3a10\1\u3a60\1\u3ab0"+
+    "\1\u3b00\1\u3b50\1\u3ba0\1\u3bf0\1\u3c40\1\u3c90\1\u3ce0\1\u3d30"+
+    "\1\u3d80\1\u3dd0\1\u3e20\1\u3e70\1\u3ec0\1\u3f10\1\u3f60\1\u3fb0"+
+    "\1\u4000\1\u4050\1\u40a0\1\u40f0\1\u4140\1\u4190\1\u41e0\1\u4230"+
+    "\1\u4280\1\u42d0\1\u4320\1\u4370\1\u43c0\1\u4410\1\u4460\1\u44b0"+
+    "\1\u4500\1\u4550\1\u45a0\1\u45f0\1\u4640\1\u4690\1\u46e0\1\u4730"+
+    "\1\u4780\1\u47d0\1\u4820\1\u4870\1\u48c0\1\u4910\1\u4960\1\u49b0"+
+    "\1\u4a00\1\u4a50\1\u4aa0\1\u4af0\1\u4b40\1\u4b90\1\u4be0\1\u4c30"+
+    "\1\u4c80\1\u4cd0\1\u4d20\1\u4d70\1\u4dc0\1\u4e10";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1110];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\7\2\10\1\11\1\12\1\13\1\11\1\14\1\15"+
+    "\1\7\1\16\1\17\1\20\1\21\1\7\1\10\1\22"+
+    "\1\23\1\24\1\25\1\10\1\26\1\27\1\30\1\31"+
+    "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
+    "\1\42\1\43\1\44\1\45\1\46\1\47\1\25\1\50"+
+    "\1\25\1\51\1\52\1\51\1\53\1\10\1\54\1\55"+
+    "\1\56\1\10\1\57\1\60\1\61\1\62\1\63\1\64"+
+    "\1\10\1\65\1\10\2\43\1\66\1\10\1\67\1\70"+
+    "\1\71\1\10\1\72\1\73\1\74\1\75\1\76\1\77"+
+    "\1\10\1\100\1\10\1\101\2\10\20\102\1\103\2\102"+
+    "\1\104\3\102\1\105\25\102\1\106\10\102\1\107\31\102"+
+    "\20\110\1\111\2\110\1\112\3\110\1\113\15\110\1\114"+
+    "\7\110\1\115\10\110\1\116\5\110\1\117\1\110\1\120"+
+    "\21\110\11\121\1\122\1\123\4\121\1\124\1\125\77\121"+
+    "\7\126\1\127\1\126\1\130\6\126\1\131\77\126\11\121"+
+    "\1\132\1\133\4\121\1\124\1\134\77\121\7\7\1\0"+
+    "\2\7\1\0\2\7\1\0\2\7\4\0\5\7\2\0"+
+    "\6\7\14\0\17\7\2\0\23\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\3\136"+
+    "\2\11\1\136\1\11\1\0\2\136\1\0\2\136\1\0"+
+    "\2\136\4\0\1\136\1\137\2\140\1\141\1\0\1\142"+
+    "\2\136\1\141\1\136\1\137\1\136\14\0\2\136\1\140"+
+    "\5\136\1\140\6\136\2\0\25\136\1\143\1\144\1\136"+
+    "\1\144\1\0\2\136\1\0\2\136\1\0\2\136\4\0"+
+    "\1\145\1\137\2\140\1\141\1\0\1\142\2\136\1\141"+
+    "\1\136\1\137\1\136\14\0\2\136\1\140\2\136\1\145"+
+    "\2\136\1\140\6\136\2\0\22\136\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\10\1\146\12\10\1\147"+
+    "\2\10\2\0\1\7\21\10\7\150\1\151\1\150\1\152"+
+    "\6\150\1\153\77\150\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\5\10\1\154\14\0\17\10\2\0\1\7\21\10\12\0"+
+    "\1\155\105\0\1\7\6\10\1\0\1\156\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\157\1\160\2\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\10\1\161\4\10"+
+    "\14\0\1\10\1\162\12\10\1\163\2\10\2\0\1\7"+
+    "\21\10\141\0\1\23\76\0\11\164\1\165\10\164\1\166"+
+    "\1\167\22\164\1\170\51\164\46\0\1\51\51\0\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\10\1\171"+
+    "\4\10\1\172\10\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\173\1\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\3\10\1\174\1\175\1\10\14\0\1\10\1\176\4\10"+
+    "\1\177\10\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\200\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\201\4\10\14\0\5\10"+
+    "\1\202\11\10\2\0\1\7\21\10\31\0\1\51\14\0"+
+    "\1\51\54\0\2\142\1\0\1\142\111\0\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\203\1\204\3\10\14\0"+
+    "\1\205\1\206\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\207\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\3\10\1\210\1\211\1\10\14\0\5\10\1\212\4\10"+
+    "\1\213\4\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\214\1\215\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\5\10\1\216\14\0\2\10\1\217"+
+    "\14\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\220\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\221\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\222\1\10"+
+    "\1\223\1\10\1\224\1\10\14\0\1\225\2\10\1\226"+
+    "\5\10\1\227\2\10\1\230\2\10\2\0\1\7\21\10"+
+    "\22\0\1\231\141\0\1\51\1\0\1\51\116\0\1\232"+
+    "\1\51\112\0\1\51\4\0\1\51\117\0\1\51\1\0"+
+    "\1\233\115\0\1\51\4\0\1\51\44\0\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\234\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\235\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\236\3\10\14\0\1\10\1\237\15\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\240\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\10"+
+    "\1\241\1\10\1\242\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\243"+
+    "\1\244\1\10\14\0\1\245\1\246\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\1\247"+
+    "\1\10\1\0\1\7\1\10\4\0\3\10\1\250\1\10"+
+    "\2\0\1\251\4\10\1\252\14\0\2\10\1\253\4\10"+
+    "\1\254\7\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\255\3\10\14\0\6\10\1\256"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\257\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\260\5\10\1\261\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\10\1\262"+
+    "\15\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\263\1\264\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\265\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\266\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\2\267\2\7\1\267\1\7\1\0\1\267\1\7\1\0"+
+    "\2\267\1\0\1\7\1\267\4\0\5\267\2\0\6\267"+
+    "\14\0\17\267\2\0\1\7\21\267\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\10\1\270\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\271\3\10\1\272\14\0"+
+    "\3\10\1\273\13\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\274\1\10\14\0\1\275"+
+    "\1\276\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\277\1\10\1\300\3\10\14\0\1\301"+
+    "\13\10\1\302\2\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\303\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\304\3\10\1\305\1\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\306\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\307\13\10\1\310\2\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\3\10\1\261\2\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\311"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\312\3\10\14\0\1\10\1\313\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\314\1\135"+
+    "\1\0\1\10\1\315\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\316\1\10\1\317"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\320\3\10\14\0\1\10"+
+    "\1\321\4\10\1\322\10\10\2\0\1\7\21\10\20\102"+
+    "\1\0\2\102\1\0\3\102\1\0\25\102\1\0\10\102"+
+    "\1\0\31\102\22\0\1\323\130\0\1\324\27\0\1\325"+
+    "\67\0\1\326\152\0\1\327\31\0\20\110\1\0\2\110"+
+    "\1\0\3\110\1\0\15\110\1\0\7\110\1\0\10\110"+
+    "\1\0\5\110\1\0\1\110\1\0\21\110\22\0\1\330"+
+    "\130\0\1\331\27\0\1\332\35\0\1\333\3\0\1\333"+
+    "\2\0\1\333\2\0\2\333\5\0\1\334\1\0\5\333"+
+    "\2\0\6\333\7\0\1\335\4\0\17\333\3\0\21\333"+
+    "\33\0\1\336\152\0\1\337\127\0\1\340\54\0\1\341"+
+    "\1\342\1\343\1\344\1\0\1\345\15\0\1\346\1\347"+
+    "\1\350\1\351\1\0\1\352\3\0\1\353\30\0\11\121"+
+    "\2\0\4\121\2\0\77\121\20\354\1\0\77\354\12\0"+
+    "\1\355\106\0\2\356\2\0\1\356\2\0\1\356\2\0"+
+    "\2\356\2\0\1\356\4\0\5\356\2\0\6\356\14\0"+
+    "\17\356\1\357\2\0\21\356\7\126\1\0\1\126\1\0"+
+    "\6\126\1\0\77\126\7\0\1\360\110\0\20\361\1\0"+
+    "\77\361\20\362\1\0\77\362\7\7\1\0\1\363\1\7"+
+    "\1\0\2\7\1\0\2\7\4\0\5\7\2\0\6\7"+
+    "\14\0\17\7\2\0\22\7\7\136\1\0\2\136\1\0"+
+    "\2\136\1\0\2\136\4\0\5\136\2\0\6\136\14\0"+
+    "\17\136\2\0\25\136\2\364\1\136\1\364\1\0\2\136"+
+    "\1\0\2\136\1\0\2\136\4\0\5\136\1\365\1\0"+
+    "\6\136\3\0\1\365\10\0\17\136\2\0\25\136\2\142"+
+    "\1\136\1\142\1\0\2\136\1\0\2\136\1\0\2\136"+
+    "\4\0\2\136\2\140\1\141\2\0\2\136\1\141\3\136"+
+    "\14\0\2\136\1\140\5\136\1\140\6\136\2\0\25\136"+
+    "\2\143\1\136\1\143\1\0\2\136\1\0\2\136\1\0"+
+    "\2\136\4\0\2\136\2\140\1\141\1\0\1\142\2\136"+
+    "\1\141\3\136\14\0\2\136\1\140\5\136\1\140\6\136"+
+    "\2\0\25\136\1\143\1\144\1\136\1\144\1\0\2\136"+
+    "\1\0\2\136\1\0\2\136\4\0\1\136\1\366\2\140"+
+    "\1\141\1\0\1\142\2\136\1\141\1\136\1\366\1\136"+
+    "\14\0\2\136\1\140\5\136\1\140\6\136\2\0\25\136"+
+    "\4\367\1\0\2\136\1\0\1\136\1\367\1\0\2\136"+
+    "\4\0\2\136\3\367\2\0\2\136\2\367\2\136\14\0"+
+    "\2\136\1\367\1\136\1\367\3\136\1\367\6\136\2\0"+
+    "\2\136\2\367\16\136\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\10\1\370\15\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\371\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\7\150\1\372\1\150\1\152"+
+    "\6\150\1\153\77\150\7\0\1\373\110\0\4\374\1\150"+
+    "\1\374\1\150\1\375\1\376\4\150\3\374\1\0\6\374"+
+    "\1\150\3\374\2\150\63\374\7\153\1\372\1\153\1\377"+
+    "\106\153\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u0100"+
+    "\3\10\14\0\6\10\1\u0101\10\10\2\0\1\7\21\10"+
+    "\12\0\1\u0102\105\0\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\4\10\1\u0103\1\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\11\10"+
+    "\1\250\5\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u0104\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u0105"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u0106\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u0107\5\10\14\0\17\10\2\0\1\7\21\10\11\164"+
+    "\1\165\10\164\1\u0108\115\164\1\0\77\164\20\166\1\0"+
+    "\77\166\23\0\1\u0109\74\0\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\1\u010a\1\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u010b\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u010c\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\4\10\1\u010d"+
+    "\1\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u010e\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\250\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u010f\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\u0110"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u0111\4\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\4\10\1\u0112\12\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\u0113\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u0114"+
+    "\2\10\14\0\14\10\1\250\2\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u0115\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\u0116\4\10\14\0\6\10\1\u0117\10\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\3\10\1\u0118\15\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u0119\4\10\1\u011a"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\4\10\1\u011b\12\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\5\10"+
+    "\1\u011c\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u011d\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u011e\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\14\10\1\u0100"+
+    "\2\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u011f\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\4\10\1\u0120\1\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\5\10"+
+    "\1\u0121\14\0\17\10\2\0\1\7\7\10\1\u0122\11\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\2\10"+
+    "\1\u0123\14\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u0124\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\3\10\1\u0125\13\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u0126\1\10\1\u0127\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u0128\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\263"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u0129\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u012a\2\10\1\u012b\1\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\6\10\1\u012c\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\1\u012d\1\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\11\164\1\165\10\164\2\0\74\164"+
+    "\46\0\1\51\1\0\1\25\47\0\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\5\10\1\u012e\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\7\10\1\u012f\7\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\3\10\1\u0130\1\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\u0131\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\10\1\u0132\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u0133\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\10\1\u0134\4\10\1\u0135\10\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\4\10\1\u0136\12\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u0137\4\10\1\u011c\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u0138\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u0139"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\u013a\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\4\10\1\u013b\1\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u013c\4\10\1\u013d\14\0\12\10\1\u013e\4\10"+
+    "\2\0\1\7\13\10\1\u013f\5\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\u0140\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\2\10\1\u0141\16\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\2\10\1\u0142\3\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\3\10\1\u0143\13\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u0144\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\5\10\1\u0145\11\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\u0146\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\6\10\1\u0147\10\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\u0148"+
+    "\5\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\u0149\1\10\14\0\6\10"+
+    "\1\u014a\10\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\u012f\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\u014b"+
+    "\5\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\u014c\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u014d\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\267\1\0\1\267\1\u014e\1\0\2\267\1\0\1\7"+
+    "\1\267\4\0\5\267\2\0\6\267\14\0\17\267\2\0"+
+    "\1\7\21\267\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\5\10"+
+    "\1\u014f\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u0150\4\10\14\0\6\10"+
+    "\1\u0151\10\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\5\10\1\u0152\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\3\10\1\u0153\13\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u0154\2\10\14\0\1\10"+
+    "\1\u0155\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u0156\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\7\10\1\u0157\7\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u0158\1\10\1\u0159"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\4\10\1\u015a\12\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\10\1\u015b\15\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u015c\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u015d\4\10\1\u015e\14\0\1\u015f\1\10\1\u0160"+
+    "\1\10\1\u0161\12\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u0162\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\4\10\1\u0163\1\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u0164\14\0"+
+    "\16\10\1\u0165\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u0166\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\3\10\1\u0167\13\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\4\10\1\u0168\1\10\14\0"+
+    "\7\10\1\u0169\7\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\13\10\1\u016a\3\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\2\10\1\u016b\1\u016c"+
+    "\15\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u016d\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\13\10"+
+    "\1\u013f\5\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\10\1\u016e\15\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\4\10\1\u016f"+
+    "\12\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\u0170\4\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\6\10\1\u0171\10\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u0172\4\10\14\0\17\10"+
+    "\2\0\1\7\21\10\60\0\1\u0173\76\0\1\u0174\113\0"+
+    "\1\u0175\152\0\1\u0176\111\0\1\u0177\76\0\1\u0178\60\0"+
+    "\50\333\1\335\47\333\1\0\1\333\3\0\1\333\2\0"+
+    "\1\333\2\0\2\333\7\0\5\333\2\0\6\333\7\0"+
+    "\1\335\4\0\17\333\3\0\21\333\33\0\1\u0179\152\0"+
+    "\1\u017a\70\0\1\u017b\17\0\1\u017c\1\0\1\u017d\1\0"+
+    "\1\u017e\3\0\1\u017f\40\0\1\u0180\44\0\1\u0181\1\u0182"+
+    "\76\0\1\u0183\144\0\1\u0184\45\0\1\u0185\144\0\1\u0186"+
+    "\25\0\1\u0187\50\0\1\u0188\140\0\1\u0189\120\0\1\u018a"+
+    "\117\0\1\u018b\74\0\1\u018c\141\0\1\u018d\74\0\1\u018e"+
+    "\106\0\6\356\1\0\1\356\1\u018f\1\0\2\356\2\0"+
+    "\1\356\4\0\5\356\2\0\6\356\14\0\17\356\3\0"+
+    "\21\356\75\u0190\1\0\22\u0190\7\0\1\u0191\110\0\3\7"+
+    "\4\u0192\1\0\2\7\1\0\1\7\1\u0192\1\0\2\7"+
+    "\4\0\2\7\3\u0192\2\0\2\7\2\u0192\2\7\14\0"+
+    "\2\7\1\u0192\1\7\1\u0192\3\7\1\u0192\6\7\2\0"+
+    "\2\7\2\u0192\16\7\3\136\2\364\1\136\1\364\1\0"+
+    "\2\136\1\0\2\136\1\0\2\136\4\0\2\136\2\140"+
+    "\1\136\2\0\6\136\14\0\2\136\1\140\5\136\1\140"+
+    "\6\136\2\0\22\136\3\0\2\364\1\0\1\364\111\0"+
+    "\3\136\4\367\1\0\2\136\1\0\1\136\1\367\1\0"+
+    "\2\136\4\0\1\136\1\366\3\367\2\0\2\136\2\367"+
+    "\1\366\1\136\14\0\2\136\1\367\1\136\1\367\3\136"+
+    "\1\367\6\136\2\0\2\136\2\367\16\136\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\u0193\1\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u0100\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\7\374\1\u0194\10\374\1\0\102\374\4\u0195\1\u0194\4\374"+
+    "\1\u0195\3\374\1\0\5\374\3\u0195\4\374\2\u0195\20\374"+
+    "\1\u0195\1\374\1\u0195\3\374\1\u0195\12\374\2\u0195\16\374"+
+    "\4\0\1\153\1\0\2\153\1\u0196\4\153\12\0\1\153"+
+    "\3\0\2\153\63\0\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u0197\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\4\10\1\250\1\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\u0198\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u0199"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\u019a\1\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u013c\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\22\0\1\u019b\75\0\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\13\10\1\u0100\3\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\16\10"+
+    "\1\u019c\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u019d\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\5\10\1\u0113"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u019e\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u019f\2\10\14\0\2\10\1\u01a0\14\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\7\10\1\u01a1\7\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u01a2\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u01a3\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u01a4\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u01a5\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\250\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\10\1\u01a6\15\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\5\10"+
+    "\1\250\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u01a7\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\u01a8\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\3\10\1\u01a9\13\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\u01aa\16\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\250\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u01ab\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\10\1\214\4\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u01ac\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\10\1\146\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u01ad\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\14\10\1\u01ae\2\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\3\10\1\u01af\15\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\13\10\1\u013c\3\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\176\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\6\10\1\u01b0"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u01b1\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\10\10\1\u01b2\10\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u019e\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\6\10\1\u01b3\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\6\10\1\u019d"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u0137\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\4\10"+
+    "\1\u01b4\12\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\14\10"+
+    "\1\u01b5\4\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\3\10\1\u0100\13\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\3\10\1\u01b6\2\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\1\10\1\u01b7\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\4\10\1\u01b1\1\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\1\10"+
+    "\1\u019d\17\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\u01b8"+
+    "\5\10\14\0\3\10\1\u01b9\13\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u01ba\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\12\10\1\u01bb\4\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\16\10\1\u01bc\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\4\10\1\u01bd\12\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\5\10\1\u0117\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u013c\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u01be\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\4\10\1\u013f\1\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u01bf\5\10"+
+    "\14\0\3\10\1\u013f\13\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\10\1\u01c0"+
+    "\15\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u01c1\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\10\1\u01c2"+
+    "\4\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u01c3\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u01c4\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\4\10\1\u01c5\1\10\14\0"+
+    "\1\10\1\u01ad\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u01c6\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\6\10\1\u01c7\10\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\10\1\u01c8"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\4\10\1\u011c\1\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\u0100\16\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u01c9\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\2\10\1\250\14\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\1\10\1\u019d\6\10\1\u01ca\3\10\1\u01cb\4\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u01cc\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u01cd\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\2\10\1\u01cc\14\10\2\0"+
+    "\1\7\21\10\7\7\1\0\1\u01ce\1\7\1\0\2\7"+
+    "\1\0\2\7\4\0\5\7\2\0\6\7\14\0\17\7"+
+    "\2\0\23\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u01cf\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u01d0\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\u01d1"+
+    "\5\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u01d2\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u01d3\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u01d4\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\1\u01d5\1\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\10\1\u01d6\4\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\3\10\1\u01d7\13\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\6\10\1\u01d8\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\4\10\1\u01d9"+
+    "\12\10\2\0\1\7\21\10\1\7\6\10\1\0\1\u01da"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u019d\4\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u01db\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u01dc\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u01dd\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u01de"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u01df\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\10\1\u01e0\15\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\10\1\u01cc\4\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\u01e1\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\u01e2\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u01e3\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\1\u01e4\1\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u01e5\3\10\14\0\1\10\1\u01e6\15\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u01e7\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\4\10\1\u01e8\1\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\1\10\1\u01e9\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u01ea\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\4\10\1\u01eb\1\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\u01ec\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\12\10"+
+    "\1\u01ed\6\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\4\10\1\u01ee\12\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\16\10\1\u01ef"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\6\10\1\u01f0\10\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\2\10"+
+    "\1\u0100\14\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u01f1\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\54\0\1\u01f2\100\0\1\u0173\142\0\1\u01f3\71\0"+
+    "\1\u01f4\141\0\1\u01f5\100\0\1\u0177\142\0\1\u01f6\71\0"+
+    "\1\u01f7\150\0\1\u01f8\112\0\1\u01f9\117\0\1\u01fa\54\0"+
+    "\1\u01fb\142\0\1\u01fc\114\0\1\u01fd\120\0\1\u01fe\142\0"+
+    "\1\u01ff\73\0\1\u0200\122\0\1\u0201\22\0\1\u0202\71\0"+
+    "\1\u0203\120\0\1\u0204\1\u0205\75\0\1\u0206\144\0\1\u0207"+
+    "\137\0\1\u0208\73\0\1\u0209\116\0\1\u020a\117\0\1\u020b"+
+    "\23\0\1\u020c\74\0\1\u020d\73\0\1\u020e\107\0\75\u0190"+
+    "\1\u020f\22\u0190\3\7\4\u0210\1\0\2\7\1\0\1\7"+
+    "\1\u0210\1\0\2\7\4\0\2\7\3\u0210\2\0\2\7"+
+    "\2\u0210\2\7\14\0\2\7\1\u0210\1\7\1\u0210\3\7"+
+    "\1\u0210\6\7\2\0\2\7\2\u0210\17\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\u0211\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\3\374\4\u0212\1\u0194\4\374\1\u0212\3\374"+
+    "\1\0\5\374\3\u0212\4\374\2\u0212\20\374\1\u0212\1\374"+
+    "\1\u0212\3\374\1\u0212\12\374\2\u0212\16\374\3\0\4\u0213"+
+    "\5\0\1\u0213\11\0\3\u0213\4\0\2\u0213\20\0\1\u0213"+
+    "\1\0\1\u0213\3\0\1\u0213\12\0\2\u0213\16\0\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\13\10\1\250"+
+    "\3\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\12\10\1\u011c\4\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\16\10\1\250\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\u0214\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u0215\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u0100\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u013c\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\4\10\1\u0216\1\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\1\10"+
+    "\1\u0217\3\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\1\10\1\u0218\3\10\1\u0219\13\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\2\10"+
+    "\1\u021a\16\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\10"+
+    "\1\u0100\4\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\3\10\1\u021b"+
+    "\13\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u021c\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\11\10"+
+    "\1\u021d\5\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u021e\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\10"+
+    "\1\u01c7\4\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\10\1\u021f"+
+    "\15\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\20\10\1\u0220"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u0221\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\u0222\4\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\10\1\u0115"+
+    "\4\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\3\10\1\371\13\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\u0223\16\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\4\10\1\u0224"+
+    "\12\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\u0225\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\255"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\u0226\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\u0227\16\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u0228\4\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\u0229\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\u0107\1\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u022a\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u022b\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u022c\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u022d"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u022e\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\250\16\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\6\10\1\u022f"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u0230\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\16\10\1\u0231\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\4\10\1\u019d\12\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u0232\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\5\10\1\371\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u0233\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\2\10\1\u0234\3\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u0235"+
+    "\16\10\1\7\6\10\1\0\1\10\1\135\1\0\1\250"+
+    "\1\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\4\10\1\371\1\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\260"+
+    "\5\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u0236\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u0237\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u0146\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\6\10\1\u0238\10\10\2\0"+
+    "\1\7\21\10\3\7\4\u0239\1\0\2\7\1\0\1\7"+
+    "\1\u0239\1\0\2\7\4\0\2\7\3\u0239\2\0\2\7"+
+    "\2\u0239\2\7\14\0\2\7\1\u0239\1\7\1\u0239\3\7"+
+    "\1\u0239\6\7\2\0\2\7\2\u0239\17\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u023a\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\14\10\1\u023b\2\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\u023c\16\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u023d\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u014d\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u023e\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u023f\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u0240\2\10\14\0\17\10\2\0"+
+    "\1\7\3\10\1\u0241\15\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u0162\2\10\14\0\6\10\1\u0242\10\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u0243\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\4\10\1\u0244\12\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\16\10\1\u0245\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u0246\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u0247\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u0248\4\10\14\0"+
+    "\13\10\1\u0249\3\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u024a\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u024b\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\5\10"+
+    "\1\u024c\11\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\7\10\1\u024d\7\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\13\10\1\u024e\3\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\3\10\1\u024f"+
+    "\13\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u0250\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u0251\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u0252\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\11\10\1\u01cc\5\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\11\10\1\u0253\7\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\14\10\1\u0254"+
+    "\4\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u0255"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u0256\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u0257\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\4\10\1\u0258"+
+    "\12\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\3\10"+
+    "\1\u0259\1\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u025a"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u025b\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\3\10\1\u025c"+
+    "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\u025d\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\22\0\1\u025e\135\0\1\u0173\13\0"+
+    "\1\u01f2\44\0\1\u01f4\1\u025f\4\u01f4\1\u025f\1\u01f4\2\0"+
+    "\2\u01f4\1\0\1\u025f\1\u01f4\2\0\1\u01f4\1\u025f\5\u01f4"+
+    "\2\u025f\6\u01f4\4\u025f\1\0\1\u025f\2\0\4\u025f\17\u01f4"+
+    "\2\0\1\u025f\21\u01f4\22\0\1\u0260\135\0\1\u0177\13\0"+
+    "\1\u01f5\44\0\1\u01f7\1\u0261\4\u01f7\1\u0261\1\u01f7\2\0"+
+    "\2\u01f7\1\0\1\u0261\1\u01f7\2\0\1\u01f7\1\u0261\5\u01f7"+
+    "\2\u0261\6\u01f7\4\u0261\1\0\1\u0261\2\0\4\u0261\17\u01f7"+
+    "\2\0\1\u0261\21\u01f7\13\0\1\u0262\17\0\1\u0263\145\0"+
+    "\1\u0264\115\0\1\u0265\115\0\1\u0266\101\0\1\u0267\136\0"+
+    "\1\u0268\76\0\1\u0269\20\0\1\u026a\117\0\1\u0205\51\0"+
+    "\1\u026b\173\0\1\u026c\70\0\1\u026d\1\0\1\u026e\135\0"+
+    "\1\u026f\125\0\1\u0270\115\0\1\u0271\114\0\1\u0272\75\0"+
+    "\1\u0273\121\0\1\u0274\116\0\1\u0275\117\0\1\u0276\117\0"+
+    "\1\u0277\122\0\1\u0278\62\0\4\u0279\5\0\1\u0279\11\0"+
+    "\3\u0279\4\0\2\u0279\20\0\1\u0279\1\0\1\u0279\3\0"+
+    "\1\u0279\12\0\2\u0279\16\0\3\7\4\u027a\1\0\2\7"+
+    "\1\0\1\7\1\u027a\1\0\2\7\4\0\2\7\3\u027a"+
+    "\2\0\2\7\2\u027a\2\7\14\0\2\7\1\u027a\1\7"+
+    "\1\u027a\3\7\1\u027a\6\7\2\0\2\7\2\u027a\17\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\3\10\1\u027b\2\10\14\0"+
+    "\17\10\2\0\1\7\21\10\3\374\4\u027c\1\u0194\4\374"+
+    "\1\u027c\3\374\1\0\5\374\3\u027c\4\374\2\u027c\20\374"+
+    "\1\u027c\1\374\1\u027c\3\374\1\u027c\12\374\2\u027c\16\374"+
+    "\3\0\4\u027d\5\0\1\u027d\11\0\3\u027d\4\0\2\u027d"+
+    "\20\0\1\u027d\1\0\1\u027d\3\0\1\u027d\12\0\2\u027d"+
+    "\16\0\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u027e"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\13\10\1\u027f\3\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\4\10\1\u0280\1\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u0281\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\4\10\1\u0282\1\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\1\u0283\1\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u0284\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u0285\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\6\10\1\u0286"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\171\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\1\u0287"+
+    "\1\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\6\10\1\u0288\10\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\2\10\1\u0117\14\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\3\10\1\u0289\2\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\u028a"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u028b\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\4\10\1\250\12\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u028c\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\u028d\4\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\10\1\u028e\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\u0115\1\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\4\10\1\u028f\12\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\10\1\u0290\4\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\3\10\1\u0100\1\10\2\0\4\10\1\u027b\1\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u011c\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\13\10"+
+    "\1\u011c\3\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u0291\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\1\u0292"+
+    "\1\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\u0293\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\u0111"+
+    "\5\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\6\10\1\u0294\10\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\7\10\1\u0295\7\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\4\10\1\u0296\1\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u0297\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\10\1\u0298\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\7\10\1\u0299\7\10"+
+    "\2\0\1\7\21\10\3\7\4\u029a\1\0\2\7\1\0"+
+    "\1\7\1\u029a\1\0\2\7\4\0\2\7\3\u029a\2\0"+
+    "\2\7\2\u029a\2\7\14\0\2\7\1\u029a\1\7\1\u029a"+
+    "\3\7\1\u029a\6\7\2\0\2\7\2\u029a\17\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u029b\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\3\10\1\u029c\1\10"+
+    "\1\u029d\13\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\7\10\1\u029e\7\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u029f\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\1\10\1\u02a0"+
+    "\1\u02a1\2\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\2\10\1\u02a2\6\10\1\u02a3\7\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u0146\2\10\14\0\17\10\2\0"+
+    "\1\7\11\10\1\u02a4\7\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\4\10\1\u02a5\12\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u02a6"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\u0249\1\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\13\10\1\u02a7\3\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u02a8\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\7\10\1\u02a9"+
+    "\2\10\1\u02aa\6\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\6\10\1\u02ab\10\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\7\10"+
+    "\1\u0100\7\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u02ac\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u02ad\4\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u01a2\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u02ae\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\u02af\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\12\10\1\u02b0\6\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\3\10\1\u02b1\13\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\3\10\1\u02b2\2\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\3\10"+
+    "\1\u02b3\13\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\6\10\1\u02b4\10\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\11\10\1\u02b5\5\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\2\10\1\u02b6"+
+    "\14\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u02b7\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\10\1\u02b8\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u02b9\4\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\6\10\1\u02ba\10\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u02bb\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\u02bc\16\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\10\10\1\u02bd\10\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\5\10\1\u02be\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\13\10\1\371\3\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\14\10\1\u02bf\2\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\3\10\1\u02c0\2\10\14\0\17\10\2\0\1\7\21\10"+
+    "\22\0\1\u01f4\117\0\1\u01f7\170\0\1\u02c1\61\0\1\u02c2"+
+    "\154\0\1\u02c3\62\0\1\u02c1\117\0\1\u02c4\72\0\1\u0265"+
+    "\143\0\1\u02c5\121\0\1\u02c6\147\0\1\u02c7\65\0\1\u02c8"+
+    "\143\0\1\u02c9\117\0\1\u02ca\47\0\1\u02cb\165\0\1\u02cc"+
+    "\77\0\1\u02cd\116\0\1\u0205\121\0\1\u02ce\115\0\1\u02cf"+
+    "\146\0\1\u0205\123\0\1\u02d0\63\0\1\u02d1\145\0\1\u0205"+
+    "\120\0\1\u02d2\37\0\4\u02d3\5\0\1\u02d3\11\0\3\u02d3"+
+    "\4\0\2\u02d3\20\0\1\u02d3\1\0\1\u02d3\3\0\1\u02d3"+
+    "\12\0\2\u02d3\16\0\3\7\4\10\1\0\2\7\1\0"+
+    "\1\7\1\10\1\0\2\7\4\0\2\7\3\10\2\0"+
+    "\2\7\2\10\2\7\14\0\2\7\1\10\1\7\1\10"+
+    "\3\7\1\10\6\7\2\0\2\7\2\10\17\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\u0100\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\3\374\4\150\1\u0194\4\374\1\150\3\374"+
+    "\1\0\5\374\3\150\4\374\2\150\20\374\1\150\1\374"+
+    "\1\150\3\374\1\150\12\374\2\150\16\374\3\0\4\u02d4"+
+    "\5\0\1\u02d4\11\0\3\u02d4\4\0\2\u02d4\20\0\1\u02d4"+
+    "\1\0\1\u02d4\3\0\1\u02d4\12\0\2\u02d4\16\0\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\1\u013c\1\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u02bf\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\14\10"+
+    "\1\250\2\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\5\10\1\u02d5\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\4\10\1\u0100"+
+    "\1\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\2\10\1\u02d6\14\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u02d7\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\6\10\1\u02d8"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u02d9\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\2\10\1\u02da\14\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u02db\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\4\10\1\u0115\12\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u02dc\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\3\10\1\u02dd"+
+    "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\3\10\1\u0100\1\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\10\1\u02de\15\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\3\10\1\u02df\13\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u02e0\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u0280\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\u011c\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\4\10\1\u02e1\12\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\10\10\1\u02e2\10\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\214\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u02e3\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u02e4\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u02e5\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\3\10\1\u02e6"+
+    "\13\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u02e7\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\3\7\4\u02e8\1\0\2\7\1\0\1\7\1\u02e8"+
+    "\1\0\2\7\4\0\2\7\3\u02e8\2\0\2\7\2\u02e8"+
+    "\2\7\14\0\2\7\1\u02e8\1\7\1\u02e8\3\7\1\u02e8"+
+    "\6\7\2\0\2\7\2\u02e8\17\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\4\10\1\u02e9\12\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u02ea\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u02eb\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u02ec"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\6\10\1\u02ed\10\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\10\1\u02ee\15\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u02ef\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u02f0\2\10\14\0\6\10\1\u02f1"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u02f2\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\10\1\u02f3\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u02f4\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\4\10\1\u02f5\14\10\1\7"+
+    "\4\10\1\u02f6\1\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\5\10\1\u029d\13\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\10\10\1\75\10\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u02f7\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\12\10"+
+    "\1\u02f8\4\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u02f9\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u02fa"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\u02fb\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u02fc\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u02fd\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\u02fe\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u02ff\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\4\10\1\u0300"+
+    "\1\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u0301\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\5\10\1\u0302\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\1\u02bf\1\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\1\10\1\u0303"+
+    "\3\10\1\0\1\u0304\6\10\14\0\10\10\1\u0305\6\10"+
+    "\2\0\1\7\15\10\1\u0306\3\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u0307\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\6\10\1\u0308\10\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\2\10\1\u0309\2\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\12\10\1\u030a\4\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u030b\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\2\10"+
+    "\1\u030c\2\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\10\10\1\u030d\10\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u030e\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u030f\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\4\10"+
+    "\1\u0310\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\4\10\1\u0311\1\10"+
+    "\14\0\17\10\2\0\1\7\21\10\75\u02c1\1\u0205\22\u02c1"+
+    "\34\0\1\u0312\141\0\1\u0313\75\0\1\u0314\146\0\1\u0315"+
+    "\113\0\1\u0316\100\0\1\u0205\72\0\1\u0205\143\0\1\u0271"+
+    "\113\0\1\u0278\143\0\1\u0271\74\0\1\u0205\122\0\1\u0317"+
+    "\115\0\1\u0318\143\0\1\u0319\114\0\1\u031a\54\0\1\u0315"+
+    "\162\0\1\u02c8\44\0\4\u031b\5\0\1\u031b\11\0\3\u031b"+
+    "\4\0\2\u031b\20\0\1\u031b\1\0\1\u031b\3\0\1\u031b"+
+    "\12\0\2\u031b\21\0\4\153\5\0\1\153\11\0\3\153"+
+    "\4\0\2\153\20\0\1\153\1\0\1\153\3\0\1\153"+
+    "\12\0\2\153\16\0\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u031c\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\2\10\1\u031d\3\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u031e\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u031f\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u0115\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\5\10\1\u0320"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\u0321\16\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\2\10\1\u0322\14\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\3\10\1\250\13\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u0323\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\2\10\1\u0324\3\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u014a\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u0325"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u0326\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u0327\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\5\10\1\u0328\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\2\10\1\u0235\11\10"+
+    "\1\u0329\4\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u032a\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\4\10\1\u032b\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\14\10\1\u032c\4\10\3\7\4\267\1\0"+
+    "\2\7\1\0\1\7\1\267\1\0\2\7\4\0\2\7"+
+    "\3\267\2\0\2\7\2\267\2\7\14\0\2\7\1\267"+
+    "\1\7\1\267\3\7\1\267\6\7\2\0\2\7\2\267"+
+    "\17\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u032d\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u032e\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\2\10\1\u0160\14\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u032f\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\10\1\u02b5\15\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\3\10\1\u0330\2\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\u0331\4\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\5\10\1\u0332"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u0333\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\u0334"+
+    "\5\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u0335\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u0336\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\u0337\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\u0338\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u0339\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u033a\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\14\10\1\u033b"+
+    "\2\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\4\10\1\u02bf\1\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\3\10\1\u033c\13\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\6\10\1\u033d\10\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\3\10\1\u033e\2\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u033f\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u0340\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\1\10\1\u0341\1\10\1\u0342\3\10\1\u0343"+
+    "\1\u0344\10\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\10"+
+    "\1\u0345\4\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\3\10\1\u0346\1\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u0347\15\10\2\0\1\7"+
+    "\21\10\102\0\1\u0348\15\0\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\75\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\10\1\u0349"+
+    "\4\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\14\10\1\u034a\4\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u034b\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\10\1\u034c"+
+    "\15\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u034d\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\10\10\1\u034e\6\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\6\10\1\u034f\10\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u0350\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\7\10"+
+    "\1\u0351\7\10\2\0\1\7\21\10\1\7\4\10\1\u0352"+
+    "\1\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\10"+
+    "\1\201\4\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\10\10\1\u0353\10\10\36\0\1\u0354\137\0\1\u0355"+
+    "\124\0\1\u0356\72\0\1\u0357\121\0\1\u0358\105\0\1\u0359"+
+    "\36\0\1\u035a\65\0\1\u0271\122\0\1\u035b\115\0\1\u035c"+
+    "\66\0\4\356\5\0\1\356\11\0\3\356\4\0\2\356"+
+    "\20\0\1\356\1\0\1\356\3\0\1\356\12\0\2\356"+
+    "\16\0\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\5\10\1\u035d\13\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\5\10\1\u035e\11\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u035f\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\1\u0360\1\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\7\10\1\u0361\11\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\5\10\1\u0362\13\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\10\1\u0363\15\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\6\10\1\u0364\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u0294\4\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u0365\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u0366\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u0117\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\5\10\1\u0100"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u0367\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\10"+
+    "\1\u0368\4\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\5\10\1\u0369"+
+    "\11\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u036a\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\10\10\1\u036b\10\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u036c\4\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\6\10\1\u036d\10\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\2\10"+
+    "\1\u0249\14\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\7\10\1\u036e\7\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\u036f"+
+    "\5\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\4\10\1\u0370\12\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\2\10\1\u0371"+
+    "\2\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\3\10\1\u0372\15\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u0373\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u0374\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\3\10\1\u0375\1\10\2\0\6\10\14\0"+
+    "\6\10\1\u0376\10\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\4\10\1\u0377\12\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u0378\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\4\10\1\u032b\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\10\10\1\u0379\10\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u037a\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u037b\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\1\10\1\u037c\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\12\10\1\u037d\6\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\6\10"+
+    "\1\u037e\10\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u037f\4\10\14\0\4\10\1\u0380"+
+    "\12\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u0381\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\u0382"+
+    "\16\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u0383\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\u0384\5\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\6\10\1\u0385\10\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\4\10\1\u0386\12\10\2\0\1\7\21\10\33\0"+
+    "\1\u0387\64\0\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\10\1\u0388\15\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u0389\4\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u038a\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\10\1\u038b\4\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\1\10"+
+    "\1\u038c\17\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u038d\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\2\10\1\u038e\3\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u038f\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u0390\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\u0391\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u0392\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\37\0\1\u02c1\113\0"+
+    "\1\u02c1\117\0\1\u0393\123\0\1\u0205\116\0\1\u0394\144\0"+
+    "\1\u0395\72\0\1\u0396\114\0\1\u0397\155\0\1\u0205\26\0"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u0398\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\12\10\1\u028c"+
+    "\3\10\1\u0399\2\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\3\10\1\u039a\2\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\5\10\1\u039b\13\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\10\1\u0100\15\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\1\u039c\1\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\11\10\1\u039d\5\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\1\u02e0\20\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\3\10\1\250\1\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\u039e\16\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u039f\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u03a0\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\4\10\1\u03a1\12\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u03a2\4\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u03a3\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u036f\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\4\10\1\u036f\12\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u03a4\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\4\10\1\u032b\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\u03a5\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u03a6\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\u03a7\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\1\0\1\u03a8\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\1\u03a9\1\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\3\10\1\u0249\1\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\4\10\1\u0330\1\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u03aa\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\3\10\1\u03ab\1\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\3\10"+
+    "\1\u03ac\2\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\2\10\1\u03ad\3\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\u03ae\5\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\4\10\1\u03af\1\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\3\10\1\u03b0\1\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\1\10\1\u03b1\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\13\10\1\u03b2\3\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\4\10\1\u03b3\12\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u03b4\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u03b5\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\1\u03b6\1\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u03b7\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u03b8\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u0282\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\36\0\1\u03b9\61\0"+
+    "\1\7\6\10\1\0\1\u012f\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u03ba\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u03bb\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\7\10\1\u03bc\7\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\1\10"+
+    "\1\u03bd\4\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\3\10\1\u03be\1\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\4\10\1\u03bf\1\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\u03c0\16\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u025c\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\6\10\1\u0376\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\4\10\1\u03c1"+
+    "\12\10\2\0\1\7\21\10\65\0\1\u03c2\61\0\1\u03c3"+
+    "\125\0\1\u03c4\115\0\1\u03c5\121\0\1\u03c6\62\0\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\2\10\1\u03c7"+
+    "\14\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u03c8\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\1\u03c9"+
+    "\1\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u03ca\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\2\10\1\u03cb\14\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\u03cc\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\10\1\u0171\15\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\3\10\1\u03cd"+
+    "\13\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\u03ce\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u03cf"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\7\10\1\u03d0\7\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u03d1\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u02bf\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\4\10\1\u03d2\1\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\u03d3\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\3\10\1\u03d4\13\10\2\0\1\7\21\10"+
+    "\102\0\1\u03d5\2\0\1\u03d6\12\0\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\4\10\1\371\12\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\4\10\1\u03d7\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\4\10\1\u03d8\1\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u03d9\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\2\10\1\u036f"+
+    "\14\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\u03da\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u03db"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\4\10"+
+    "\1\u03dc\1\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\4\10\1\u03dd\1\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\u03de\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u03df\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u036c\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u03e0\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\6\10\1\u03e1\10\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\2\10\1\u03e2\14\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\2\10\1\u03e3\14\10\2\0\1\7\21\10"+
+    "\33\0\1\u03e4\64\0\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\5\10\1\u03e5\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u036f\4\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u0332\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\1\10\1\u03e6"+
+    "\4\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\2\10\1\u03e7\2\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\2\10\1\u03e8\14\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u03bf\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\u03e9\16\10\2\0\1\7"+
+    "\21\10\56\0\1\u03ea\76\0\1\u03eb\121\0\1\u03c6\116\0"+
+    "\1\u0205\140\0\1\u0205\40\0\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u03ec\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\4\10\1\u03ed"+
+    "\1\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u01e7\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\5\10\1\u03ee\13\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\2\10\1\u03ef\3\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\17\10\1\u03f0"+
+    "\1\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u03f1"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u0328\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\3\10\1\u03f2\13\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\6\10"+
+    "\1\u03f3\10\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\u03f4\16\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u03f5"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\u03ad\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\3\10\1\u03f6\13\10\2\0\1\7\21\10\10\0"+
+    "\1\u03f7\122\0\1\u03f8\104\0\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\4\10\1\u03f9\1\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\10\1\u03fa\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\3\10\1\u03fb\2\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\1\10\1\u03fc\15\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\7\10\1\u03fd\11\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\1\10\1\u03fe\15\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\2\10"+
+    "\1\u03ff\3\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\7\10\1\u03e5"+
+    "\7\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u0400\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u0401\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u0402\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\2\10\1\u0403\7\10\1\u0404\6\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\1\10\1\u0405\3\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\35\0\1\u0406\62\0"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\2\10\1\u0407\3\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u0408\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\10\1\u0409\15\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\4\10\1\u040a\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\6\10\1\u040b\10\10\2\0\1\7\21\10"+
+    "\61\0\1\u02c1\71\0\1\u035c\64\0\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\5\10\1\u040c\11\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\u03ce\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u040d\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\5\10\1\u0100\11\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\1\10\1\u040e\15\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u040f\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\1\u0410\5\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u0411\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u0412\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u0413\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\1\10\1\u0414\15\10\2\0\1\7\21\10\14\0"+
+    "\1\u0415\166\0\1\u0416\34\0\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\2\10\1\u0417\3\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\11\10\1\u02bf\5\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\13\10\1\u0249\3\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u03e8\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\u0418\16\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\u0419\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\2\10\1\u041a\16\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\5\10\1\u03e8\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\2\10\1\u041b"+
+    "\14\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\1\10\1\u041c\15\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\4\10\1\u041d"+
+    "\1\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\3\10\1\u041e\13\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\6\10\1\u041f\10\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\1\u0332\1\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\14\10\1\u0420\2\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\u0421\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\201\4\10\14\0\5\10\1\u0369\11\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u027f\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\12\10\1\u028c\6\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\u0422\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\1\10\1\u0423\15\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\u0424\5\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\6\10\1\u0425\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\5\10\1\u0410\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\2\10\1\u02bf\14\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\6\10"+
+    "\1\u0426\10\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u033c\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\40\0\1\u0427\140\0\1\u0428\36\0\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\7\10\1\u0429"+
+    "\7\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\1\10\1\u042a\4\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\1\u042b"+
+    "\1\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\4\10\1\u042c\1\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\3\10\1\u0342\15\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\10\1\u041b\4\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u042d\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u042e"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\1\u042f\1\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\3\10\1\u0430\15\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\1\u0412\1\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\u0431\5\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\16\10\1\u0100"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\14\10\1\u0432\2\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u027b\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\u025c\5\10\14\0\17\10\2\0\1\7"+
+    "\21\10\35\0\1\u0433\140\0\1\u0434\41\0\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\2\10\1\u0435\3\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\2\10\1\u0436\3\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\2\10"+
+    "\1\u0437\14\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\3\10\1\u0438\2\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\5\10"+
+    "\1\u0439\14\0\17\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\1\10\1\u043a\4\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\6\10\14\0\16\10\1\u02bf\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\6\10\1\u043b"+
+    "\10\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\6\10\1\u043c\10\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\17\10\2\0\1\7\16\10\1\u0399\2\10\33\0\1\u0406"+
+    "\143\0\1\u043d\40\0\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\1\u019d\1\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\6\10\14\0\17\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\3\10\1\u043e\2\10\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u036f\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\5\10\1\u043f\14\0"+
+    "\17\10\2\0\1\7\21\10\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\5\10\1\u0440\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\3\10\1\u0441\2\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\1\u036c"+
+    "\20\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\3\10\1\u0442"+
+    "\2\10\14\0\17\10\2\0\1\7\21\10\35\0\1\u0443"+
+    "\62\0\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\6\10\14\0"+
+    "\2\10\1\u0444\14\10\2\0\1\7\21\10\1\7\6\10"+
+    "\1\0\1\10\1\135\1\0\2\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\5\10\1\u0445\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\16\10\1\u0446\2\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\1\u0447\5\10\14\0\17\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\4\10\1\u0448\1\10\14\0\17\10\2\0\1\7\21\10"+
+    "\5\0\1\u0449\112\0\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\1\10\1\u0303"+
+    "\3\10\2\0\6\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\17\10"+
+    "\2\0\1\7\2\10\1\u044a\16\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\2\10\1\u044b\3\10\14\0\17\10\2\0"+
+    "\1\7\21\10\1\7\6\10\1\0\1\10\1\135\1\0"+
+    "\2\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\6\10\1\u044c\10\10\2\0\1\7\21\10\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\6\10\1\u044d"+
+    "\10\10\2\0\1\7\21\10\37\0\1\u044e\60\0\1\7"+
+    "\6\10\1\0\1\10\1\135\1\0\2\10\1\0\1\7"+
+    "\1\10\4\0\5\10\2\0\6\10\14\0\1\u044f\16\10"+
+    "\2\0\1\7\21\10\1\7\6\10\1\0\1\10\1\135"+
+    "\1\0\2\10\1\0\1\7\1\10\4\0\5\10\2\0"+
+    "\1\10\1\u0450\4\10\14\0\17\10\2\0\1\7\21\10"+
+    "\1\7\6\10\1\0\1\10\1\135\1\0\2\10\1\0"+
+    "\1\7\1\10\4\0\5\10\2\0\6\10\14\0\1\10"+
+    "\1\u0451\15\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\1\u0452"+
+    "\20\10\56\0\1\u0453\41\0\1\7\6\10\1\0\1\10"+
+    "\1\135\1\0\2\10\1\0\1\7\1\10\4\0\5\10"+
+    "\2\0\3\10\1\u0454\2\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\5\10\1\u029f"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\1\u036f\1\10\1\0\1\7\1\10"+
+    "\4\0\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+    "\21\10\1\7\6\10\1\0\1\10\1\135\1\0\2\10"+
+    "\1\0\1\7\1\10\4\0\5\10\2\0\2\10\1\u0455"+
+    "\3\10\14\0\17\10\2\0\1\7\21\10\61\0\1\u0456"+
+    "\36\0\1\7\6\10\1\0\1\10\1\135\1\0\1\u0215"+
+    "\1\10\1\0\1\7\1\10\4\0\5\10\2\0\6\10"+
+    "\14\0\17\10\2\0\1\7\21\10\1\7\6\10\1\0"+
+    "\1\10\1\135\1\0\2\10\1\0\1\7\1\10\4\0"+
+    "\5\10\2\0\1\10\1\u02bf\4\10\14\0\17\10\2\0"+
+    "\1\7\21\10\73\0\1\u0406\24\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[85600];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\3\0\2\1\1\0\12\1\2\11\20\1\2\11\4\1"+
+    "\1\11\31\1\1\11\5\1\1\11\13\1\1\11\3\1"+
+    "\1\11\1\1\2\11\16\1\1\0\1\1\1\0\6\1"+
+    "\2\0\43\1\2\0\70\1\1\11\4\0\1\11\4\0"+
+    "\1\11\16\0\1\11\1\0\1\1\2\0\2\11\2\1"+
+    "\1\0\4\1\2\11\3\1\1\0\2\1\1\11\5\1"+
+    "\1\11\152\1\33\0\1\11\2\0\1\11\2\1\1\11"+
+    "\1\1\1\0\4\1\1\11\126\1\2\0\1\1\2\0"+
+    "\1\1\15\0\1\11\11\0\1\11\3\1\1\0\112\1"+
+    "\34\0\3\1\1\0\103\1\24\0\57\1\1\0\15\1"+
+    "\5\0\1\1\4\0\54\1\1\0\13\1\11\0\52\1"+
+    "\1\0\13\1\5\0\20\1\1\0\20\1\1\0\10\1"+
+    "\5\0\16\1\2\0\15\1\1\0\5\1\2\0\13\1"+
+    "\2\0\15\1\1\11\16\1\2\0\20\1\2\0\12\1"+
+    "\2\0\10\1\1\0\5\1\1\0\5\1\1\0\4\1"+
+    "\1\0\4\1\1\0\2\1\1\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1110];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public GroovyTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = MULTILINE_STRING_DOUBLE;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = MULTILINE_STRING_SINGLE;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='['
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public GroovyTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public GroovyTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 188) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 20: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 46: break;
+        case 3: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 47: break;
+        case 42: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 48: break;
+        case 6: 
+          { start = zzMarkedPos-1; yybegin(STRING_DOUBLE);
+          }
+        case 49: break;
+        case 35: 
+          { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE);
+          }
+        case 50: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+          }
+        case 51: break;
+        case 34: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 52: break;
+        case 21: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 53: break;
+        case 5: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 54: break;
+        case 11: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 55: break;
+        case 28: 
+          { addToken(Token.FUNCTION);
+          }
+        case 56: break;
+        case 33: 
+          { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_SINGLE);
+          }
+        case 57: break;
+        case 2: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 58: break;
+        case 36: 
+          { boolean highlightedAsRegex = false;
+				if (zzBuffer[zzStartRead]=='~' || firstToken==null) {
+					addToken(Token.REGEX);
+					highlightedAsRegex = true;
+				}
+				else {
+					// If this is *likely* to be a regex, based on
+					// the previous token, highlight it as such.
+					Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+					if (regexCanFollow(t)) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+				}
+				// If it doesn't *appear* to be a regex, highlight it as
+				// individual tokens.
+				if (!highlightedAsRegex) {
+					int temp = zzStartRead + 1;
+					addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+					zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+				}
+          }
+        case 59: break;
+        case 25: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 60: break;
+        case 40: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_CHAR);
+          }
+        case 61: break;
+        case 45: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 62: break;
+        case 31: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos;
+          }
+        case 63: break;
+        case 44: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 64: break;
+        case 14: 
+          { /* Skip escaped chars, handles case: '\"""'. */
+          }
+        case 65: break;
+        case 24: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 66: break;
+        case 18: 
+          { /* Skip escaped chars. */
+          }
+        case 67: break;
+        case 39: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 68: break;
+        case 23: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 69: break;
+        case 26: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 70: break;
+        case 8: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 71: break;
+        case 30: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+          }
+        case 72: break;
+        case 38: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 73: break;
+        case 29: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 74: break;
+        case 4: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 75: break;
+        case 32: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 76: break;
+        case 19: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 77: break;
+        case 16: 
+          { /* Skip escaped chars, handles case: "\'''". */
+          }
+        case 78: break;
+        case 37: 
+          { start = zzMarkedPos-3; yybegin(DOCCOMMENT);
+          }
+        case 79: break;
+        case 27: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 80: break;
+        case 43: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 81: break;
+        case 10: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 82: break;
+        case 7: 
+          { addNullToken(); return firstToken;
+          }
+        case 83: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 84: break;
+        case 9: 
+          { addToken(Token.OPERATOR);
+          }
+        case 85: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 86: break;
+        case 22: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 87: break;
+        case 41: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 88: break;
+        case 1: 
+          { 
+          }
+        case 89: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 90: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case MULTILINE_STRING_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 1111: break;
+            case DOCCOMMENT: {
+              yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+            }
+            case 1112: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 1113: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 1114: break;
+            case STRING_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken;
+            }
+            case 1115: break;
+            case MULTILINE_STRING_SINGLE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 1116: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex	(revision 25584)
@@ -0,0 +1,924 @@
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated HTMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+%%
+
+%public
+%class HTMLTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -7;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public HTMLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		//### zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace			= ([ \t\f]+)
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+AmperItem				= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'/=>]+)
+EndScriptTag			= ("</" [sS][cC][rR][iI][pP][tT] ">")
+
+
+// JavaScript stuff.
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin				= "/*"
+JS_MLCEnd					= "*/"
+JS_LineCommentBegin			= "//"
+JS_IntegerHelper1			= (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2			= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral			= ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral				= ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1			= ([fFdD]?)
+JS_FloatHelper2			= ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1			= ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2			= ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3			= ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral			= ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat		= (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator				= ([\(\)\{\}\[\]\]])
+JS_Separator2				= ([\;,.])
+JS_NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator		= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator				= ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier			= ({NonSeparator}+)
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({Letter}|"_"|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state JAVASCRIPT
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	"<"[sS][cC][rR][iI][pP][tT]	{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+								}
+	"<!"						{ start = zzMarkedPos-2; yybegin(DTD); }
+	"<?"						{ start = zzMarkedPos-2; yybegin(PI); }
+	"<"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"</"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+	{Identifier}				{ addToken(Token.IDENTIFIER); } // Catches everything.
+	{AmperItem}				{ addToken(Token.DATA_TYPE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	"-->"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); }
+	"-"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
+	"?>"						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
+	"?"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+	[Aa] |
+	[aA][bB][bB][rR] |
+	[aA][cC][rR][oO][nN][yY][mM] |
+	[aA][dD][dD][rR][eE][sS][sS] |
+	[aA][pP][pP][lL][eE][tT] |
+	[aA][rR][eE][aA] |
+	[aA][rR][tT][iI][cC][lL][eE] |
+	[aA][sS][iI][dD][eE] |
+	[aA][uU][dD][iI][oO] |
+	[bB] |
+	[bB][aA][sS][eE] |
+	[bB][aA][sS][eE][fF][oO][nN][tT] |
+	[bB][dD][oO] |
+	[bB][gG][sS][oO][uU][nN][dD] |
+	[bB][iI][gG] |
+	[bB][lL][iI][nN][kK] |
+	[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+	[bB][oO][dD][yY] |
+	[bB][rR] |
+	[bB][uU][tT][tT][oO][nN] |
+	[cC][aA][nN][vV][aA][sS] |
+	[cC][aA][pP][tT][iI][oO][nN] |
+	[cC][eE][nN][tT][eE][rR] |
+	[cC][iI][tT][eE] |
+	[cC][oO][dD][eE] |
+	[cC][oO][lL] |
+	[cC][oO][lL][gG][rR][oO][uU][pP] |
+	[cC][oO][mM][mM][aA][nN][dD] |
+	[cC][oO][mM][mM][eE][nN][tT] |
+	[dD][dD] |
+	[dD][aA][tT][aA][gG][rR][iI][dD] |
+	[dD][aA][tT][aA][lL][iI][sS][tT] |
+	[dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+	[dD][eE][lL] |
+	[dD][eE][tT][aA][iI][lL][sS] |
+	[dD][fF][nN] |
+	[dD][iI][aA][lL][oO][gG] |
+	[dD][iI][rR] |
+	[dD][iI][vV] |
+	[dD][lL] |
+	[dD][tT] |
+	[eE][mM] |
+	[eE][mM][bB][eE][dD] |
+	[eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+	[fF][iI][eE][lL][dD][sS][eE][tT] |
+	[fF][iI][gG][uU][rR][eE] |
+	[fF][oO][nN][tT] |
+	[fF][oO][oO][tT][eE][rR] |
+	[fF][oO][rR][mM] |
+	[fF][rR][aA][mM][eE] |
+	[fF][rR][aA][mM][eE][sS][eE][tT] |
+	[hH][123456] |
+	[hH][eE][aA][dD] |
+	[hH][eE][aA][dD][eE][rR] |
+	[hH][rR] |
+	[hH][tT][mM][lL] |
+	[iI] |
+	[iI][fF][rR][aA][mM][eE] |
+	[iI][lL][aA][yY][eE][rR] |
+	[iI][mM][gG] |
+	[iI][nN][pP][uU][tT] |
+	[iI][nN][sS] |
+	[iI][sS][iI][nN][dD][eE][xX] |
+	[kK][bB][dD] |
+	[kK][eE][yY][gG][eE][nN] |
+	[lL][aA][bB][eE][lL] |
+	[lL][aA][yY][eE][rR] |
+	[lL][eE][gG][eE][nN][dD] |
+	[lL][iI] |
+	[lL][iI][nN][kK] |
+	[mM][aA][pP] |
+	[mM][aA][rR][kK] |
+	[mM][aA][rR][qQ][uU][eE][eE] |
+	[mM][eE][nN][uU] |
+	[mM][eE][tT][aA] |
+	[mM][eE][tT][eE][rR] |
+	[mM][uU][lL][tT][iI][cC][oO][lL] |
+	[nN][aA][vV] |
+	[nN][eE][sS][tT] |
+	[nN][oO][bB][rR] |
+	[nN][oO][eE][mM][bB][eE][dD] |
+	[nN][oO][fF][rR][aA][mM][eE][sS] |
+	[nN][oO][lL][aA][yY][eE][rR] |
+	[nN][oO][sS][cC][rR][iI][pP][tT] |
+	[oO][bB][jJ][eE][cC][tT] |
+	[oO][lL] |
+	[oO][pP][tT][gG][rR][oO][uU][pP] |
+	[oO][pP][tT][iI][oO][nN] |
+	[oO][uU][tT][pP][uU][tT] |
+	[pP] |
+	[pP][aA][rR][aA][mM] |
+	[pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+	[pP][rR][eE] |
+	[pP][rR][oO][gG][rR][eE][sS][sS] |
+	[qQ] |
+	[rR][uU][lL][eE] |
+	[sS] |
+	[sS][aA][mM][pP] |
+	[sS][cC][rR][iI][pP][tT] |
+	[sS][eE][cC][tT][iI][oO][nN] |
+	[sS][eE][lL][eE][cC][tT] |
+	[sS][eE][rR][vV][eE][rR] |
+	[sS][mM][aA][lL][lL] |
+	[sS][oO][uU][rR][cC][eE] |
+	[sS][pP][aA][cC][eE][rR] |
+	[sS][pP][aA][nN] |
+	[sS][tT][rR][iI][kK][eE] |
+	[sS][tT][rR][oO][nN][gG] |
+	[sS][tT][yY][lL][eE] |
+	[sS][uU][bB] |
+	[sS][uU][pP] |
+	[tT][aA][bB][lL][eE] |
+	[tT][bB][oO][dD][yY] |
+	[tT][dD] |
+	[tT][eE][xX][tT][aA][rR][eE][aA] |
+	[tT][fF][oO][oO][tT] |
+	[tT][hH] |
+	[tT][hH][eE][aA][dD] |
+	[tT][iI][mM][eE] |
+	[tT][iI][tT][lL][eE] |
+	[tT][rR] |
+	[tT][tT] |
+	[uU] |
+	[uU][lL] |
+	[vV][aA][rR] |
+	[vV][iI][dD][eE][oO]    { addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+	.						{ /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+	{EndScriptTag}				{
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	// ECMA keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"return" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract"					{ addToken(Token.RESERVED_WORD); }
+	"boolean"						{ addToken(Token.DATA_TYPE); }
+	"byte"						{ addToken(Token.DATA_TYPE); }
+	"case"						{ addToken(Token.RESERVED_WORD); }
+	"catch"						{ addToken(Token.RESERVED_WORD); }
+	"char"						{ addToken(Token.DATA_TYPE); }
+	"class"						{ addToken(Token.RESERVED_WORD); }
+	"const"						{ addToken(Token.RESERVED_WORD); }
+	"debugger"					{ addToken(Token.RESERVED_WORD); }
+	"default"						{ addToken(Token.RESERVED_WORD); }
+	"do"							{ addToken(Token.RESERVED_WORD); }
+	"double"						{ addToken(Token.DATA_TYPE); }
+	"enum"						{ addToken(Token.RESERVED_WORD); }
+	"export"						{ addToken(Token.RESERVED_WORD); }
+	"extends"						{ addToken(Token.RESERVED_WORD); }
+	"final"						{ addToken(Token.RESERVED_WORD); }
+	"finally"						{ addToken(Token.RESERVED_WORD); }
+	"float"						{ addToken(Token.DATA_TYPE); }
+	"goto"						{ addToken(Token.RESERVED_WORD); }
+	"implements"					{ addToken(Token.RESERVED_WORD); }
+	"import"						{ addToken(Token.RESERVED_WORD); }
+	"instanceof"					{ addToken(Token.RESERVED_WORD); }
+	"int"						{ addToken(Token.DATA_TYPE); }
+	"interface"					{ addToken(Token.RESERVED_WORD); }
+	"long"						{ addToken(Token.DATA_TYPE); }
+	"native"						{ addToken(Token.RESERVED_WORD); }
+	"package"						{ addToken(Token.RESERVED_WORD); }
+	"private"						{ addToken(Token.RESERVED_WORD); }
+	"protected"					{ addToken(Token.RESERVED_WORD); }
+	"public"						{ addToken(Token.RESERVED_WORD); }
+	"short"						{ addToken(Token.DATA_TYPE); }
+	"static"						{ addToken(Token.RESERVED_WORD); }
+	"super"						{ addToken(Token.RESERVED_WORD); }
+	"switch"						{ addToken(Token.RESERVED_WORD); }
+	"synchronized"					{ addToken(Token.RESERVED_WORD); }
+	"throw"						{ addToken(Token.RESERVED_WORD); }
+	"throws"						{ addToken(Token.RESERVED_WORD); }
+	"transient"					{ addToken(Token.RESERVED_WORD); }
+	"try"						{ addToken(Token.RESERVED_WORD); }
+	"volatile"					{ addToken(Token.RESERVED_WORD); }
+	"null"						{ addToken(Token.RESERVED_WORD); }
+
+	// Literals.
+	"false" |
+	"true"						{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf<\n\*]+			{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+	{JS_MLCEnd}				{ yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+<JS_EOL_COMMENT> {
+	[^hwf<\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex.orig
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex.orig	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex.orig	(revision 25584)
@@ -0,0 +1,918 @@
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated HTMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+%%
+
+%public
+%class HTMLTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -7;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public HTMLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace			= ([ \t\f]+)
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+AmperItem				= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'/=>]+)
+EndScriptTag			= ("</" [sS][cC][rR][iI][pP][tT] ">")
+
+
+// JavaScript stuff.
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin				= "/*"
+JS_MLCEnd					= "*/"
+JS_LineCommentBegin			= "//"
+JS_IntegerHelper1			= (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2			= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral			= ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral				= ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1			= ([fFdD]?)
+JS_FloatHelper2			= ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1			= ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2			= ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3			= ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral			= ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat		= (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator				= ([\(\)\{\}\[\]\]])
+JS_Separator2				= ([\;,.])
+JS_NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator		= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator				= ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier			= ({NonSeparator}+)
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({Letter}|"_"|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state JAVASCRIPT
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	"<"[sS][cC][rR][iI][pP][tT]	{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+								}
+	"<!"						{ start = zzMarkedPos-2; yybegin(DTD); }
+	"<?"						{ start = zzMarkedPos-2; yybegin(PI); }
+	"<"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"</"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+	{Identifier}				{ addToken(Token.IDENTIFIER); } // Catches everything.
+	{AmperItem}				{ addToken(Token.DATA_TYPE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	"-->"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); }
+	"-"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
+	"?>"						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
+	"?"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+	[Aa] |
+	[aA][bB][bB][rR] |
+	[aA][cC][rR][oO][nN][yY][mM] |
+	[aA][dD][dD][rR][eE][sS][sS] |
+	[aA][pP][pP][lL][eE][tT] |
+	[aA][rR][eE][aA] |
+	[aA][rR][tT][iI][cC][lL][eE] |
+	[aA][sS][iI][dD][eE] |
+	[aA][uU][dD][iI][oO] |
+	[bB] |
+	[bB][aA][sS][eE] |
+	[bB][aA][sS][eE][fF][oO][nN][tT] |
+	[bB][dD][oO] |
+	[bB][gG][sS][oO][uU][nN][dD] |
+	[bB][iI][gG] |
+	[bB][lL][iI][nN][kK] |
+	[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+	[bB][oO][dD][yY] |
+	[bB][rR] |
+	[bB][uU][tT][tT][oO][nN] |
+	[cC][aA][nN][vV][aA][sS] |
+	[cC][aA][pP][tT][iI][oO][nN] |
+	[cC][eE][nN][tT][eE][rR] |
+	[cC][iI][tT][eE] |
+	[cC][oO][dD][eE] |
+	[cC][oO][lL] |
+	[cC][oO][lL][gG][rR][oO][uU][pP] |
+	[cC][oO][mM][mM][aA][nN][dD] |
+	[cC][oO][mM][mM][eE][nN][tT] |
+	[dD][dD] |
+	[dD][aA][tT][aA][gG][rR][iI][dD] |
+	[dD][aA][tT][aA][lL][iI][sS][tT] |
+	[dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+	[dD][eE][lL] |
+	[dD][eE][tT][aA][iI][lL][sS] |
+	[dD][fF][nN] |
+	[dD][iI][aA][lL][oO][gG] |
+	[dD][iI][rR] |
+	[dD][iI][vV] |
+	[dD][lL] |
+	[dD][tT] |
+	[eE][mM] |
+	[eE][mM][bB][eE][dD] |
+	[eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+	[fF][iI][eE][lL][dD][sS][eE][tT] |
+	[fF][iI][gG][uU][rR][eE] |
+	[fF][oO][nN][tT] |
+	[fF][oO][oO][tT][eE][rR] |
+	[fF][oO][rR][mM] |
+	[fF][rR][aA][mM][eE] |
+	[fF][rR][aA][mM][eE][sS][eE][tT] |
+	[hH][123456] |
+	[hH][eE][aA][dD] |
+	[hH][eE][aA][dD][eE][rR] |
+	[hH][rR] |
+	[hH][tT][mM][lL] |
+	[iI] |
+	[iI][fF][rR][aA][mM][eE] |
+	[iI][lL][aA][yY][eE][rR] |
+	[iI][mM][gG] |
+	[iI][nN][pP][uU][tT] |
+	[iI][nN][sS] |
+	[iI][sS][iI][nN][dD][eE][xX] |
+	[kK][bB][dD] |
+	[kK][eE][yY][gG][eE][nN] |
+	[lL][aA][bB][eE][lL] |
+	[lL][aA][yY][eE][rR] |
+	[lL][eE][gG][eE][nN][dD] |
+	[lL][iI] |
+	[lL][iI][nN][kK] |
+	[mM][aA][pP] |
+	[mM][aA][rR][kK] |
+	[mM][aA][rR][qQ][uU][eE][eE] |
+	[mM][eE][nN][uU] |
+	[mM][eE][tT][aA] |
+	[mM][eE][tT][eE][rR] |
+	[mM][uU][lL][tT][iI][cC][oO][lL] |
+	[nN][aA][vV] |
+	[nN][eE][sS][tT] |
+	[nN][oO][bB][rR] |
+	[nN][oO][eE][mM][bB][eE][dD] |
+	[nN][oO][fF][rR][aA][mM][eE][sS] |
+	[nN][oO][lL][aA][yY][eE][rR] |
+	[nN][oO][sS][cC][rR][iI][pP][tT] |
+	[oO][bB][jJ][eE][cC][tT] |
+	[oO][lL] |
+	[oO][pP][tT][gG][rR][oO][uU][pP] |
+	[oO][pP][tT][iI][oO][nN] |
+	[oO][uU][tT][pP][uU][tT] |
+	[pP] |
+	[pP][aA][rR][aA][mM] |
+	[pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+	[pP][rR][eE] |
+	[pP][rR][oO][gG][rR][eE][sS][sS] |
+	[qQ] |
+	[rR][uU][lL][eE] |
+	[sS] |
+	[sS][aA][mM][pP] |
+	[sS][cC][rR][iI][pP][tT] |
+	[sS][eE][cC][tT][iI][oO][nN] |
+	[sS][eE][lL][eE][cC][tT] |
+	[sS][eE][rR][vV][eE][rR] |
+	[sS][mM][aA][lL][lL] |
+	[sS][oO][uU][rR][cC][eE] |
+	[sS][pP][aA][cC][eE][rR] |
+	[sS][pP][aA][nN] |
+	[sS][tT][rR][iI][kK][eE] |
+	[sS][tT][rR][oO][nN][gG] |
+	[sS][tT][yY][lL][eE] |
+	[sS][uU][bB] |
+	[sS][uU][pP] |
+	[tT][aA][bB][lL][eE] |
+	[tT][bB][oO][dD][yY] |
+	[tT][dD] |
+	[tT][eE][xX][tT][aA][rR][eE][aA] |
+	[tT][fF][oO][oO][tT] |
+	[tT][hH] |
+	[tT][hH][eE][aA][dD] |
+	[tT][iI][mM][eE] |
+	[tT][iI][tT][lL][eE] |
+	[tT][rR] |
+	[tT][tT] |
+	[uU] |
+	[uU][lL] |
+	[vV][aA][rR] |
+	[vV][iI][dD][eE][oO]    { addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+	.						{ /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+	{EndScriptTag}				{
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	// ECMA keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"return" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract"					{ addToken(Token.RESERVED_WORD); }
+	"boolean"						{ addToken(Token.DATA_TYPE); }
+	"byte"						{ addToken(Token.DATA_TYPE); }
+	"case"						{ addToken(Token.RESERVED_WORD); }
+	"catch"						{ addToken(Token.RESERVED_WORD); }
+	"char"						{ addToken(Token.DATA_TYPE); }
+	"class"						{ addToken(Token.RESERVED_WORD); }
+	"const"						{ addToken(Token.RESERVED_WORD); }
+	"debugger"					{ addToken(Token.RESERVED_WORD); }
+	"default"						{ addToken(Token.RESERVED_WORD); }
+	"do"							{ addToken(Token.RESERVED_WORD); }
+	"double"						{ addToken(Token.DATA_TYPE); }
+	"enum"						{ addToken(Token.RESERVED_WORD); }
+	"export"						{ addToken(Token.RESERVED_WORD); }
+	"extends"						{ addToken(Token.RESERVED_WORD); }
+	"final"						{ addToken(Token.RESERVED_WORD); }
+	"finally"						{ addToken(Token.RESERVED_WORD); }
+	"float"						{ addToken(Token.DATA_TYPE); }
+	"goto"						{ addToken(Token.RESERVED_WORD); }
+	"implements"					{ addToken(Token.RESERVED_WORD); }
+	"import"						{ addToken(Token.RESERVED_WORD); }
+	"instanceof"					{ addToken(Token.RESERVED_WORD); }
+	"int"						{ addToken(Token.DATA_TYPE); }
+	"interface"					{ addToken(Token.RESERVED_WORD); }
+	"long"						{ addToken(Token.DATA_TYPE); }
+	"native"						{ addToken(Token.RESERVED_WORD); }
+	"package"						{ addToken(Token.RESERVED_WORD); }
+	"private"						{ addToken(Token.RESERVED_WORD); }
+	"protected"					{ addToken(Token.RESERVED_WORD); }
+	"public"						{ addToken(Token.RESERVED_WORD); }
+	"short"						{ addToken(Token.DATA_TYPE); }
+	"static"						{ addToken(Token.RESERVED_WORD); }
+	"super"						{ addToken(Token.RESERVED_WORD); }
+	"switch"						{ addToken(Token.RESERVED_WORD); }
+	"synchronized"					{ addToken(Token.RESERVED_WORD); }
+	"throw"						{ addToken(Token.RESERVED_WORD); }
+	"throws"						{ addToken(Token.RESERVED_WORD); }
+	"transient"					{ addToken(Token.RESERVED_WORD); }
+	"try"						{ addToken(Token.RESERVED_WORD); }
+	"volatile"					{ addToken(Token.RESERVED_WORD); }
+	"null"						{ addToken(Token.RESERVED_WORD); }
+
+	// Literals.
+	"false" |
+	"true"						{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf<\n\*]+			{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+	{JS_MLCEnd}				{ yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+<JS_EOL_COMMENT> {
+	[^hwf<\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java	(revision 25584)
@@ -0,0 +1,2404 @@
+/* The following code was generated by JFlex 1.4.3 on 12/05/12 5:11 PM */
+
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated HTMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+
+public class HTMLTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+  private static final int ZZ_BUFFERSIZE = 16384;
+
+  /** lexical states */
+  public static final int JS_STRING = 24;
+  public static final int INTAG_CHECK_TAG_NAME = 10;
+  public static final int JS_MLC = 28;
+  public static final int INTAG_SCRIPT = 16;
+  public static final int JS_CHAR = 26;
+  public static final int JS_EOL_COMMENT = 30;
+  public static final int INATTR_DOUBLE_SCRIPT = 18;
+  public static final int INATTR_SINGLE_SCRIPT = 20;
+  public static final int DTD = 6;
+  public static final int INATTR_SINGLE = 14;
+  public static final int INATTR_DOUBLE = 12;
+  public static final int YYINITIAL = 0;
+  public static final int INTAG = 8;
+  public static final int COMMENT = 2;
+  public static final int JAVASCRIPT = 22;
+  public static final int PI = 4;
+
+  /**
+   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
+   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
+   *                  at the beginning of a line
+   * l is of the form l = 2*k, k a non negative integer
+   */
+  private static final int ZZ_LEXSTATE[] = { 
+     0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7, 
+     8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15
+  };
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\2\1\0\1\1\1\26\22\0\1\4\1\50\1\7"+
+    "\1\27\1\32\1\47\1\5\1\57\2\56\1\33\1\44\1\43\1\40"+
+    "\1\41\1\10\1\22\6\105\1\24\2\21\1\52\1\6\1\3\1\45"+
+    "\1\17\1\51\1\27\1\70\1\23\1\12\1\76\1\37\1\36\1\100"+
+    "\1\104\1\14\1\106\1\101\1\35\1\74\1\72\1\71\1\15\1\102"+
+    "\1\13\1\11\1\16\1\77\1\103\1\20\1\34\1\73\1\20\1\56"+
+    "\1\30\1\56\1\46\1\31\1\0\1\111\1\107\1\113\1\116\1\66"+
+    "\1\64\1\55\1\60\1\54\1\106\1\112\1\65\1\75\1\115\1\114"+
+    "\1\62\1\102\1\110\1\63\1\61\1\25\1\120\1\67\1\121\1\117"+
+    "\1\122\1\42\1\46\1\42\1\53\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\6\0\2\1\1\0\2\1\5\0\2\2\1\3\1\4"+
+    "\1\5\1\6\1\1\1\7\5\1\1\10\2\1\1\11"+
+    "\1\12\2\13\1\14\1\15\1\16\1\17\1\20\1\21"+
+    "\1\22\1\23\2\21\2\23\1\21\2\23\4\21\1\23"+
+    "\5\21\1\23\1\21\1\1\1\24\1\1\1\25\1\15"+
+    "\1\26\1\27\1\30\1\31\1\32\2\17\1\2\1\33"+
+    "\1\17\2\2\1\17\2\34\1\2\1\31\2\17\1\2"+
+    "\1\35\1\17\2\2\1\36\17\2\1\1\1\37\1\40"+
+    "\1\41\1\1\1\42\1\43\1\44\1\1\1\45\6\1"+
+    "\1\46\1\1\1\4\2\47\1\50\1\51\1\6\5\0"+
+    "\1\52\31\21\1\23\7\21\1\23\5\21\1\23\33\21"+
+    "\1\53\3\0\1\54\1\0\1\55\1\17\1\31\1\2"+
+    "\1\17\1\56\1\34\1\57\1\56\1\57\1\56\1\60"+
+    "\1\56\2\2\1\61\1\2\1\61\47\2\1\61\1\2"+
+    "\1\62\1\63\1\64\1\0\1\65\5\0\1\66\1\47"+
+    "\1\0\1\67\4\0\14\21\1\23\63\21\1\0\1\70"+
+    "\1\0\1\31\1\2\1\57\1\0\2\60\4\2\1\6"+
+    "\57\2\10\0\1\47\1\71\2\0\1\72\20\21\1\23"+
+    "\5\21\1\23\14\21\1\0\1\73\1\31\10\2\1\74"+
+    "\13\2\1\6\1\2\1\75\15\2\1\0\1\1\3\0"+
+    "\1\76\1\0\1\47\2\0\10\21\1\23\13\21\1\0"+
+    "\1\31\5\2\1\61\10\2\1\61\10\2\4\0\1\47"+
+    "\12\21\1\0\1\31\17\2\2\0\1\77\3\21\1\0"+
+    "\7\2\2\0\1\21\1\0\3\2\2\0\1\21\1\100"+
+    "\1\2\1\101\1\102";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[615];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+    "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u048a\0\u04dd"+
+    "\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722\0\u05d6"+
+    "\0\u0775\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u05d6\0\u0914\0\u0967"+
+    "\0\u05d6\0\u05d6\0\u09ba\0\u0a0d\0\u05d6\0\u0a60\0\u05d6\0\u05d6"+
+    "\0\u05d6\0\u0ab3\0\u05d6\0\u0b06\0\u0b59\0\u0bac\0\u0bff\0\u0c52"+
+    "\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e\0\u0df1\0\u0e44\0\u0e97\0\u0eea"+
+    "\0\u0f3d\0\u0f90\0\u0fe3\0\u1036\0\u1089\0\u0ab3\0\u10dc\0\u112f"+
+    "\0\u05d6\0\u1182\0\u05d6\0\u11d5\0\u05d6\0\u05d6\0\u05d6\0\u1228"+
+    "\0\u05d6\0\u127b\0\u12ce\0\u05d6\0\u05d6\0\u1321\0\u1374\0\u13c7"+
+    "\0\u141a\0\u146d\0\u14c0\0\u1513\0\u05d6\0\u1566\0\u15b9\0\u160c"+
+    "\0\u05d6\0\u165f\0\u16b2\0\u1705\0\u05d6\0\u1758\0\u17ab\0\u17fe"+
+    "\0\u1851\0\u18a4\0\u18f7\0\u194a\0\u199d\0\u19f0\0\u1a43\0\u1a96"+
+    "\0\u1ae9\0\u1b3c\0\u1b8f\0\u1be2\0\u1c35\0\u05d6\0\u05d6\0\u1c88"+
+    "\0\u1cdb\0\u05d6\0\u1c88\0\u05d6\0\u1d2e\0\u05d6\0\u1d81\0\u1dd4"+
+    "\0\u1e27\0\u1e7a\0\u1ecd\0\u1f20\0\u05d6\0\u1f73\0\u1fc6\0\u2019"+
+    "\0\u206c\0\u20bf\0\u05d6\0\u05d6\0\u2112\0\u2165\0\u21b8\0\u220b"+
+    "\0\u225e\0\u05d6\0\u22b1\0\u2304\0\u2357\0\u23aa\0\u23fd\0\u2450"+
+    "\0\u24a3\0\u24f6\0\u2549\0\u259c\0\u25ef\0\u2642\0\u2695\0\u26e8"+
+    "\0\u273b\0\u278e\0\u27e1\0\u2834\0\u2887\0\u28da\0\u292d\0\u2980"+
+    "\0\u29d3\0\u2a26\0\u2a79\0\u2acc\0\u2b1f\0\u2b72\0\u2bc5\0\u2c18"+
+    "\0\u2c6b\0\u2cbe\0\u2d11\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0"+
+    "\0\u2f03\0\u2f56\0\u2fa9\0\u2ffc\0\u304f\0\u30a2\0\u30f5\0\u3148"+
+    "\0\u319b\0\u31ee\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d\0\u33e0"+
+    "\0\u3433\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625\0\u3678"+
+    "\0\u36cb\0\u371e\0\u3771\0\u37c4\0\u3817\0\u05d6\0\u1566\0\u386a"+
+    "\0\u38bd\0\u05d6\0\u3910\0\u3963\0\u38bd\0\u39b6\0\u3a09\0\u3a5c"+
+    "\0\u3aaf\0\u3aaf\0\u3aaf\0\u3b02\0\u3b55\0\u3ba8\0\u3bfb\0\u3c4e"+
+    "\0\u3ca1\0\u3cf4\0\u1374\0\u3d47\0\u3d9a\0\u3ded\0\u3e40\0\u3e93"+
+    "\0\u3ee6\0\u3f39\0\u3f8c\0\u3fdf\0\u4032\0\u4085\0\u40d8\0\u412b"+
+    "\0\u417e\0\u41d1\0\u4224\0\u4277\0\u42ca\0\u431d\0\u4370\0\u43c3"+
+    "\0\u4416\0\u4469\0\u44bc\0\u450f\0\u4562\0\u45b5\0\u4608\0\u465b"+
+    "\0\u46ae\0\u4701\0\u4754\0\u47a7\0\u47fa\0\u484d\0\u48a0\0\u48f3"+
+    "\0\u4946\0\u4999\0\u49ec\0\u4a3f\0\u4a92\0\u4ae5\0\u05d6\0\u4b38"+
+    "\0\u4b8b\0\u4bde\0\u05d6\0\u4c31\0\u4c84\0\u4cd7\0\u4d2a\0\u4d7d"+
+    "\0\u1fc6\0\u4dd0\0\u4e23\0\u05d6\0\u4e76\0\u4ec9\0\u4f1c\0\u4f6f"+
+    "\0\u4fc2\0\u5015\0\u5068\0\u50bb\0\u510e\0\u5161\0\u51b4\0\u5207"+
+    "\0\u525a\0\u52ad\0\u5300\0\u5353\0\u53a6\0\u53f9\0\u544c\0\u549f"+
+    "\0\u54f2\0\u5545\0\u5598\0\u55eb\0\u563e\0\u5691\0\u56e4\0\u5737"+
+    "\0\u578a\0\u2d64\0\u57dd\0\u5830\0\u5883\0\u58d6\0\u5929\0\u597c"+
+    "\0\u59cf\0\u5a22\0\u5a75\0\u5ac8\0\u5b1b\0\u5b6e\0\u5bc1\0\u5c14"+
+    "\0\u5c67\0\u0d4b\0\u5cba\0\u5d0d\0\u5d60\0\u5db3\0\u5e06\0\u5e59"+
+    "\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u5ff8\0\u604b\0\u609e\0\u60f1"+
+    "\0\u6144\0\u6197\0\u61ea\0\u623d\0\u6290\0\u62e3\0\u6336\0\u6389"+
+    "\0\u63dc\0\u642f\0\u6482\0\u64d5\0\u6528\0\u657b\0\u65ce\0\u3aaf"+
+    "\0\u6621\0\u6674\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866"+
+    "\0\u68b9\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u6a58\0\u6aab\0\u6afe"+
+    "\0\u6b51\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u6d43\0\u6d96"+
+    "\0\u6de9\0\u6e3c\0\u6e8f\0\u6ee2\0\u6f35\0\u6f88\0\u6fdb\0\u702e"+
+    "\0\u7081\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273\0\u72c6"+
+    "\0\u7319\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b\0\u755e"+
+    "\0\u75b1\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3\0\u77f6"+
+    "\0\u7849\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u05d6\0\u7a3b"+
+    "\0\u7a8e\0\u7ae1\0\u7b34\0\u7b87\0\u7bda\0\u7c2d\0\u7c80\0\u7cd3"+
+    "\0\u7d26\0\u7d79\0\u7dcc\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b"+
+    "\0\u7fbe\0\u8011\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203"+
+    "\0\u5a22\0\u8256\0\u82a9\0\u82fc\0\u834f\0\u83a2\0\u2f56\0\u83f5"+
+    "\0\u8448\0\u849b\0\u84ee\0\u8541\0\u8594\0\u85e7\0\u05d6\0\u863a"+
+    "\0\u868d\0\u86e0\0\u8733\0\u8786\0\u87d9\0\u882c\0\u887f\0\u88d2"+
+    "\0\u1374\0\u8925\0\u8978\0\u89cb\0\u8a1e\0\u8a71\0\u8ac4\0\u8b17"+
+    "\0\u8b6a\0\u8bbd\0\u8c10\0\u8c63\0\u1374\0\u8cb6\0\u1374\0\u8d09"+
+    "\0\u8d5c\0\u8daf\0\u8e02\0\u8e55\0\u8ea8\0\u8efb\0\u8f4e\0\u8fa1"+
+    "\0\u8ff4\0\u9047\0\u909a\0\u90ed\0\u4b8b\0\u05d6\0\u9140\0\u9193"+
+    "\0\u91e6\0\u9239\0\u928c\0\u92df\0\u9332\0\u7ae1\0\u9385\0\u93d8"+
+    "\0\u942b\0\u947e\0\u94d1\0\u9524\0\u9577\0\u95ca\0\u961d\0\u961d"+
+    "\0\u9670\0\u96c3\0\u9716\0\u9769\0\u97bc\0\u980f\0\u9862\0\u98b5"+
+    "\0\u9908\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7\0\u9afa\0\u9b4d"+
+    "\0\u9ba0\0\u68b9\0\u9bf3\0\u9c46\0\u9c99\0\u9cec\0\u9d3f\0\u9d92"+
+    "\0\u9de5\0\u9e38\0\u9e8b\0\u9ede\0\u9f31\0\u9f84\0\u9fd7\0\ua02a"+
+    "\0\ua07d\0\ua0d0\0\ua123\0\ua176\0\ua1c9\0\u9239\0\ua21c\0\ua26f"+
+    "\0\ua2c2\0\ua315\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507"+
+    "\0\ua55a\0\ua5ad\0\ua600\0\ua653\0\ua6a6\0\ua6f9\0\ua74c\0\ua79f"+
+    "\0\ua7f2\0\ua845\0\ua898\0\ua8eb\0\ua93e\0\ua991\0\ua9e4\0\uaa37"+
+    "\0\uaa8a\0\uaadd\0\uab30\0\uab83\0\uabd6\0\u206c\0\uac29\0\uac7c"+
+    "\0\uaccf\0\uad22\0\uad75\0\uadc8\0\uae1b\0\uae6e\0\uaec1\0\uaf14"+
+    "\0\uaf67\0\uafba\0\ub00d\0\ub060\0\ub0b3\0\ub106\0\ub159\0\ub1ac"+
+    "\0\ub1ff\0\ub252\0\ub2a5\0\u05d6\0\ub2f8\0\u05d6\0\u05d6";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[615];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\21\1\22\1\23\1\24\1\25\1\26\115\21\2\27"+
+    "\1\30\35\27\1\31\17\27\1\32\3\27\1\33\2\27"+
+    "\1\34\33\27\2\35\1\36\46\35\1\37\51\35\2\40"+
+    "\1\41\14\40\1\42\103\40\1\43\1\44\1\0\1\43"+
+    "\1\25\2\43\1\45\1\46\6\43\1\47\25\43\1\50"+
+    "\11\43\1\51\43\43\2\52\1\0\1\52\1\53\2\52"+
+    "\2\53\1\54\1\55\1\56\1\57\1\60\1\61\1\53"+
+    "\3\52\1\62\1\52\1\63\7\52\1\64\1\65\1\66"+
+    "\5\52\1\53\6\52\1\57\2\52\1\53\1\67\1\61"+
+    "\1\60\1\54\1\65\1\64\1\66\1\52\1\70\1\71"+
+    "\1\72\1\52\2\73\1\74\1\63\1\52\1\75\1\76"+
+    "\1\77\1\67\2\52\1\62\1\56\1\70\1\75\1\55"+
+    "\1\71\1\72\1\74\1\52\1\77\2\52\7\100\1\101"+
+    "\113\100\57\102\1\101\43\102\1\43\1\44\1\0\1\43"+
+    "\1\25\2\43\1\103\1\104\6\43\1\105\25\43\1\50"+
+    "\11\43\1\106\43\43\7\100\1\107\113\100\57\102\1\107"+
+    "\43\102\1\110\1\25\1\111\1\112\1\25\1\113\1\114"+
+    "\1\115\1\116\3\117\1\120\2\117\1\121\1\117\1\122"+
+    "\1\123\1\117\1\122\1\124\1\125\2\110\2\117\1\126"+
+    "\4\117\1\127\1\130\1\131\1\114\1\132\4\126\3\50"+
+    "\1\133\1\134\1\131\1\135\1\117\1\136\1\137\1\140"+
+    "\1\141\1\142\1\143\1\144\2\117\1\145\12\117\1\122"+
+    "\1\117\1\146\1\147\1\150\1\117\1\151\1\117\1\152"+
+    "\1\153\1\117\1\154\2\117\2\155\1\156\4\155\1\157"+
+    "\20\155\1\160\72\155\2\161\1\162\25\161\1\163\26\161"+
+    "\1\164\43\161\2\165\1\166\1\167\27\165\1\170\24\165"+
+    "\1\171\3\165\1\172\2\165\1\173\33\165\2\174\1\175"+
+    "\1\176\54\174\1\171\3\174\1\172\2\174\1\173\33\174"+
+    "\2\21\4\0\116\21\1\22\2\0\1\25\1\0\115\21"+
+    "\133\0\1\177\1\200\5\201\1\0\6\201\6\0\4\201"+
+    "\10\0\1\202\1\203\2\0\2\201\2\0\3\201\1\200"+
+    "\37\201\1\0\1\25\2\0\1\25\116\0\4\26\1\0"+
+    "\1\26\1\204\114\26\2\27\1\0\35\27\1\0\17\27"+
+    "\1\0\3\27\1\0\2\27\1\0\33\27\40\0\1\205"+
+    "\143\0\1\206\115\0\1\207\4\0\1\210\130\0\1\211"+
+    "\33\0\2\35\1\0\46\35\1\0\51\35\17\0\1\212"+
+    "\103\0\2\40\1\0\14\40\1\0\103\40\2\43\1\0"+
+    "\1\43\1\0\2\43\2\0\6\43\1\0\25\43\1\0"+
+    "\11\43\1\0\44\43\1\44\1\0\1\43\1\25\2\43"+
+    "\2\0\6\43\1\0\25\43\1\0\11\43\1\0\43\43"+
+    "\17\0\1\47\103\0\2\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\45\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\52\1\213\2\52"+
+    "\1\214\1\215\1\0\5\52\1\216\11\52\1\217\5\52"+
+    "\1\0\11\52\1\0\1\52\1\215\1\214\3\52\1\217"+
+    "\1\52\1\220\1\221\2\52\2\222\1\52\1\216\11\52"+
+    "\1\220\1\52\1\213\1\221\10\52\1\0\1\52\1\0"+
+    "\2\52\2\0\3\52\1\223\2\52\1\0\17\52\1\224"+
+    "\5\52\1\0\6\52\1\223\2\52\1\0\6\52\1\224"+
+    "\1\52\1\225\1\226\17\52\1\225\2\52\1\226\10\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\5\52"+
+    "\1\227\17\52\1\0\11\52\1\0\17\52\1\227\25\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\230\5\52\1\0"+
+    "\15\52\1\231\1\232\6\52\1\0\11\52\1\0\3\52"+
+    "\1\230\1\232\1\231\4\52\1\233\1\52\2\234\17\52"+
+    "\1\233\7\52\1\0\1\52\1\0\2\52\2\0\2\52"+
+    "\1\235\3\52\1\0\15\52\1\236\7\52\1\0\11\52"+
+    "\1\0\5\52\1\236\2\52\1\237\17\52\1\235\1\237"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\2\52\1\76"+
+    "\1\240\1\52\1\76\1\0\3\52\1\241\12\52\1\242"+
+    "\1\243\5\52\1\0\6\52\1\240\2\52\1\0\1\244"+
+    "\1\76\2\52\1\242\1\52\1\243\1\52\1\245\5\52"+
+    "\1\76\5\52\1\244\2\52\1\241\1\76\1\245\4\52"+
+    "\1\76\6\52\1\0\1\52\1\0\2\52\2\0\2\52"+
+    "\1\76\1\234\2\52\1\0\5\52\1\246\7\52\1\247"+
+    "\7\52\1\0\6\52\1\234\1\250\1\52\1\0\5\52"+
+    "\1\247\2\52\1\251\1\252\4\52\1\253\1\246\1\250"+
+    "\7\52\1\76\1\251\2\52\1\252\1\52\1\253\6\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\15\52"+
+    "\1\76\7\52\1\0\11\52\1\0\5\52\1\76\37\52"+
+    "\1\0\1\52\1\0\2\52\2\0\3\52\1\254\2\52"+
+    "\1\0\17\52\1\255\5\52\1\0\6\52\1\254\2\52"+
+    "\1\0\6\52\1\255\1\52\1\256\20\52\1\256\13\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\257\1\260"+
+    "\2\52\1\0\25\52\1\0\6\52\1\260\2\52\1\0"+
+    "\11\52\1\261\16\52\1\257\3\52\1\261\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\262\5\52\1\263\14\52\1\263"+
+    "\4\52\1\0\1\52\1\0\2\52\2\0\2\52\1\76"+
+    "\2\52\1\264\1\0\17\52\1\265\5\52\1\0\11\52"+
+    "\1\0\1\52\1\264\4\52\1\265\16\52\1\76\2\52"+
+    "\1\76\14\52\1\0\1\52\1\0\2\52\2\0\1\266"+
+    "\1\267\1\270\1\52\1\271\1\52\1\0\3\52\1\272"+
+    "\1\52\1\273\17\52\1\0\11\52\1\0\2\52\1\271"+
+    "\1\266\12\52\1\274\1\273\7\52\1\272\1\270\2\52"+
+    "\1\267\2\52\1\274\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\275\1\52\1\0\3\52\1\276\1\52"+
+    "\1\277\7\52\1\76\7\52\1\0\11\52\1\0\2\52"+
+    "\1\275\2\52\1\76\11\52\1\277\7\52\1\276\15\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\17\52"+
+    "\1\300\5\52\1\0\11\52\1\0\6\52\1\300\1\52"+
+    "\1\301\1\302\17\52\1\301\2\52\1\302\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\5\52\1\303"+
+    "\11\52\1\304\5\52\1\0\11\52\1\0\6\52\1\304"+
+    "\1\52\1\305\6\52\1\303\11\52\1\305\13\52\1\0"+
+    "\1\52\1\0\2\52\2\0\3\52\1\306\1\52\1\76"+
+    "\1\0\15\52\1\76\1\307\1\310\5\52\1\0\6\52"+
+    "\1\306\2\52\1\0\1\52\1\76\2\52\1\307\1\76"+
+    "\1\310\1\52\1\311\5\52\1\76\12\52\1\311\4\52"+
+    "\1\76\6\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\3\52\1\312\13\52\1\313\5\52\1\0\11\52"+
+    "\1\0\6\52\1\313\20\52\1\312\15\52\1\0\1\52"+
+    "\1\0\2\52\2\0\3\52\1\314\2\52\1\0\25\52"+
+    "\1\0\6\52\1\314\2\52\1\0\10\52\1\315\20\52"+
+    "\1\315\11\52\7\100\1\0\113\100\57\102\1\0\43\102"+
+    "\17\0\1\316\103\0\1\110\10\0\6\110\1\0\6\110"+
+    "\1\0\4\110\1\0\4\110\14\0\2\110\2\0\43\110"+
+    "\3\0\1\317\4\0\1\320\34\0\1\50\62\0\1\50"+
+    "\37\0\1\50\55\0\10\321\1\322\17\321\1\323\2\321"+
+    "\1\324\11\321\1\325\55\321\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\327\5\117\17\0\1\330\25\0\1\50"+
+    "\55\0\1\331\10\0\6\331\1\0\1\331\2\122\1\331"+
+    "\1\122\1\331\1\0\4\331\1\0\1\331\1\332\1\333"+
+    "\1\334\1\0\1\335\12\0\2\331\2\0\4\331\1\333"+
+    "\1\332\1\334\7\331\1\333\6\331\1\122\10\331\1\333"+
+    "\5\331\10\0\6\331\1\0\1\331\1\336\1\337\1\331"+
+    "\1\337\1\331\1\0\4\331\1\0\1\340\1\332\1\333"+
+    "\1\334\1\0\1\335\12\0\2\331\2\0\4\331\1\333"+
+    "\1\332\1\334\7\331\1\333\6\331\1\337\10\331\1\333"+
+    "\2\331\1\340\1\331\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\341\5\117\45\0\1\50\115\0\1\50"+
+    "\4\0\1\50\76\0\2\335\1\0\1\335\60\0\1\335"+
+    "\61\0\2\50\55\0\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\3\117\1\342\1\343\10\117\1\344\17\117\1\345"+
+    "\5\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\34\117"+
+    "\1\346\6\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\347\27\117\1\350\6\117\1\351\3\117\1\110\10\0"+
+    "\6\117\1\0\5\117\1\352\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\30\117\1\353\1\354"+
+    "\11\117\1\110\10\0\6\117\1\0\5\117\1\355\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\356\1\357\5\117\1\360\27\117\1\361\3\117\1\110"+
+    "\10\0\6\117\1\0\5\117\1\362\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\1\363\1\117\2\0\5\117"+
+    "\1\364\23\117\1\365\2\117\1\366\6\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\34\117\1\367\6\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\3\117\1\370\1\117"+
+    "\1\371\27\117\1\372\2\117\1\373\1\374\1\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\1\375\1\117\2\0\1\376\42\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\31\117\1\377"+
+    "\11\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\30\117"+
+    "\1\u0100\3\117\1\u0101\2\117\1\u0102\3\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\6\117\1\u0103\34\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\27\117\1\u0104\13\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\u0105\4\117"+
+    "\1\u0106\23\117\1\u0107\2\117\1\u0108\6\117\1\110\10\0"+
+    "\6\117\1\0\5\117\1\u0109\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\6\117\1\u010a\22\117"+
+    "\1\u010b\11\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u010c\25\117\1\u010d\6\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\31\117\1\366\2\117\1\u010e\6\117"+
+    "\2\155\1\0\4\155\1\0\20\155\1\0\72\155\2\u010f"+
+    "\1\0\22\u010f\1\u0110\73\u010f\1\u0111\1\u010f\2\161\1\0"+
+    "\25\161\1\0\26\161\1\0\43\161\2\165\2\0\27\165"+
+    "\1\0\24\165\1\0\3\165\1\0\2\165\1\0\33\165"+
+    "\10\0\1\u0112\122\0\1\u0113\173\0\1\u0114\115\0\1\u0115"+
+    "\4\0\1\u0116\130\0\1\u0117\33\0\2\174\2\0\54\174"+
+    "\1\0\3\174\1\0\2\174\1\0\33\174\10\0\1\u0118"+
+    "\123\0\6\u0119\1\0\6\u0119\6\0\4\u0119\14\0\2\u0119"+
+    "\2\0\43\u0119\11\0\1\201\1\u011a\4\201\1\0\6\201"+
+    "\6\0\4\201\14\0\2\201\2\0\33\201\1\u011a\7\201"+
+    "\11\0\6\201\1\0\6\201\6\0\4\201\14\0\2\201"+
+    "\2\0\43\201\40\0\1\u011b\101\0\1\u011c\164\0\1\u011d"+
+    "\126\0\1\u011e\117\0\1\u011f\127\0\1\u0120\33\0\2\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\u0121\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\30\52\1\u0121\14\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\25\52"+
+    "\1\0\11\52\1\0\10\52\1\u0122\20\52\1\u0122\13\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\u0123\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\13\52\1\227\14\52"+
+    "\1\u0123\6\52\1\227\5\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\76\1\52\1\0\3\52\1\76\21\52"+
+    "\1\0\11\52\1\0\2\52\1\76\24\52\1\76\15\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\52\1\u0124\1\u0125"+
+    "\3\52\1\0\15\52\1\u0126\7\52\1\0\11\52\1\0"+
+    "\5\52\1\u0126\22\52\1\u0125\2\52\1\u0124\11\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\u0127\27\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\5\52\1\u0128\17\52\1\0"+
+    "\11\52\1\0\17\52\1\u0128\25\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\10\52\1\u0129\20\52\1\u0129\13\52\1\0\1\52\1\0"+
+    "\2\52\2\0\5\52\1\u012a\1\0\25\52\1\0\11\52"+
+    "\1\0\1\52\1\u012a\43\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\12\52"+
+    "\1\u012b\22\52\1\u012b\7\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\u0124\1\52\1\0\25\52\1\0\11\52"+
+    "\1\0\2\52\1\u0124\7\52\1\u012c\22\52\1\u012c\7\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\15\52"+
+    "\1\u012d\7\52\1\0\11\52\1\0\5\52\1\u012d\6\52"+
+    "\2\u012e\1\u012a\17\52\1\u012a\6\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\15\52\1\u012a\7\52\1\0"+
+    "\11\52\1\0\5\52\1\u012a\37\52\1\0\1\52\1\0"+
+    "\2\52\2\0\3\52\1\u012f\2\52\1\0\25\52\1\0"+
+    "\6\52\1\u012f\2\52\1\0\45\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\10\52\1\u0130\20\52\1\u0130\13\52\1\0\1\52\1\0"+
+    "\2\52\2\0\2\52\1\u0131\3\52\1\0\25\52\1\0"+
+    "\11\52\1\0\30\52\1\u0131\14\52\1\0\1\52\1\0"+
+    "\2\52\2\0\1\76\3\52\1\u0132\1\52\1\0\25\52"+
+    "\1\0\11\52\1\0\2\52\1\u0132\1\76\41\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\7\52\1\76\1\52\1\0\20\52\1\76\24\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\17\52\1\76"+
+    "\5\52\1\0\11\52\1\0\6\52\1\76\2\52\1\u0133"+
+    "\22\52\1\u0133\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u0134"+
+    "\20\52\1\u0134\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\2\52\1\u0135\3\52\1\0\25\52\1\0\11\52\1\0"+
+    "\30\52\1\u0135\14\52\1\0\1\52\1\0\2\52\2\0"+
+    "\5\52\1\227\1\0\25\52\1\0\11\52\1\0\1\52"+
+    "\1\227\12\52\2\u012a\27\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\11\52"+
+    "\1\252\22\52\1\252\10\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\11\52"+
+    "\1\u0136\22\52\1\u0136\10\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\14\52\1\u0137\10\52\1\0\11\52"+
+    "\1\0\41\52\1\u0137\3\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\17\52\1\u0138\5\52\1\0\11\52"+
+    "\1\0\6\52\1\u0138\36\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\3\52\1\227\21\52\1\0\11\52"+
+    "\1\0\27\52\1\227\15\52\1\0\1\52\1\0\2\52"+
+    "\2\0\5\52\1\u0139\1\0\25\52\1\0\11\52\1\0"+
+    "\1\52\1\u0139\43\52\1\0\1\52\1\0\2\52\2\0"+
+    "\3\52\1\u013a\2\52\1\0\25\52\1\0\6\52\1\u013a"+
+    "\2\52\1\0\11\52\1\u013b\22\52\1\u013b\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\u013c\5\52\1\0\25\52"+
+    "\1\0\11\52\1\0\3\52\1\u013c\41\52\1\0\1\52"+
+    "\1\0\2\52\2\0\1\u013d\5\52\1\0\25\52\1\0"+
+    "\11\52\1\0\3\52\1\u013d\41\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\16\52\1\u013e\17\52\1\u013e\6\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\11\52\1\76\22\52\1\76\10\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\12\52\1\u013f\22\52\1\u013f\7\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\7\52\1\u0140"+
+    "\1\52\1\0\20\52\1\u0140\24\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\3\52\1\u0141\21\52\1\0"+
+    "\11\52\1\0\13\52\1\u0142\13\52\1\u0141\7\52\1\u0142"+
+    "\5\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u0143\20\52\1\u0143"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0144\5\52\1\0\7\52\1\u0145\1\52\1\0"+
+    "\6\52\1\u0144\11\52\1\u0145\24\52\1\0\1\52\1\0"+
+    "\2\52\2\0\2\52\1\u0146\3\52\1\0\25\52\1\0"+
+    "\11\52\1\0\11\52\1\u012b\1\u0147\15\52\1\u0146\3\52"+
+    "\1\u012b\1\u0147\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\3\52\1\u0148\21\52\1\0\11\52\1\0"+
+    "\27\52\1\u0148\15\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u0149\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u0149\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\14\52\2\u014a"+
+    "\27\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u014b\20\52\1\u014b"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\3\52\1\u014c"+
+    "\2\52\1\0\25\52\1\0\6\52\1\u014c\2\52\1\0"+
+    "\45\52\1\0\1\52\1\0\2\52\2\0\2\52\1\u014d"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\u014d"+
+    "\14\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u014e"+
+    "\1\0\17\52\1\u014f\5\52\1\0\11\52\1\0\1\52"+
+    "\1\u014e\4\52\1\u014f\36\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\u0150\1\52\1\0\25\52\1\0\11\52"+
+    "\1\0\2\52\1\u0150\42\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\3\52\1\315\21\52\1\0\11\52"+
+    "\1\0\27\52\1\315\15\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u0151\17\52\1\u0151\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u0152\17\52\1\u0152\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\5\52\1\u0153\1\0\25\52\1\0\11\52\1\0"+
+    "\1\52\1\u0153\43\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\26\52\1\u0126"+
+    "\16\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u0154"+
+    "\1\0\25\52\1\0\11\52\1\0\1\52\1\u0154\43\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\u0147\5\52\1\0"+
+    "\25\52\1\0\11\52\1\0\3\52\1\u0147\41\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\23\52\1\76\14\52\1\76\4\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\u0155\5\52\1\0\3\52"+
+    "\1\315\11\52\1\231\1\u0156\1\u0157\5\52\1\0\11\52"+
+    "\1\0\3\52\1\u0155\1\u0156\1\231\1\u0157\20\52\1\315"+
+    "\15\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\15\52\1\u0158\7\52\1\0\11\52\1\0\5\52\1\u0158"+
+    "\37\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u0159"+
+    "\1\0\25\52\1\0\11\52\1\0\1\52\1\u0159\10\52"+
+    "\1\u015a\22\52\1\u015a\7\52\1\0\1\52\1\0\2\52"+
+    "\2\0\2\52\1\u015b\1\52\1\76\1\52\1\0\25\52"+
+    "\1\0\11\52\1\0\2\52\1\76\25\52\1\u015b\14\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\76\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\u015c\12\52"+
+    "\1\76\4\52\1\76\1\u015c\6\52\1\76\4\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\12\52\1\76\22\52\1\76\7\52\1\0"+
+    "\1\52\1\0\2\52\2\0\5\52\1\u015d\1\0\15\52"+
+    "\1\76\7\52\1\0\11\52\1\0\1\52\1\u015d\3\52"+
+    "\1\76\37\52\1\0\1\52\1\0\2\52\2\0\5\52"+
+    "\1\u015e\1\0\25\52\1\0\11\52\1\0\1\52\1\u015e"+
+    "\43\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\16\52\1\76\17\52\1\76"+
+    "\6\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\13\52\1\u015f\23\52\1\u015f"+
+    "\5\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\16\52\1\u0160\17\52\1\u0160"+
+    "\6\52\1\0\1\52\1\0\2\52\2\0\2\52\1\76"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\76"+
+    "\12\52\11\0\1\u0161\51\0\1\u0161\37\0\10\321\1\u0162"+
+    "\17\321\1\323\74\321\1\0\120\321\33\0\1\u0163\67\0"+
+    "\1\110\10\0\6\110\1\0\5\110\1\u0164\1\0\4\110"+
+    "\1\0\4\110\14\0\2\110\2\0\44\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\4\117\1\u0165\36\117\17\0\1\126"+
+    "\25\0\1\50\55\0\1\331\10\0\6\331\1\0\6\331"+
+    "\1\0\4\331\1\0\4\331\14\0\2\331\2\0\44\331"+
+    "\10\0\6\331\1\0\1\331\2\u0166\1\331\1\u0166\1\331"+
+    "\1\0\4\331\1\0\4\331\1\u0167\3\0\1\u0167\7\0"+
+    "\2\331\2\0\25\331\1\u0166\16\331\10\0\6\331\1\0"+
+    "\1\331\2\335\1\331\1\335\1\331\1\0\4\331\1\0"+
+    "\2\331\1\333\1\334\14\0\2\331\2\0\4\331\1\333"+
+    "\1\331\1\334\7\331\1\333\6\331\1\335\10\331\1\333"+
+    "\5\331\10\0\6\331\1\0\1\331\2\336\1\331\1\336"+
+    "\1\331\1\0\4\331\1\0\2\331\1\333\1\334\1\0"+
+    "\1\335\12\0\2\331\2\0\4\331\1\333\1\331\1\334"+
+    "\7\331\1\333\6\331\1\336\10\331\1\333\5\331\10\0"+
+    "\6\331\1\0\1\331\1\336\1\337\1\331\1\337\1\331"+
+    "\1\0\4\331\1\0\1\331\1\u0168\1\333\1\334\1\0"+
+    "\1\335\12\0\2\331\2\0\4\331\1\333\1\u0168\1\334"+
+    "\7\331\1\333\6\331\1\337\10\331\1\333\5\331\10\0"+
+    "\1\331\1\u0169\4\331\1\0\1\331\4\u0169\1\331\1\0"+
+    "\4\331\1\0\2\331\2\u0169\14\0\2\331\2\0\4\331"+
+    "\1\u0169\1\331\1\u0169\1\331\1\u0169\5\331\1\u0169\6\331"+
+    "\1\u0169\1\331\1\u0169\1\331\1\u0169\1\331\1\u0169\2\331"+
+    "\1\u0169\4\331\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u016a\34\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\2\117\1\u016b\1\117"+
+    "\14\0\2\117\2\0\12\117\1\u016c\30\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\2\117\1\u016d\40\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u016e\1\117"+
+    "\1\u016f\37\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0170\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u0171"+
+    "\1\117\2\0\30\117\1\u0172\12\117\1\110\10\0\6\117"+
+    "\1\0\5\117\1\u0173\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0174\5\117\1\343"+
+    "\3\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\2\117"+
+    "\1\u0175\40\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\27\117\1\u0176\13\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u0177"+
+    "\1\117\2\0\34\117\1\u0178\6\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\30\117\1\u0179\2\117\1\u017a\7\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\2\117\1\u017b"+
+    "\40\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\34\117"+
+    "\1\u017c\6\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\31\117\1\u017d\11\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u017e"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u017f\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\35\117\1\u0180\5\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\35\117\1\u0181\5\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\34\117\1\u0182\6\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\5\117\1\u0183\35\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\30\117\1\343"+
+    "\12\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u0184\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\33\117\1\u0185\7\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\3\117\1\u0186\37\117\1\110\10\0\6\117\1\0"+
+    "\5\117\1\u0187\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\43\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\31\117\1\u0188\11\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\1\117\1\u0189\1\u018a\40\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u018b\41\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\1\u018c\1\117\2\0\43\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\12\117\1\343"+
+    "\30\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\6\117"+
+    "\1\u018d\34\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\34\117\1\u018e\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\1\117\1\u018f\41\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\1\117\1\u0190\41\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\3\117\1\u0191\37\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0192\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u0193\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\117\1\u0194"+
+    "\1\117\1\u0186\37\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u0195\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\5\117\1\u0196\35\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\7\117\1\343\33\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\1\117\1\u0197\41\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\4\117\1\u0198\1\u0199"+
+    "\21\117\1\u019a\13\117\1\110\10\0\6\117\1\0\5\117"+
+    "\1\u019b\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u019c"+
+    "\1\117\2\0\5\117\1\u019d\35\117\12\0\1\u019e\6\0"+
+    "\4\u019e\11\0\2\u019e\24\0\1\u019e\1\0\1\u019e\1\0"+
+    "\1\u019e\5\0\1\u019e\6\0\1\u019e\1\0\1\u019e\1\0"+
+    "\1\u019e\1\0\1\u019e\2\0\1\u019e\16\0\1\u019f\6\0"+
+    "\4\u019f\11\0\2\u019f\24\0\1\u019f\1\0\1\u019f\1\0"+
+    "\1\u019f\5\0\1\u019f\6\0\1\u019f\1\0\1\u019f\1\0"+
+    "\1\u019f\1\0\1\u019f\2\0\1\u019f\15\0\1\u01a0\51\0"+
+    "\1\u01a0\120\0\1\u01a1\126\0\1\u01a2\117\0\1\u01a3\127\0"+
+    "\1\u01a4\44\0\1\u01a5\51\0\1\u01a5\50\0\2\201\1\u01a6"+
+    "\3\201\1\0\6\201\6\0\4\201\14\0\2\201\2\0"+
+    "\30\201\1\u01a6\12\201\40\0\1\u01a7\144\0\1\u01a8\126\0"+
+    "\1\u011f\106\0\1\u01a9\111\0\1\u01aa\61\0\2\52\1\0"+
+    "\1\52\1\0\2\52\2\0\3\52\1\u01ab\2\52\1\0"+
+    "\25\52\1\0\6\52\1\u01ab\2\52\1\0\45\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\52\1\u0142\4\52\1\0"+
+    "\25\52\1\0\11\52\1\0\12\52\1\76\20\52\1\u0142"+
+    "\1\52\1\76\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\3\52\1\u01ac\2\52\1\0\25\52\1\0\6\52\1\u01ac"+
+    "\2\52\1\0\11\52\1\u01ad\22\52\1\u01ad\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\5\52\1\u01ae\1\0\25\52"+
+    "\1\0\11\52\1\0\1\52\1\u01ae\43\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\25\52\1\0\11\52"+
+    "\1\0\23\52\1\u0142\14\52\1\u0142\4\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\17\52\1\u01af\5\52"+
+    "\1\0\11\52\1\0\6\52\1\u01af\36\52\1\0\1\52"+
+    "\1\0\2\52\2\0\4\52\1\76\1\52\1\0\25\52"+
+    "\1\0\11\52\1\0\2\52\1\76\42\52\1\0\1\52"+
+    "\1\0\2\52\2\0\2\52\1\u01b0\3\52\1\0\25\52"+
+    "\1\0\11\52\1\0\30\52\1\u01b0\14\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\15\52\1\u014a\7\52"+
+    "\1\0\11\52\1\0\5\52\1\u014a\37\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\17\52\1\76\5\52"+
+    "\1\0\11\52\1\0\6\52\1\76\36\52\1\0\1\52"+
+    "\1\0\2\52\2\0\5\52\1\u0142\1\0\25\52\1\0"+
+    "\11\52\1\0\1\52\1\u0142\43\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\23\52\1\u01b1\14\52\1\u01b1\4\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\7\52\1\u01b2"+
+    "\1\52\1\0\20\52\1\u01b2\24\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\14\52\2\u01b3\27\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\12\52\1\u01b4"+
+    "\22\52\1\u01b4\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\13\52\1\u0142"+
+    "\23\52\1\u0142\5\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u01b5"+
+    "\20\52\1\u01b5\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u0147\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u0147\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\7\52\1\u0152\1\52\1\0"+
+    "\20\52\1\u0152\24\52\1\0\1\52\1\0\2\52\2\0"+
+    "\3\52\1\u01b6\2\52\1\0\25\52\1\0\6\52\1\u01b6"+
+    "\2\52\1\0\45\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u0146"+
+    "\20\52\1\u0146\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\u0147"+
+    "\22\52\1\u0147\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\5\52\1\u01b7\1\0\25\52\1\0\11\52\1\0\1\52"+
+    "\1\u01b7\43\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\312\20\52"+
+    "\1\312\13\52\1\0\1\52\1\0\2\52\2\0\5\52"+
+    "\1\u01b8\1\0\25\52\1\0\11\52\1\0\1\52\1\u01b8"+
+    "\43\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u01b9"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u01b9"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\11\52\1\u01ba\22\52\1\u01ba"+
+    "\10\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u01bb\5\52\1\0\11\52\1\0\6\52\1\u01bb"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\13\52\1\76\23\52\1\76"+
+    "\5\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\21\52\1\76\10\52\1\76"+
+    "\12\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u01bc\5\52\1\0\11\52\1\0\6\52\1\u01bc"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u014a\5\52\1\0\11\52\1\0\6\52\1\u014a"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\315\5\52\1\0\11\52\1\0\6\52\1\315"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\14\52\2\u01bd\27\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\15\52\1\u01be"+
+    "\7\52\1\0\11\52\1\0\5\52\1\u01be\37\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\5\52\1\u01bf"+
+    "\17\52\1\0\11\52\1\0\17\52\1\u01bf\25\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\76\27\52\1\0\1\52\1\0"+
+    "\2\52\2\0\5\52\1\76\1\0\25\52\1\0\11\52"+
+    "\1\0\1\52\1\76\43\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\17\52\1\312\5\52\1\0\11\52"+
+    "\1\0\6\52\1\312\36\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\12\52"+
+    "\1\u01c0\22\52\1\u01c0\7\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u01c1\17\52\1\u01c1\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u012a\17\52\1\u012a\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\11\52"+
+    "\1\u01c2\22\52\1\u01c2\10\52\1\0\1\52\1\0\2\52"+
+    "\2\0\3\52\1\u01c3\2\52\1\0\25\52\1\0\6\52"+
+    "\1\u01c3\2\52\1\0\45\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\10\52"+
+    "\1\76\20\52\1\76\13\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\15\52\1\u01c4\7\52\1\0\11\52"+
+    "\1\0\5\52\1\u01c4\37\52\1\0\1\52\1\0\2\52"+
+    "\2\0\3\52\1\253\2\52\1\0\25\52\1\0\6\52"+
+    "\1\253\2\52\1\0\45\52\1\0\1\52\1\0\2\52"+
+    "\2\0\2\52\1\u01c5\3\52\1\0\25\52\1\0\11\52"+
+    "\1\0\30\52\1\u01c5\14\52\1\0\1\52\1\0\2\52"+
+    "\2\0\3\52\1\u01b8\2\52\1\0\25\52\1\0\6\52"+
+    "\1\u01b8\1\u01b2\1\52\1\0\20\52\1\u01b2\24\52\1\0"+
+    "\1\52\1\0\2\52\2\0\4\52\1\u0132\1\52\1\0"+
+    "\25\52\1\0\11\52\1\0\2\52\1\u0132\42\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\52\1\213\4\52\1\0"+
+    "\25\52\1\0\11\52\1\0\33\52\1\213\11\52\1\0"+
+    "\1\52\1\0\2\52\2\0\2\52\1\u01c6\3\52\1\0"+
+    "\25\52\1\0\11\52\1\0\30\52\1\u01c6\14\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\u01c7\27\52\1\0\1\52\1\0"+
+    "\2\52\2\0\5\52\1\u01c8\1\0\25\52\1\0\11\52"+
+    "\1\0\1\52\1\u01c8\43\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\17\52\1\315\5\52\1\0\11\52"+
+    "\1\0\6\52\1\315\1\52\1\76\20\52\1\76\13\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\5\52"+
+    "\1\76\17\52\1\0\11\52\1\0\17\52\1\76\25\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\25\52"+
+    "\1\0\11\52\1\0\21\52\1\76\1\u01c9\7\52\1\76"+
+    "\12\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\15\52\1\u01ca\7\52\1\0\11\52\1\0\5\52\1\u01ca"+
+    "\37\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u01cb\20\52\1\u01cb"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u01cc\20\52\1\u01cc"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\7\52\1\u01cd\1\52\1\0\20\52\1\u01cd"+
+    "\24\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\253\5\52\1\0\11\52\1\0\6\52\1\253"+
+    "\34\52\12\0\1\u01ce\100\0\1\u01ce\63\0\2\u0162\17\0"+
+    "\1\u0162\35\0\1\u01cf\112\0\1\110\10\0\1\110\1\u01d0"+
+    "\4\110\1\0\1\110\4\u01d0\1\110\1\0\4\110\1\0"+
+    "\2\110\2\u01d0\14\0\2\110\2\0\4\110\1\u01d0\1\110"+
+    "\1\u01d0\1\110\1\u01d0\5\110\1\u01d0\6\110\1\u01d0\1\110"+
+    "\1\u01d0\1\110\1\u01d0\1\110\1\u01d0\2\110\1\u01d0\5\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\1\u01d1\1\117\2\0\43\117\1\331"+
+    "\10\0\6\331\1\0\1\331\2\u0166\1\331\1\u0166\1\331"+
+    "\1\0\4\331\1\0\2\331\1\333\1\331\14\0\2\331"+
+    "\2\0\4\331\1\333\11\331\1\333\6\331\1\u0166\10\331"+
+    "\1\333\4\331\21\0\2\u0166\1\0\1\u0166\60\0\1\u0166"+
+    "\15\0\1\331\10\0\1\331\1\u0169\4\331\1\0\1\331"+
+    "\4\u0169\1\331\1\0\4\331\1\0\1\331\1\u0168\2\u0169"+
+    "\14\0\2\331\2\0\4\331\1\u0169\1\u0168\1\u0169\1\331"+
+    "\1\u0169\5\331\1\u0169\6\331\1\u0169\1\331\1\u0169\1\331"+
+    "\1\u0169\1\331\1\u0169\2\331\1\u0169\4\331\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\3\117\1\370\37\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\1\u01d2\1\117\2\0\43\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u01d3\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\5\117\1\u01d4"+
+    "\26\117\1\u01d5\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\6\117\1\u01d6\34\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\1\117\1\u01d7\41\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\34\117\1\343\6\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\3\117\1\343\37\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\34\117\1\u01d8\6\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\6\117\1\u01d9"+
+    "\34\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u01da\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u01db\34\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\5\117\1\u01dc\35\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\40\117\1\u01dd\2\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\1\117\1\u01de\41\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\3\117\1\u01df\37\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\32\117\1\u01e0\10\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\6\117\1\366"+
+    "\34\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\30\117"+
+    "\1\u01e1\12\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u01dc\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\1\117\1\u0194\41\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\33\117\1\u01e2\7\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\33\117\1\u01e3\7\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u01e4\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u01e1\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\3\117\1\u0173"+
+    "\37\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\1\117\1\u01e5\2\0"+
+    "\43\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\31\117"+
+    "\1\u01e6\11\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\343\34\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\15\117\1\343\25\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\5\117\1\u01e7\35\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\6\117\1\u01e8\34\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\34\117\1\u01d5\6\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\343\42\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\5\117\1\u0186\35\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\31\117\1\u01e9"+
+    "\11\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\5\117"+
+    "\1\u01ea\35\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u01e5\34\117\1\110\10\0\6\117\1\0\5\117"+
+    "\1\u01eb\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\1\117\1\u01ec\41\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\30\117\1\u01e5\12\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\3\117\1\u0171\37\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\33\117\1\u018b\7\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u01ed\1\117"+
+    "\1\u01ee\37\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\5\117\1\343\35\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u01ef"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\31\117\1\u01f0\11\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u01f1\34\117\1\110\10\0\6\117"+
+    "\1\0\5\117\1\u01f2\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\43\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\27\117\1\u01f3\13\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\36\117\1\343\4\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u01f4\11\117"+
+    "\12\0\1\u01f5\6\0\4\u01f5\11\0\2\u01f5\24\0\1\u01f5"+
+    "\1\0\1\u01f5\1\0\1\u01f5\5\0\1\u01f5\6\0\1\u01f5"+
+    "\1\0\1\u01f5\1\0\1\u01f5\1\0\1\u01f5\2\0\1\u01f5"+
+    "\16\0\1\u01f6\6\0\4\u01f6\11\0\2\u01f6\24\0\1\u01f6"+
+    "\1\0\1\u01f6\1\0\1\u01f6\5\0\1\u01f6\6\0\1\u01f6"+
+    "\1\0\1\u01f6\1\0\1\u01f6\1\0\1\u01f6\2\0\1\u01f6"+
+    "\16\0\1\u01f7\100\0\1\u01f7\71\0\1\u01f8\126\0\1\u01a3"+
+    "\106\0\1\u01f9\111\0\1\u01fa\73\0\1\u01fb\100\0\1\u01fb"+
+    "\20\0\3\201\1\u01fc\2\201\1\0\6\201\6\0\4\201"+
+    "\14\0\1\u01fc\1\201\2\0\43\201\52\0\1\u01a9\10\0"+
+    "\1\u011f\47\0\1\u01fd\117\0\2\u01fe\1\0\7\u01aa\1\0"+
+    "\6\u01aa\1\0\1\u01fe\1\0\1\u01fe\1\u01aa\1\u01fe\4\u01aa"+
+    "\2\u01fe\1\0\3\u01fe\1\0\5\u01fe\2\u01aa\2\u01fe\43\u01aa"+
+    "\2\52\1\0\1\52\1\0\2\52\2\0\4\52\1\u0147"+
+    "\1\52\1\0\25\52\1\0\11\52\1\0\2\52\1\u0147"+
+    "\42\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\21\52\1\u012a\10\52\1\u012a"+
+    "\12\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\12\52\1\234\22\52\1\234"+
+    "\7\52\1\0\1\52\1\0\2\52\2\0\3\52\1\u01b8"+
+    "\2\52\1\0\25\52\1\0\6\52\1\u01b8\2\52\1\0"+
+    "\45\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u0147"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u0147"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u012a"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u012a"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u01ff\20\52\1\u01ff"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\2\52\1\u0200"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\u0200"+
+    "\14\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0201\5\52\1\0\11\52\1\0\6\52\1\u0201"+
+    "\1\52\1\u01bc\20\52\1\u01bc\13\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\16\52\1\u0202\17\52\1\u0202\6\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\14\52\2\u012a\27\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\12\52\1\u0203"+
+    "\22\52\1\u0203\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u0204"+
+    "\20\52\1\u0204\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\307"+
+    "\22\52\1\307\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\21\52\1\u0205"+
+    "\10\52\1\u0205\12\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u01bc\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u01bc\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\16\52\1\u0206\6\52\1\0\11\52\1\0"+
+    "\4\52\1\u0206\40\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\12\52\1\312"+
+    "\22\52\1\312\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u0207\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u0207\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\16\52\1\u0208"+
+    "\17\52\1\u0208\6\52\1\0\1\52\1\0\2\52\2\0"+
+    "\2\52\1\u012a\3\52\1\0\25\52\1\0\11\52\1\0"+
+    "\30\52\1\u012a\14\52\1\0\1\52\1\0\2\52\2\0"+
+    "\5\52\1\u0209\1\0\25\52\1\0\11\52\1\0\1\52"+
+    "\1\u0209\43\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\12\52\1\u020a\22\52"+
+    "\1\u020a\7\52\1\0\1\52\1\0\2\52\2\0\1\52"+
+    "\1\227\4\52\1\0\25\52\1\0\11\52\1\0\33\52"+
+    "\1\227\11\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\17\52\1\u0147\5\52\1\0\11\52\1\0\6\52"+
+    "\1\u0147\36\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\17\52\1\u020b\5\52\1\0\11\52\1\0\6\52"+
+    "\1\u020b\36\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\u020c\20\52"+
+    "\1\u020c\13\52\1\0\1\52\1\0\2\52\2\0\3\52"+
+    "\1\u020d\2\52\1\0\25\52\1\0\6\52\1\u020d\2\52"+
+    "\1\0\45\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\5\52\1\u020e\17\52\1\0\11\52\1\0\17\52"+
+    "\1\u020e\25\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\11\52\1\234\22\52"+
+    "\1\234\10\52\1\0\1\52\1\0\2\52\2\0\3\52"+
+    "\1\u020f\2\52\1\0\25\52\1\0\6\52\1\u020f\2\52"+
+    "\1\0\45\52\1\0\1\52\1\0\2\52\2\0\5\52"+
+    "\1\u0210\1\0\15\52\1\u0211\7\52\1\0\7\52\1\u0212"+
+    "\1\52\1\0\1\52\1\u0210\3\52\1\u0211\12\52\1\u0212"+
+    "\24\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\307\5\52\1\0\11\52\1\0\6\52\1\307"+
+    "\34\52\13\0\1\u0213\74\0\1\u0213\12\0\1\110\10\0"+
+    "\1\110\1\u0214\4\110\1\0\1\110\4\u0214\1\110\1\0"+
+    "\4\110\1\0\2\110\2\u0214\14\0\2\110\2\0\4\110"+
+    "\1\u0214\1\110\1\u0214\1\110\1\u0214\5\110\1\u0214\6\110"+
+    "\1\u0214\1\110\1\u0214\1\110\1\u0214\1\110\1\u0214\2\110"+
+    "\1\u0214\5\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u0215\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\35\117\1\u0216\5\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\12\117\1\u01e7\30\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u0217\34\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\30\117\1\u01ee\12\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\30\117\1\u0218\12\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u0219\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\7\117\1\u021a"+
+    "\33\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\3\117"+
+    "\1\u021b\37\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\34\117\1\u021c\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u021d"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\31\117\1\u01f1\11\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u021e\34\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\6\117\1\u021f\34\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0220\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u01e5\41\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\u0221\42\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\117\1\u0222"+
+    "\41\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\5\117"+
+    "\1\u0223\35\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\2\117\1\u0224\40\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u0225\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\32\117\1\343\10\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\6\117\1\u0226\34\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\30\117\1\u0227\12\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\30\117\1\u0228\12\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\1\u0229\1\117\2\0\43\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\117\1\343"+
+    "\41\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\40\117"+
+    "\1\u0186\2\117\1\110\10\0\6\117\1\0\5\117\1\u022a"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\43\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0186\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\117"+
+    "\1\u022b\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\5\117\1\u018f\35\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\1\117\1\376\41\117\13\0\1\u022c\74\0"+
+    "\1\u022c\64\0\1\u01f9\10\0\1\u01a3\47\0\1\u022d\117\0"+
+    "\2\u022e\1\0\7\u01fa\1\0\6\u01fa\1\0\1\u022e\1\0"+
+    "\1\u022e\1\u01fa\1\u022e\4\u01fa\2\u022e\1\0\3\u022e\1\0"+
+    "\5\u022e\2\u01fa\2\u022e\43\u01fa\13\0\1\u022f\74\0\1\u022f"+
+    "\23\0\4\201\1\u0230\1\201\1\0\6\201\6\0\4\201"+
+    "\14\0\2\201\2\0\2\201\1\u0230\40\201\10\0\1\u01aa"+
+    "\112\0\2\52\1\0\1\52\1\0\2\52\2\0\1\76"+
+    "\5\52\1\0\25\52\1\0\11\52\1\0\3\52\1\76"+
+    "\41\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\11\52\1\u0231\22\52\1\u0231"+
+    "\10\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\12\52\1\u0147\22\52\1\u0147"+
+    "\7\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0232\5\52\1\0\11\52\1\0\6\52\1\u0232"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u0233"+
+    "\1\0\25\52\1\0\11\52\1\0\1\52\1\u0233\43\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\u0234\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\30\52\1\u0234\14\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\25\52"+
+    "\1\0\11\52\1\0\22\52\1\u0235\22\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\25\52\1\0\11\52"+
+    "\1\0\11\52\1\u0201\22\52\1\u0201\10\52\1\0\1\52"+
+    "\1\0\2\52\2\0\1\u01c4\5\52\1\0\25\52\1\0"+
+    "\11\52\1\0\3\52\1\u01c4\41\52\1\0\1\52\1\0"+
+    "\2\52\2\0\1\u0236\5\52\1\0\25\52\1\0\11\52"+
+    "\1\0\3\52\1\u0236\41\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\13\52"+
+    "\1\u0146\23\52\1\u0146\5\52\1\0\1\52\1\0\2\52"+
+    "\2\0\1\u01ff\5\52\1\0\25\52\1\0\11\52\1\0"+
+    "\3\52\1\u01ff\41\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\14\52\2\u0237"+
+    "\27\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u0238"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u0238"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u012a\5\52\1\0\11\52\1\0\6\52\1\u012a"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\15\52\1\u01ff\7\52\1\0\11\52\1\0\5\52\1\u01ff"+
+    "\37\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0239\5\52\1\0\11\52\1\0\6\52\1\u0239"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\3\52\1\300"+
+    "\2\52\1\0\25\52\1\0\6\52\1\300\2\52\1\0"+
+    "\45\52\1\0\1\52\1\0\2\52\2\0\2\52\1\u023a"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\u023a"+
+    "\12\52\14\0\1\u023b\37\0\1\u023b\46\0\1\110\10\0"+
+    "\1\110\1\u023c\4\110\1\0\1\110\4\u023c\1\110\1\0"+
+    "\4\110\1\0\2\110\2\u023c\14\0\2\110\2\0\4\110"+
+    "\1\u023c\1\110\1\u023c\1\110\1\u023c\5\110\1\u023c\6\110"+
+    "\1\u023c\1\110\1\u023c\1\110\1\u023c\1\110\1\u023c\2\110"+
+    "\1\u023c\5\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\1\u023d\1\117\2\0"+
+    "\43\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\1\u023e\1\117\2\0"+
+    "\43\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\15\117"+
+    "\1\u023f\25\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\4\117\1\u0240\36\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u0241\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\1\u0242\1\117\2\0\43\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\4\117\1\343\36\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\33\117\1\343\7\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\33\117\1\u0243\7\117\1\110"+
+    "\10\0\3\117\1\u0244\2\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\2\117\1\u0245\1\117\14\0\2\117"+
+    "\2\0\43\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\1\117\1\u0186"+
+    "\2\0\43\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\30\117\1\u0246\12\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u0247"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\5\117\1\u0248\35\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u01e7\34\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\36\117\1\u0171\4\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0249\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\35\117\1\343\5\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\31\117\1\u024a"+
+    "\11\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u024b\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\5\117\1\u01ee\35\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\117"+
+    "\1\u017b\2\0\43\117\14\0\1\u024c\37\0\1\u024c\56\0"+
+    "\1\u01fa\126\0\1\u024d\37\0\1\u024d\57\0\5\201\1\u024e"+
+    "\1\0\6\201\6\0\4\201\14\0\2\201\2\0\1\201"+
+    "\1\u024e\41\201\2\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u0127\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u0127\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\14\52\1\76\10\52\1\0\11\52\1\0"+
+    "\41\52\1\76\3\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u024f\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u024f\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u014f\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u014f\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u0250\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u0250\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\221"+
+    "\22\52\1\221\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u01ff\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u01ff\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\u014a"+
+    "\22\52\1\u014a\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\14\52\2\u0251"+
+    "\27\52\1\0\1\52\1\0\2\52\2\0\3\52\1\312"+
+    "\2\52\1\0\25\52\1\0\6\52\1\312\2\52\1\0"+
+    "\43\52\15\0\1\u0252\44\0\1\u0252\40\0\1\110\10\0"+
+    "\1\110\1\117\4\110\1\0\1\110\4\117\1\110\1\0"+
+    "\4\110\1\0\2\110\2\117\14\0\2\110\2\0\4\110"+
+    "\1\117\1\110\1\117\1\110\1\117\5\110\1\117\6\110"+
+    "\1\117\1\110\1\117\1\110\1\117\1\110\1\117\2\110"+
+    "\1\117\5\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\1\117"+
+    "\1\u0248\41\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0224\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\6\117\1\u0253\34\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\31\117\1\u0254\11\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\33\117\1\u0175\7\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\6\117\1\u0255\34\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u0256\41\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\35\117\1\u0257"+
+    "\5\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\5\117"+
+    "\1\u0258\35\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\34\117\1\u0259\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\34\117\1\u0227\6\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\37\117\1\343\3\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\35\117\1\u01e5\5\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\33\117\1\u01ee\7\117\1\110"+
+    "\10\0\6\117\1\0\5\117\1\u0186\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\43\117\15\0"+
+    "\1\u025a\44\0\1\u025a\55\0\1\u025b\44\0\1\u025b\40\0"+
+    "\2\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\14\52\1\u0147\10\52\1\0\11\52\1\0\41\52\1\u0147"+
+    "\3\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\11\52\1\223\22\52\1\223"+
+    "\10\52\1\0\1\52\1\0\2\52\2\0\4\52\1\u025c"+
+    "\1\52\1\0\25\52\1\0\11\52\1\0\2\52\1\u025c"+
+    "\40\52\16\0\1\u025d\42\0\1\u025d\41\0\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\35\117\1\u025e\5\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\33\117\1\u0186\7\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\35\117\1\u01ee"+
+    "\5\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\6\117"+
+    "\1\u019c\34\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u01e7\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\34\117\1\u025f\6\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\35\117\1\u0260\5\117\16\0\1\u0261\42\0"+
+    "\1\u0261\57\0\1\u0262\42\0\1\u0262\41\0\2\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\15\52\1\u0263"+
+    "\7\52\1\0\11\52\1\0\5\52\1\u0263\35\52\17\0"+
+    "\1\u0264\103\0\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0171\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\31\117\1\u0257\11\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\1\u0265\1\117\2\0\43\117\17\0\1\u0266\122\0\1\u0267"+
+    "\103\0\2\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\223\20\52"+
+    "\1\223\11\52\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\42\117\1\u0256";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[45899];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\6\0\2\1\1\0\2\1\5\0\2\1\1\11\4\1"+
+    "\1\11\5\1\1\11\2\1\2\11\2\1\1\11\1\1"+
+    "\3\11\1\1\1\11\25\1\1\11\1\1\1\11\1\1"+
+    "\3\11\1\1\1\11\2\1\2\11\7\1\1\11\3\1"+
+    "\1\11\3\1\1\11\20\1\2\11\2\1\1\11\1\1"+
+    "\1\11\1\1\1\11\6\1\1\11\5\1\2\11\5\0"+
+    "\1\11\103\1\1\11\3\0\1\11\1\0\73\1\1\11"+
+    "\2\1\1\0\1\11\5\0\2\1\1\0\1\11\4\0"+
+    "\100\1\1\0\1\1\1\0\3\1\1\0\66\1\10\0"+
+    "\1\1\1\11\2\0\44\1\1\0\1\11\45\1\1\0"+
+    "\1\11\3\0\1\1\1\0\1\1\2\0\24\1\1\0"+
+    "\30\1\4\0\13\1\1\0\20\1\2\0\4\1\1\0"+
+    "\7\1\2\0\1\1\1\0\3\1\2\0\1\1\1\11"+
+    "\1\1\2\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[615];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** number of newlines encountered up to the start of the matched text */
+  private int yyline;
+
+  /** the number of characters up to the start of the matched text */
+  private int yychar;
+
+  /**
+   * the number of characters from the last newline up to the start of the 
+   * matched text
+   */
+  private int yycolumn;
+
+  /** 
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /** denotes if the user-EOF-code has already been executed */
+  private boolean zzEOFDone;
+
+  /* user code: */
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -7;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public HTMLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		    //####		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public HTMLTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public HTMLTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 192) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+    
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = ZZ_LEXSTATE[zzLexicalState];
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 67: break;
+        case 60: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 68: break;
+        case 50: 
+          { /* Skip all escaped chars. */
+          }
+        case 69: break;
+        case 52: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 70: break;
+        case 46: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 71: break;
+        case 38: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 72: break;
+        case 66: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 73: break;
+        case 39: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 74: break;
+        case 23: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 75: break;
+        case 14: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 76: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+          }
+        case 77: break;
+        case 37: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 78: break;
+        case 61: 
+          { addToken(Token.FUNCTION);
+          }
+        case 79: break;
+        case 40: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 80: break;
+        case 26: 
+          { addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 81: break;
+        case 64: 
+          { yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 82: break;
+        case 24: 
+          { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 83: break;
+        case 34: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 84: break;
+        case 18: 
+          { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+          }
+        case 85: break;
+        case 25: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 86: break;
+        case 32: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 87: break;
+        case 45: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 88: break;
+        case 56: 
+          { boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+          }
+        case 89: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 90: break;
+        case 31: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 91: break;
+        case 10: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE);
+          }
+        case 92: break;
+        case 53: 
+          { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 93: break;
+        case 36: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 94: break;
+        case 42: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR);
+          }
+        case 95: break;
+        case 20: 
+          { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 96: break;
+        case 44: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 97: break;
+        case 41: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 98: break;
+        case 12: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 99: break;
+        case 48: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 100: break;
+        case 17: 
+          { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+          }
+        case 101: break;
+        case 21: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 102: break;
+        case 33: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 103: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 104: break;
+        case 6: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 105: break;
+        case 19: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 106: break;
+        case 35: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 107: break;
+        case 63: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+          }
+        case 108: break;
+        case 28: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 109: break;
+        case 16: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 110: break;
+        case 11: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 111: break;
+        case 27: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 112: break;
+        case 51: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 113: break;
+        case 57: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 114: break;
+        case 30: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 115: break;
+        case 49: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 116: break;
+        case 58: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 117: break;
+        case 55: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE);
+          }
+        case 118: break;
+        case 54: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 119: break;
+        case 29: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 120: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 121: break;
+        case 22: 
+          { yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 122: break;
+        case 43: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 123: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 124: break;
+        case 15: 
+          { addToken(Token.OPERATOR);
+          }
+        case 125: break;
+        case 47: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 126: break;
+        case 13: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 127: break;
+        case 62: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 128: break;
+        case 59: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 129: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken;
+          }
+        case 130: break;
+        case 65: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 131: break;
+        case 1: 
+          { 
+          }
+        case 132: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 616: break;
+            case INTAG_CHECK_TAG_NAME: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 617: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 618: break;
+            case INTAG_SCRIPT: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 619: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 620: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 621: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 622: break;
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 623: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+            }
+            case 624: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 625: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 626: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 627: break;
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 628: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 629: break;
+            case JAVASCRIPT: {
+              addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 630: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken;
+            }
+            case 631: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java.orig
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java.orig	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java.orig	(revision 25584)
@@ -0,0 +1,2364 @@
+/* The following code was generated by JFlex 1.4.1 on 2/7/12 10:39 PM */
+
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated HTMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+
+public class HTMLTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int JS_STRING = 12;
+  public static final int INTAG_CHECK_TAG_NAME = 5;
+  public static final int JS_MLC = 14;
+  public static final int INTAG_SCRIPT = 8;
+  public static final int JS_CHAR = 13;
+  public static final int JS_EOL_COMMENT = 15;
+  public static final int INATTR_DOUBLE_SCRIPT = 9;
+  public static final int INATTR_SINGLE_SCRIPT = 10;
+  public static final int DTD = 3;
+  public static final int INATTR_SINGLE = 7;
+  public static final int INATTR_DOUBLE = 6;
+  public static final int YYINITIAL = 0;
+  public static final int INTAG = 4;
+  public static final int COMMENT = 1;
+  public static final int JAVASCRIPT = 11;
+  public static final int PI = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\2\1\0\1\1\1\26\22\0\1\4\1\50\1\7"+
+    "\1\27\1\32\1\47\1\5\1\57\2\56\1\33\1\44\1\43\1\40"+
+    "\1\41\1\10\1\22\6\105\1\24\2\21\1\52\1\6\1\3\1\45"+
+    "\1\17\1\51\1\27\1\70\1\23\1\12\1\76\1\37\1\36\1\100"+
+    "\1\104\1\14\1\106\1\101\1\35\1\74\1\72\1\71\1\15\1\102"+
+    "\1\13\1\11\1\16\1\77\1\103\1\20\1\34\1\73\1\20\1\56"+
+    "\1\30\1\56\1\46\1\31\1\0\1\111\1\107\1\113\1\116\1\66"+
+    "\1\64\1\55\1\60\1\54\1\106\1\112\1\65\1\75\1\115\1\114"+
+    "\1\62\1\102\1\110\1\63\1\61\1\25\1\120\1\67\1\121\1\117"+
+    "\1\122\1\42\1\46\1\42\1\53\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\6\0\2\1\1\0\2\1\5\0\2\2\1\3\1\4"+
+    "\1\5\1\6\1\1\1\7\5\1\1\10\2\1\1\11"+
+    "\1\12\2\13\1\14\1\15\1\16\1\17\1\20\1\21"+
+    "\1\22\1\23\2\21\2\23\1\21\2\23\4\21\1\23"+
+    "\5\21\1\23\1\21\1\1\1\24\1\1\1\25\1\15"+
+    "\1\26\1\27\1\30\1\31\1\32\2\17\1\2\1\33"+
+    "\1\17\2\2\1\17\2\34\1\2\1\31\2\17\1\2"+
+    "\1\35\1\17\2\2\1\36\17\2\1\1\1\37\1\40"+
+    "\1\41\1\1\1\42\1\43\1\44\1\1\1\45\6\1"+
+    "\1\46\1\1\1\4\2\47\1\50\1\51\1\6\5\0"+
+    "\1\52\31\21\1\23\7\21\1\23\5\21\1\23\33\21"+
+    "\1\53\3\0\1\54\1\0\1\55\1\17\1\31\1\2"+
+    "\1\17\1\56\1\34\1\57\1\56\1\57\1\56\1\60"+
+    "\1\56\2\2\1\61\1\2\1\61\47\2\1\61\1\2"+
+    "\1\62\1\63\1\64\1\0\1\65\5\0\1\66\1\47"+
+    "\1\0\1\67\4\0\14\21\1\23\63\21\1\0\1\70"+
+    "\1\0\1\31\1\2\1\57\1\0\2\60\4\2\1\6"+
+    "\57\2\10\0\1\47\1\71\2\0\1\72\20\21\1\23"+
+    "\5\21\1\23\14\21\1\0\1\73\1\31\10\2\1\74"+
+    "\13\2\1\6\1\2\1\75\15\2\1\0\1\1\3\0"+
+    "\1\76\1\0\1\47\2\0\10\21\1\23\13\21\1\0"+
+    "\1\31\5\2\1\61\10\2\1\61\10\2\4\0\1\47"+
+    "\12\21\1\0\1\31\17\2\2\0\1\77\3\21\1\0"+
+    "\7\2\2\0\1\21\1\0\3\2\2\0\1\21\1\100"+
+    "\1\2\1\101\1\102";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[615];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+    "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u048a\0\u04dd"+
+    "\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722\0\u05d6"+
+    "\0\u0775\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u05d6\0\u0914\0\u0967"+
+    "\0\u05d6\0\u05d6\0\u09ba\0\u0a0d\0\u05d6\0\u0a60\0\u05d6\0\u05d6"+
+    "\0\u05d6\0\u0ab3\0\u05d6\0\u0b06\0\u0b59\0\u0bac\0\u0bff\0\u0c52"+
+    "\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e\0\u0df1\0\u0e44\0\u0e97\0\u0eea"+
+    "\0\u0f3d\0\u0f90\0\u0fe3\0\u1036\0\u1089\0\u0ab3\0\u10dc\0\u112f"+
+    "\0\u05d6\0\u1182\0\u05d6\0\u11d5\0\u05d6\0\u05d6\0\u05d6\0\u1228"+
+    "\0\u05d6\0\u127b\0\u12ce\0\u05d6\0\u05d6\0\u1321\0\u1374\0\u13c7"+
+    "\0\u141a\0\u146d\0\u14c0\0\u1513\0\u05d6\0\u1566\0\u15b9\0\u160c"+
+    "\0\u05d6\0\u165f\0\u16b2\0\u1705\0\u05d6\0\u1758\0\u17ab\0\u17fe"+
+    "\0\u1851\0\u18a4\0\u18f7\0\u194a\0\u199d\0\u19f0\0\u1a43\0\u1a96"+
+    "\0\u1ae9\0\u1b3c\0\u1b8f\0\u1be2\0\u1c35\0\u05d6\0\u05d6\0\u1c88"+
+    "\0\u1cdb\0\u05d6\0\u1c88\0\u05d6\0\u1d2e\0\u05d6\0\u1d81\0\u1dd4"+
+    "\0\u1e27\0\u1e7a\0\u1ecd\0\u1f20\0\u05d6\0\u1f73\0\u1fc6\0\u2019"+
+    "\0\u206c\0\u20bf\0\u05d6\0\u05d6\0\u2112\0\u2165\0\u21b8\0\u220b"+
+    "\0\u225e\0\u05d6\0\u22b1\0\u2304\0\u2357\0\u23aa\0\u23fd\0\u2450"+
+    "\0\u24a3\0\u24f6\0\u2549\0\u259c\0\u25ef\0\u2642\0\u2695\0\u26e8"+
+    "\0\u273b\0\u278e\0\u27e1\0\u2834\0\u2887\0\u28da\0\u292d\0\u2980"+
+    "\0\u29d3\0\u2a26\0\u2a79\0\u2acc\0\u2b1f\0\u2b72\0\u2bc5\0\u2c18"+
+    "\0\u2c6b\0\u2cbe\0\u2d11\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0"+
+    "\0\u2f03\0\u2f56\0\u2fa9\0\u2ffc\0\u304f\0\u30a2\0\u30f5\0\u3148"+
+    "\0\u319b\0\u31ee\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d\0\u33e0"+
+    "\0\u3433\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625\0\u3678"+
+    "\0\u36cb\0\u371e\0\u3771\0\u37c4\0\u3817\0\u05d6\0\u1566\0\u386a"+
+    "\0\u38bd\0\u05d6\0\u3910\0\u3963\0\u38bd\0\u39b6\0\u3a09\0\u3a5c"+
+    "\0\u3aaf\0\u3aaf\0\u3aaf\0\u3b02\0\u3b55\0\u3ba8\0\u3bfb\0\u3c4e"+
+    "\0\u3ca1\0\u3cf4\0\u1374\0\u3d47\0\u3d9a\0\u3ded\0\u3e40\0\u3e93"+
+    "\0\u3ee6\0\u3f39\0\u3f8c\0\u3fdf\0\u4032\0\u4085\0\u40d8\0\u412b"+
+    "\0\u417e\0\u41d1\0\u4224\0\u4277\0\u42ca\0\u431d\0\u4370\0\u43c3"+
+    "\0\u4416\0\u4469\0\u44bc\0\u450f\0\u4562\0\u45b5\0\u4608\0\u465b"+
+    "\0\u46ae\0\u4701\0\u4754\0\u47a7\0\u47fa\0\u484d\0\u48a0\0\u48f3"+
+    "\0\u4946\0\u4999\0\u49ec\0\u4a3f\0\u4a92\0\u4ae5\0\u05d6\0\u4b38"+
+    "\0\u4b8b\0\u4bde\0\u05d6\0\u4c31\0\u4c84\0\u4cd7\0\u4d2a\0\u4d7d"+
+    "\0\u1fc6\0\u4dd0\0\u4e23\0\u05d6\0\u4e76\0\u4ec9\0\u4f1c\0\u4f6f"+
+    "\0\u4fc2\0\u5015\0\u5068\0\u50bb\0\u510e\0\u5161\0\u51b4\0\u5207"+
+    "\0\u525a\0\u52ad\0\u5300\0\u5353\0\u53a6\0\u53f9\0\u544c\0\u549f"+
+    "\0\u54f2\0\u5545\0\u5598\0\u55eb\0\u563e\0\u5691\0\u56e4\0\u5737"+
+    "\0\u578a\0\u2d64\0\u57dd\0\u5830\0\u5883\0\u58d6\0\u5929\0\u597c"+
+    "\0\u59cf\0\u5a22\0\u5a75\0\u5ac8\0\u5b1b\0\u5b6e\0\u5bc1\0\u5c14"+
+    "\0\u5c67\0\u0d4b\0\u5cba\0\u5d0d\0\u5d60\0\u5db3\0\u5e06\0\u5e59"+
+    "\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u5ff8\0\u604b\0\u609e\0\u60f1"+
+    "\0\u6144\0\u6197\0\u61ea\0\u623d\0\u6290\0\u62e3\0\u6336\0\u6389"+
+    "\0\u63dc\0\u642f\0\u6482\0\u64d5\0\u6528\0\u657b\0\u65ce\0\u3aaf"+
+    "\0\u6621\0\u6674\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866"+
+    "\0\u68b9\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u6a58\0\u6aab\0\u6afe"+
+    "\0\u6b51\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u6d43\0\u6d96"+
+    "\0\u6de9\0\u6e3c\0\u6e8f\0\u6ee2\0\u6f35\0\u6f88\0\u6fdb\0\u702e"+
+    "\0\u7081\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273\0\u72c6"+
+    "\0\u7319\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b\0\u755e"+
+    "\0\u75b1\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3\0\u77f6"+
+    "\0\u7849\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u05d6\0\u7a3b"+
+    "\0\u7a8e\0\u7ae1\0\u7b34\0\u7b87\0\u7bda\0\u7c2d\0\u7c80\0\u7cd3"+
+    "\0\u7d26\0\u7d79\0\u7dcc\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b"+
+    "\0\u7fbe\0\u8011\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203"+
+    "\0\u5a22\0\u8256\0\u82a9\0\u82fc\0\u834f\0\u83a2\0\u2f56\0\u83f5"+
+    "\0\u8448\0\u849b\0\u84ee\0\u8541\0\u8594\0\u85e7\0\u05d6\0\u863a"+
+    "\0\u868d\0\u86e0\0\u8733\0\u8786\0\u87d9\0\u882c\0\u887f\0\u88d2"+
+    "\0\u1374\0\u8925\0\u8978\0\u89cb\0\u8a1e\0\u8a71\0\u8ac4\0\u8b17"+
+    "\0\u8b6a\0\u8bbd\0\u8c10\0\u8c63\0\u1374\0\u8cb6\0\u1374\0\u8d09"+
+    "\0\u8d5c\0\u8daf\0\u8e02\0\u8e55\0\u8ea8\0\u8efb\0\u8f4e\0\u8fa1"+
+    "\0\u8ff4\0\u9047\0\u909a\0\u90ed\0\u4b8b\0\u05d6\0\u9140\0\u9193"+
+    "\0\u91e6\0\u9239\0\u928c\0\u92df\0\u9332\0\u7ae1\0\u9385\0\u93d8"+
+    "\0\u942b\0\u947e\0\u94d1\0\u9524\0\u9577\0\u95ca\0\u961d\0\u961d"+
+    "\0\u9670\0\u96c3\0\u9716\0\u9769\0\u97bc\0\u980f\0\u9862\0\u98b5"+
+    "\0\u9908\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7\0\u9afa\0\u9b4d"+
+    "\0\u9ba0\0\u68b9\0\u9bf3\0\u9c46\0\u9c99\0\u9cec\0\u9d3f\0\u9d92"+
+    "\0\u9de5\0\u9e38\0\u9e8b\0\u9ede\0\u9f31\0\u9f84\0\u9fd7\0\ua02a"+
+    "\0\ua07d\0\ua0d0\0\ua123\0\ua176\0\ua1c9\0\u9239\0\ua21c\0\ua26f"+
+    "\0\ua2c2\0\ua315\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507"+
+    "\0\ua55a\0\ua5ad\0\ua600\0\ua653\0\ua6a6\0\ua6f9\0\ua74c\0\ua79f"+
+    "\0\ua7f2\0\ua845\0\ua898\0\ua8eb\0\ua93e\0\ua991\0\ua9e4\0\uaa37"+
+    "\0\uaa8a\0\uaadd\0\uab30\0\uab83\0\uabd6\0\u206c\0\uac29\0\uac7c"+
+    "\0\uaccf\0\uad22\0\uad75\0\uadc8\0\uae1b\0\uae6e\0\uaec1\0\uaf14"+
+    "\0\uaf67\0\uafba\0\ub00d\0\ub060\0\ub0b3\0\ub106\0\ub159\0\ub1ac"+
+    "\0\ub1ff\0\ub252\0\ub2a5\0\u05d6\0\ub2f8\0\u05d6\0\u05d6";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[615];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\21\1\22\1\23\1\24\1\25\1\26\115\21\2\27"+
+    "\1\30\35\27\1\31\17\27\1\32\3\27\1\33\2\27"+
+    "\1\34\33\27\2\35\1\36\46\35\1\37\51\35\2\40"+
+    "\1\41\14\40\1\42\103\40\1\43\1\44\1\0\1\43"+
+    "\1\25\2\43\1\45\1\46\6\43\1\47\25\43\1\50"+
+    "\11\43\1\51\43\43\2\52\1\0\1\52\1\53\2\52"+
+    "\2\53\1\54\1\55\1\56\1\57\1\60\1\61\1\53"+
+    "\3\52\1\62\1\52\1\63\7\52\1\64\1\65\1\66"+
+    "\5\52\1\53\6\52\1\57\2\52\1\53\1\67\1\61"+
+    "\1\60\1\54\1\65\1\64\1\66\1\52\1\70\1\71"+
+    "\1\72\1\52\2\73\1\74\1\63\1\52\1\75\1\76"+
+    "\1\77\1\67\2\52\1\62\1\56\1\70\1\75\1\55"+
+    "\1\71\1\72\1\74\1\52\1\77\2\52\7\100\1\101"+
+    "\113\100\57\102\1\101\43\102\1\43\1\44\1\0\1\43"+
+    "\1\25\2\43\1\103\1\104\6\43\1\105\25\43\1\50"+
+    "\11\43\1\106\43\43\7\100\1\107\113\100\57\102\1\107"+
+    "\43\102\1\110\1\25\1\111\1\112\1\25\1\113\1\114"+
+    "\1\115\1\116\3\117\1\120\2\117\1\121\1\117\1\122"+
+    "\1\123\1\117\1\122\1\124\1\125\2\110\2\117\1\126"+
+    "\4\117\1\127\1\130\1\131\1\114\1\132\4\126\3\50"+
+    "\1\133\1\134\1\131\1\135\1\117\1\136\1\137\1\140"+
+    "\1\141\1\142\1\143\1\144\2\117\1\145\12\117\1\122"+
+    "\1\117\1\146\1\147\1\150\1\117\1\151\1\117\1\152"+
+    "\1\153\1\117\1\154\2\117\2\155\1\156\4\155\1\157"+
+    "\20\155\1\160\72\155\2\161\1\162\25\161\1\163\26\161"+
+    "\1\164\43\161\2\165\1\166\1\167\27\165\1\170\24\165"+
+    "\1\171\3\165\1\172\2\165\1\173\33\165\2\174\1\175"+
+    "\1\176\54\174\1\171\3\174\1\172\2\174\1\173\33\174"+
+    "\2\21\4\0\116\21\1\22\2\0\1\25\1\0\115\21"+
+    "\133\0\1\177\1\200\5\201\1\0\6\201\6\0\4\201"+
+    "\10\0\1\202\1\203\2\0\2\201\2\0\3\201\1\200"+
+    "\37\201\1\0\1\25\2\0\1\25\116\0\4\26\1\0"+
+    "\1\26\1\204\114\26\2\27\1\0\35\27\1\0\17\27"+
+    "\1\0\3\27\1\0\2\27\1\0\33\27\40\0\1\205"+
+    "\143\0\1\206\115\0\1\207\4\0\1\210\130\0\1\211"+
+    "\33\0\2\35\1\0\46\35\1\0\51\35\17\0\1\212"+
+    "\103\0\2\40\1\0\14\40\1\0\103\40\2\43\1\0"+
+    "\1\43\1\0\2\43\2\0\6\43\1\0\25\43\1\0"+
+    "\11\43\1\0\44\43\1\44\1\0\1\43\1\25\2\43"+
+    "\2\0\6\43\1\0\25\43\1\0\11\43\1\0\43\43"+
+    "\17\0\1\47\103\0\2\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\45\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\52\1\213\2\52"+
+    "\1\214\1\215\1\0\5\52\1\216\11\52\1\217\5\52"+
+    "\1\0\11\52\1\0\1\52\1\215\1\214\3\52\1\217"+
+    "\1\52\1\220\1\221\2\52\2\222\1\52\1\216\11\52"+
+    "\1\220\1\52\1\213\1\221\10\52\1\0\1\52\1\0"+
+    "\2\52\2\0\3\52\1\223\2\52\1\0\17\52\1\224"+
+    "\5\52\1\0\6\52\1\223\2\52\1\0\6\52\1\224"+
+    "\1\52\1\225\1\226\17\52\1\225\2\52\1\226\10\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\5\52"+
+    "\1\227\17\52\1\0\11\52\1\0\17\52\1\227\25\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\230\5\52\1\0"+
+    "\15\52\1\231\1\232\6\52\1\0\11\52\1\0\3\52"+
+    "\1\230\1\232\1\231\4\52\1\233\1\52\2\234\17\52"+
+    "\1\233\7\52\1\0\1\52\1\0\2\52\2\0\2\52"+
+    "\1\235\3\52\1\0\15\52\1\236\7\52\1\0\11\52"+
+    "\1\0\5\52\1\236\2\52\1\237\17\52\1\235\1\237"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\2\52\1\76"+
+    "\1\240\1\52\1\76\1\0\3\52\1\241\12\52\1\242"+
+    "\1\243\5\52\1\0\6\52\1\240\2\52\1\0\1\244"+
+    "\1\76\2\52\1\242\1\52\1\243\1\52\1\245\5\52"+
+    "\1\76\5\52\1\244\2\52\1\241\1\76\1\245\4\52"+
+    "\1\76\6\52\1\0\1\52\1\0\2\52\2\0\2\52"+
+    "\1\76\1\234\2\52\1\0\5\52\1\246\7\52\1\247"+
+    "\7\52\1\0\6\52\1\234\1\250\1\52\1\0\5\52"+
+    "\1\247\2\52\1\251\1\252\4\52\1\253\1\246\1\250"+
+    "\7\52\1\76\1\251\2\52\1\252\1\52\1\253\6\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\15\52"+
+    "\1\76\7\52\1\0\11\52\1\0\5\52\1\76\37\52"+
+    "\1\0\1\52\1\0\2\52\2\0\3\52\1\254\2\52"+
+    "\1\0\17\52\1\255\5\52\1\0\6\52\1\254\2\52"+
+    "\1\0\6\52\1\255\1\52\1\256\20\52\1\256\13\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\257\1\260"+
+    "\2\52\1\0\25\52\1\0\6\52\1\260\2\52\1\0"+
+    "\11\52\1\261\16\52\1\257\3\52\1\261\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\262\5\52\1\263\14\52\1\263"+
+    "\4\52\1\0\1\52\1\0\2\52\2\0\2\52\1\76"+
+    "\2\52\1\264\1\0\17\52\1\265\5\52\1\0\11\52"+
+    "\1\0\1\52\1\264\4\52\1\265\16\52\1\76\2\52"+
+    "\1\76\14\52\1\0\1\52\1\0\2\52\2\0\1\266"+
+    "\1\267\1\270\1\52\1\271\1\52\1\0\3\52\1\272"+
+    "\1\52\1\273\17\52\1\0\11\52\1\0\2\52\1\271"+
+    "\1\266\12\52\1\274\1\273\7\52\1\272\1\270\2\52"+
+    "\1\267\2\52\1\274\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\275\1\52\1\0\3\52\1\276\1\52"+
+    "\1\277\7\52\1\76\7\52\1\0\11\52\1\0\2\52"+
+    "\1\275\2\52\1\76\11\52\1\277\7\52\1\276\15\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\17\52"+
+    "\1\300\5\52\1\0\11\52\1\0\6\52\1\300\1\52"+
+    "\1\301\1\302\17\52\1\301\2\52\1\302\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\5\52\1\303"+
+    "\11\52\1\304\5\52\1\0\11\52\1\0\6\52\1\304"+
+    "\1\52\1\305\6\52\1\303\11\52\1\305\13\52\1\0"+
+    "\1\52\1\0\2\52\2\0\3\52\1\306\1\52\1\76"+
+    "\1\0\15\52\1\76\1\307\1\310\5\52\1\0\6\52"+
+    "\1\306\2\52\1\0\1\52\1\76\2\52\1\307\1\76"+
+    "\1\310\1\52\1\311\5\52\1\76\12\52\1\311\4\52"+
+    "\1\76\6\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\3\52\1\312\13\52\1\313\5\52\1\0\11\52"+
+    "\1\0\6\52\1\313\20\52\1\312\15\52\1\0\1\52"+
+    "\1\0\2\52\2\0\3\52\1\314\2\52\1\0\25\52"+
+    "\1\0\6\52\1\314\2\52\1\0\10\52\1\315\20\52"+
+    "\1\315\11\52\7\100\1\0\113\100\57\102\1\0\43\102"+
+    "\17\0\1\316\103\0\1\110\10\0\6\110\1\0\6\110"+
+    "\1\0\4\110\1\0\4\110\14\0\2\110\2\0\43\110"+
+    "\3\0\1\317\4\0\1\320\34\0\1\50\62\0\1\50"+
+    "\37\0\1\50\55\0\10\321\1\322\17\321\1\323\2\321"+
+    "\1\324\11\321\1\325\55\321\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\327\5\117\17\0\1\330\25\0\1\50"+
+    "\55\0\1\331\10\0\6\331\1\0\1\331\2\122\1\331"+
+    "\1\122\1\331\1\0\4\331\1\0\1\331\1\332\1\333"+
+    "\1\334\1\0\1\335\12\0\2\331\2\0\4\331\1\333"+
+    "\1\332\1\334\7\331\1\333\6\331\1\122\10\331\1\333"+
+    "\5\331\10\0\6\331\1\0\1\331\1\336\1\337\1\331"+
+    "\1\337\1\331\1\0\4\331\1\0\1\340\1\332\1\333"+
+    "\1\334\1\0\1\335\12\0\2\331\2\0\4\331\1\333"+
+    "\1\332\1\334\7\331\1\333\6\331\1\337\10\331\1\333"+
+    "\2\331\1\340\1\331\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\341\5\117\45\0\1\50\115\0\1\50"+
+    "\4\0\1\50\76\0\2\335\1\0\1\335\60\0\1\335"+
+    "\61\0\2\50\55\0\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\3\117\1\342\1\343\10\117\1\344\17\117\1\345"+
+    "\5\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\34\117"+
+    "\1\346\6\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\347\27\117\1\350\6\117\1\351\3\117\1\110\10\0"+
+    "\6\117\1\0\5\117\1\352\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\30\117\1\353\1\354"+
+    "\11\117\1\110\10\0\6\117\1\0\5\117\1\355\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\356\1\357\5\117\1\360\27\117\1\361\3\117\1\110"+
+    "\10\0\6\117\1\0\5\117\1\362\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\1\363\1\117\2\0\5\117"+
+    "\1\364\23\117\1\365\2\117\1\366\6\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\34\117\1\367\6\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\3\117\1\370\1\117"+
+    "\1\371\27\117\1\372\2\117\1\373\1\374\1\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\1\375\1\117\2\0\1\376\42\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\31\117\1\377"+
+    "\11\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\30\117"+
+    "\1\u0100\3\117\1\u0101\2\117\1\u0102\3\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\6\117\1\u0103\34\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\27\117\1\u0104\13\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\u0105\4\117"+
+    "\1\u0106\23\117\1\u0107\2\117\1\u0108\6\117\1\110\10\0"+
+    "\6\117\1\0\5\117\1\u0109\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\6\117\1\u010a\22\117"+
+    "\1\u010b\11\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u010c\25\117\1\u010d\6\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\31\117\1\366\2\117\1\u010e\6\117"+
+    "\2\155\1\0\4\155\1\0\20\155\1\0\72\155\2\u010f"+
+    "\1\0\22\u010f\1\u0110\73\u010f\1\u0111\1\u010f\2\161\1\0"+
+    "\25\161\1\0\26\161\1\0\43\161\2\165\2\0\27\165"+
+    "\1\0\24\165\1\0\3\165\1\0\2\165\1\0\33\165"+
+    "\10\0\1\u0112\122\0\1\u0113\173\0\1\u0114\115\0\1\u0115"+
+    "\4\0\1\u0116\130\0\1\u0117\33\0\2\174\2\0\54\174"+
+    "\1\0\3\174\1\0\2\174\1\0\33\174\10\0\1\u0118"+
+    "\123\0\6\u0119\1\0\6\u0119\6\0\4\u0119\14\0\2\u0119"+
+    "\2\0\43\u0119\11\0\1\201\1\u011a\4\201\1\0\6\201"+
+    "\6\0\4\201\14\0\2\201\2\0\33\201\1\u011a\7\201"+
+    "\11\0\6\201\1\0\6\201\6\0\4\201\14\0\2\201"+
+    "\2\0\43\201\40\0\1\u011b\101\0\1\u011c\164\0\1\u011d"+
+    "\126\0\1\u011e\117\0\1\u011f\127\0\1\u0120\33\0\2\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\u0121\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\30\52\1\u0121\14\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\25\52"+
+    "\1\0\11\52\1\0\10\52\1\u0122\20\52\1\u0122\13\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\u0123\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\13\52\1\227\14\52"+
+    "\1\u0123\6\52\1\227\5\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\76\1\52\1\0\3\52\1\76\21\52"+
+    "\1\0\11\52\1\0\2\52\1\76\24\52\1\76\15\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\52\1\u0124\1\u0125"+
+    "\3\52\1\0\15\52\1\u0126\7\52\1\0\11\52\1\0"+
+    "\5\52\1\u0126\22\52\1\u0125\2\52\1\u0124\11\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\u0127\27\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\5\52\1\u0128\17\52\1\0"+
+    "\11\52\1\0\17\52\1\u0128\25\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\10\52\1\u0129\20\52\1\u0129\13\52\1\0\1\52\1\0"+
+    "\2\52\2\0\5\52\1\u012a\1\0\25\52\1\0\11\52"+
+    "\1\0\1\52\1\u012a\43\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\12\52"+
+    "\1\u012b\22\52\1\u012b\7\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\u0124\1\52\1\0\25\52\1\0\11\52"+
+    "\1\0\2\52\1\u0124\7\52\1\u012c\22\52\1\u012c\7\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\15\52"+
+    "\1\u012d\7\52\1\0\11\52\1\0\5\52\1\u012d\6\52"+
+    "\2\u012e\1\u012a\17\52\1\u012a\6\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\15\52\1\u012a\7\52\1\0"+
+    "\11\52\1\0\5\52\1\u012a\37\52\1\0\1\52\1\0"+
+    "\2\52\2\0\3\52\1\u012f\2\52\1\0\25\52\1\0"+
+    "\6\52\1\u012f\2\52\1\0\45\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\10\52\1\u0130\20\52\1\u0130\13\52\1\0\1\52\1\0"+
+    "\2\52\2\0\2\52\1\u0131\3\52\1\0\25\52\1\0"+
+    "\11\52\1\0\30\52\1\u0131\14\52\1\0\1\52\1\0"+
+    "\2\52\2\0\1\76\3\52\1\u0132\1\52\1\0\25\52"+
+    "\1\0\11\52\1\0\2\52\1\u0132\1\76\41\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\7\52\1\76\1\52\1\0\20\52\1\76\24\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\17\52\1\76"+
+    "\5\52\1\0\11\52\1\0\6\52\1\76\2\52\1\u0133"+
+    "\22\52\1\u0133\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u0134"+
+    "\20\52\1\u0134\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\2\52\1\u0135\3\52\1\0\25\52\1\0\11\52\1\0"+
+    "\30\52\1\u0135\14\52\1\0\1\52\1\0\2\52\2\0"+
+    "\5\52\1\227\1\0\25\52\1\0\11\52\1\0\1\52"+
+    "\1\227\12\52\2\u012a\27\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\11\52"+
+    "\1\252\22\52\1\252\10\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\11\52"+
+    "\1\u0136\22\52\1\u0136\10\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\14\52\1\u0137\10\52\1\0\11\52"+
+    "\1\0\41\52\1\u0137\3\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\17\52\1\u0138\5\52\1\0\11\52"+
+    "\1\0\6\52\1\u0138\36\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\3\52\1\227\21\52\1\0\11\52"+
+    "\1\0\27\52\1\227\15\52\1\0\1\52\1\0\2\52"+
+    "\2\0\5\52\1\u0139\1\0\25\52\1\0\11\52\1\0"+
+    "\1\52\1\u0139\43\52\1\0\1\52\1\0\2\52\2\0"+
+    "\3\52\1\u013a\2\52\1\0\25\52\1\0\6\52\1\u013a"+
+    "\2\52\1\0\11\52\1\u013b\22\52\1\u013b\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\u013c\5\52\1\0\25\52"+
+    "\1\0\11\52\1\0\3\52\1\u013c\41\52\1\0\1\52"+
+    "\1\0\2\52\2\0\1\u013d\5\52\1\0\25\52\1\0"+
+    "\11\52\1\0\3\52\1\u013d\41\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\16\52\1\u013e\17\52\1\u013e\6\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\11\52\1\76\22\52\1\76\10\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\12\52\1\u013f\22\52\1\u013f\7\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\7\52\1\u0140"+
+    "\1\52\1\0\20\52\1\u0140\24\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\3\52\1\u0141\21\52\1\0"+
+    "\11\52\1\0\13\52\1\u0142\13\52\1\u0141\7\52\1\u0142"+
+    "\5\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u0143\20\52\1\u0143"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0144\5\52\1\0\7\52\1\u0145\1\52\1\0"+
+    "\6\52\1\u0144\11\52\1\u0145\24\52\1\0\1\52\1\0"+
+    "\2\52\2\0\2\52\1\u0146\3\52\1\0\25\52\1\0"+
+    "\11\52\1\0\11\52\1\u012b\1\u0147\15\52\1\u0146\3\52"+
+    "\1\u012b\1\u0147\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\3\52\1\u0148\21\52\1\0\11\52\1\0"+
+    "\27\52\1\u0148\15\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u0149\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u0149\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\14\52\2\u014a"+
+    "\27\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u014b\20\52\1\u014b"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\3\52\1\u014c"+
+    "\2\52\1\0\25\52\1\0\6\52\1\u014c\2\52\1\0"+
+    "\45\52\1\0\1\52\1\0\2\52\2\0\2\52\1\u014d"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\u014d"+
+    "\14\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u014e"+
+    "\1\0\17\52\1\u014f\5\52\1\0\11\52\1\0\1\52"+
+    "\1\u014e\4\52\1\u014f\36\52\1\0\1\52\1\0\2\52"+
+    "\2\0\4\52\1\u0150\1\52\1\0\25\52\1\0\11\52"+
+    "\1\0\2\52\1\u0150\42\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\3\52\1\315\21\52\1\0\11\52"+
+    "\1\0\27\52\1\315\15\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u0151\17\52\1\u0151\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u0152\17\52\1\u0152\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\5\52\1\u0153\1\0\25\52\1\0\11\52\1\0"+
+    "\1\52\1\u0153\43\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\26\52\1\u0126"+
+    "\16\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u0154"+
+    "\1\0\25\52\1\0\11\52\1\0\1\52\1\u0154\43\52"+
+    "\1\0\1\52\1\0\2\52\2\0\1\u0147\5\52\1\0"+
+    "\25\52\1\0\11\52\1\0\3\52\1\u0147\41\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\23\52\1\76\14\52\1\76\4\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\u0155\5\52\1\0\3\52"+
+    "\1\315\11\52\1\231\1\u0156\1\u0157\5\52\1\0\11\52"+
+    "\1\0\3\52\1\u0155\1\u0156\1\231\1\u0157\20\52\1\315"+
+    "\15\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\15\52\1\u0158\7\52\1\0\11\52\1\0\5\52\1\u0158"+
+    "\37\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u0159"+
+    "\1\0\25\52\1\0\11\52\1\0\1\52\1\u0159\10\52"+
+    "\1\u015a\22\52\1\u015a\7\52\1\0\1\52\1\0\2\52"+
+    "\2\0\2\52\1\u015b\1\52\1\76\1\52\1\0\25\52"+
+    "\1\0\11\52\1\0\2\52\1\76\25\52\1\u015b\14\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\76\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\u015c\12\52"+
+    "\1\76\4\52\1\76\1\u015c\6\52\1\76\4\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\12\52\1\76\22\52\1\76\7\52\1\0"+
+    "\1\52\1\0\2\52\2\0\5\52\1\u015d\1\0\15\52"+
+    "\1\76\7\52\1\0\11\52\1\0\1\52\1\u015d\3\52"+
+    "\1\76\37\52\1\0\1\52\1\0\2\52\2\0\5\52"+
+    "\1\u015e\1\0\25\52\1\0\11\52\1\0\1\52\1\u015e"+
+    "\43\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\16\52\1\76\17\52\1\76"+
+    "\6\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\13\52\1\u015f\23\52\1\u015f"+
+    "\5\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\16\52\1\u0160\17\52\1\u0160"+
+    "\6\52\1\0\1\52\1\0\2\52\2\0\2\52\1\76"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\76"+
+    "\12\52\11\0\1\u0161\51\0\1\u0161\37\0\10\321\1\u0162"+
+    "\17\321\1\323\74\321\1\0\120\321\33\0\1\u0163\67\0"+
+    "\1\110\10\0\6\110\1\0\5\110\1\u0164\1\0\4\110"+
+    "\1\0\4\110\14\0\2\110\2\0\44\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\4\117\1\u0165\36\117\17\0\1\126"+
+    "\25\0\1\50\55\0\1\331\10\0\6\331\1\0\6\331"+
+    "\1\0\4\331\1\0\4\331\14\0\2\331\2\0\44\331"+
+    "\10\0\6\331\1\0\1\331\2\u0166\1\331\1\u0166\1\331"+
+    "\1\0\4\331\1\0\4\331\1\u0167\3\0\1\u0167\7\0"+
+    "\2\331\2\0\25\331\1\u0166\16\331\10\0\6\331\1\0"+
+    "\1\331\2\335\1\331\1\335\1\331\1\0\4\331\1\0"+
+    "\2\331\1\333\1\334\14\0\2\331\2\0\4\331\1\333"+
+    "\1\331\1\334\7\331\1\333\6\331\1\335\10\331\1\333"+
+    "\5\331\10\0\6\331\1\0\1\331\2\336\1\331\1\336"+
+    "\1\331\1\0\4\331\1\0\2\331\1\333\1\334\1\0"+
+    "\1\335\12\0\2\331\2\0\4\331\1\333\1\331\1\334"+
+    "\7\331\1\333\6\331\1\336\10\331\1\333\5\331\10\0"+
+    "\6\331\1\0\1\331\1\336\1\337\1\331\1\337\1\331"+
+    "\1\0\4\331\1\0\1\331\1\u0168\1\333\1\334\1\0"+
+    "\1\335\12\0\2\331\2\0\4\331\1\333\1\u0168\1\334"+
+    "\7\331\1\333\6\331\1\337\10\331\1\333\5\331\10\0"+
+    "\1\331\1\u0169\4\331\1\0\1\331\4\u0169\1\331\1\0"+
+    "\4\331\1\0\2\331\2\u0169\14\0\2\331\2\0\4\331"+
+    "\1\u0169\1\331\1\u0169\1\331\1\u0169\5\331\1\u0169\6\331"+
+    "\1\u0169\1\331\1\u0169\1\331\1\u0169\1\331\1\u0169\2\331"+
+    "\1\u0169\4\331\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u016a\34\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\2\117\1\u016b\1\117"+
+    "\14\0\2\117\2\0\12\117\1\u016c\30\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\2\117\1\u016d\40\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u016e\1\117"+
+    "\1\u016f\37\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0170\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u0171"+
+    "\1\117\2\0\30\117\1\u0172\12\117\1\110\10\0\6\117"+
+    "\1\0\5\117\1\u0173\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0174\5\117\1\343"+
+    "\3\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\2\117"+
+    "\1\u0175\40\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\27\117\1\u0176\13\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u0177"+
+    "\1\117\2\0\34\117\1\u0178\6\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\30\117\1\u0179\2\117\1\u017a\7\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\2\117\1\u017b"+
+    "\40\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\34\117"+
+    "\1\u017c\6\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\31\117\1\u017d\11\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u017e"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u017f\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\35\117\1\u0180\5\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\35\117\1\u0181\5\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\34\117\1\u0182\6\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\5\117\1\u0183\35\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\30\117\1\343"+
+    "\12\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u0184\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\33\117\1\u0185\7\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\3\117\1\u0186\37\117\1\110\10\0\6\117\1\0"+
+    "\5\117\1\u0187\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\43\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\31\117\1\u0188\11\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\1\117\1\u0189\1\u018a\40\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u018b\41\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\1\u018c\1\117\2\0\43\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\12\117\1\343"+
+    "\30\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\6\117"+
+    "\1\u018d\34\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\34\117\1\u018e\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\1\117\1\u018f\41\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\1\117\1\u0190\41\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\3\117\1\u0191\37\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0192\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u0193\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\117\1\u0194"+
+    "\1\117\1\u0186\37\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u0195\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\5\117\1\u0196\35\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\7\117\1\343\33\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\1\117\1\u0197\41\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\4\117\1\u0198\1\u0199"+
+    "\21\117\1\u019a\13\117\1\110\10\0\6\117\1\0\5\117"+
+    "\1\u019b\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u019c"+
+    "\1\117\2\0\5\117\1\u019d\35\117\12\0\1\u019e\6\0"+
+    "\4\u019e\11\0\2\u019e\24\0\1\u019e\1\0\1\u019e\1\0"+
+    "\1\u019e\5\0\1\u019e\6\0\1\u019e\1\0\1\u019e\1\0"+
+    "\1\u019e\1\0\1\u019e\2\0\1\u019e\16\0\1\u019f\6\0"+
+    "\4\u019f\11\0\2\u019f\24\0\1\u019f\1\0\1\u019f\1\0"+
+    "\1\u019f\5\0\1\u019f\6\0\1\u019f\1\0\1\u019f\1\0"+
+    "\1\u019f\1\0\1\u019f\2\0\1\u019f\15\0\1\u01a0\51\0"+
+    "\1\u01a0\120\0\1\u01a1\126\0\1\u01a2\117\0\1\u01a3\127\0"+
+    "\1\u01a4\44\0\1\u01a5\51\0\1\u01a5\50\0\2\201\1\u01a6"+
+    "\3\201\1\0\6\201\6\0\4\201\14\0\2\201\2\0"+
+    "\30\201\1\u01a6\12\201\40\0\1\u01a7\144\0\1\u01a8\126\0"+
+    "\1\u011f\106\0\1\u01a9\111\0\1\u01aa\61\0\2\52\1\0"+
+    "\1\52\1\0\2\52\2\0\3\52\1\u01ab\2\52\1\0"+
+    "\25\52\1\0\6\52\1\u01ab\2\52\1\0\45\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\52\1\u0142\4\52\1\0"+
+    "\25\52\1\0\11\52\1\0\12\52\1\76\20\52\1\u0142"+
+    "\1\52\1\76\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\3\52\1\u01ac\2\52\1\0\25\52\1\0\6\52\1\u01ac"+
+    "\2\52\1\0\11\52\1\u01ad\22\52\1\u01ad\10\52\1\0"+
+    "\1\52\1\0\2\52\2\0\5\52\1\u01ae\1\0\25\52"+
+    "\1\0\11\52\1\0\1\52\1\u01ae\43\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\25\52\1\0\11\52"+
+    "\1\0\23\52\1\u0142\14\52\1\u0142\4\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\17\52\1\u01af\5\52"+
+    "\1\0\11\52\1\0\6\52\1\u01af\36\52\1\0\1\52"+
+    "\1\0\2\52\2\0\4\52\1\76\1\52\1\0\25\52"+
+    "\1\0\11\52\1\0\2\52\1\76\42\52\1\0\1\52"+
+    "\1\0\2\52\2\0\2\52\1\u01b0\3\52\1\0\25\52"+
+    "\1\0\11\52\1\0\30\52\1\u01b0\14\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\15\52\1\u014a\7\52"+
+    "\1\0\11\52\1\0\5\52\1\u014a\37\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\17\52\1\76\5\52"+
+    "\1\0\11\52\1\0\6\52\1\76\36\52\1\0\1\52"+
+    "\1\0\2\52\2\0\5\52\1\u0142\1\0\25\52\1\0"+
+    "\11\52\1\0\1\52\1\u0142\43\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\23\52\1\u01b1\14\52\1\u01b1\4\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\7\52\1\u01b2"+
+    "\1\52\1\0\20\52\1\u01b2\24\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\14\52\2\u01b3\27\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\12\52\1\u01b4"+
+    "\22\52\1\u01b4\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\13\52\1\u0142"+
+    "\23\52\1\u0142\5\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u01b5"+
+    "\20\52\1\u01b5\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u0147\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u0147\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\7\52\1\u0152\1\52\1\0"+
+    "\20\52\1\u0152\24\52\1\0\1\52\1\0\2\52\2\0"+
+    "\3\52\1\u01b6\2\52\1\0\25\52\1\0\6\52\1\u01b6"+
+    "\2\52\1\0\45\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u0146"+
+    "\20\52\1\u0146\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\u0147"+
+    "\22\52\1\u0147\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\5\52\1\u01b7\1\0\25\52\1\0\11\52\1\0\1\52"+
+    "\1\u01b7\43\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\312\20\52"+
+    "\1\312\13\52\1\0\1\52\1\0\2\52\2\0\5\52"+
+    "\1\u01b8\1\0\25\52\1\0\11\52\1\0\1\52\1\u01b8"+
+    "\43\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u01b9"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u01b9"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\11\52\1\u01ba\22\52\1\u01ba"+
+    "\10\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u01bb\5\52\1\0\11\52\1\0\6\52\1\u01bb"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\13\52\1\76\23\52\1\76"+
+    "\5\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\21\52\1\76\10\52\1\76"+
+    "\12\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u01bc\5\52\1\0\11\52\1\0\6\52\1\u01bc"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u014a\5\52\1\0\11\52\1\0\6\52\1\u014a"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\315\5\52\1\0\11\52\1\0\6\52\1\315"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\14\52\2\u01bd\27\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\15\52\1\u01be"+
+    "\7\52\1\0\11\52\1\0\5\52\1\u01be\37\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\5\52\1\u01bf"+
+    "\17\52\1\0\11\52\1\0\17\52\1\u01bf\25\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\76\27\52\1\0\1\52\1\0"+
+    "\2\52\2\0\5\52\1\76\1\0\25\52\1\0\11\52"+
+    "\1\0\1\52\1\76\43\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\17\52\1\312\5\52\1\0\11\52"+
+    "\1\0\6\52\1\312\36\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\12\52"+
+    "\1\u01c0\22\52\1\u01c0\7\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u01c1\17\52\1\u01c1\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\16\52"+
+    "\1\u012a\17\52\1\u012a\6\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\11\52"+
+    "\1\u01c2\22\52\1\u01c2\10\52\1\0\1\52\1\0\2\52"+
+    "\2\0\3\52\1\u01c3\2\52\1\0\25\52\1\0\6\52"+
+    "\1\u01c3\2\52\1\0\45\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\10\52"+
+    "\1\76\20\52\1\76\13\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\15\52\1\u01c4\7\52\1\0\11\52"+
+    "\1\0\5\52\1\u01c4\37\52\1\0\1\52\1\0\2\52"+
+    "\2\0\3\52\1\253\2\52\1\0\25\52\1\0\6\52"+
+    "\1\253\2\52\1\0\45\52\1\0\1\52\1\0\2\52"+
+    "\2\0\2\52\1\u01c5\3\52\1\0\25\52\1\0\11\52"+
+    "\1\0\30\52\1\u01c5\14\52\1\0\1\52\1\0\2\52"+
+    "\2\0\3\52\1\u01b8\2\52\1\0\25\52\1\0\6\52"+
+    "\1\u01b8\1\u01b2\1\52\1\0\20\52\1\u01b2\24\52\1\0"+
+    "\1\52\1\0\2\52\2\0\4\52\1\u0132\1\52\1\0"+
+    "\25\52\1\0\11\52\1\0\2\52\1\u0132\42\52\1\0"+
+    "\1\52\1\0\2\52\2\0\1\52\1\213\4\52\1\0"+
+    "\25\52\1\0\11\52\1\0\33\52\1\213\11\52\1\0"+
+    "\1\52\1\0\2\52\2\0\2\52\1\u01c6\3\52\1\0"+
+    "\25\52\1\0\11\52\1\0\30\52\1\u01c6\14\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\25\52\1\0"+
+    "\11\52\1\0\14\52\2\u01c7\27\52\1\0\1\52\1\0"+
+    "\2\52\2\0\5\52\1\u01c8\1\0\25\52\1\0\11\52"+
+    "\1\0\1\52\1\u01c8\43\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\17\52\1\315\5\52\1\0\11\52"+
+    "\1\0\6\52\1\315\1\52\1\76\20\52\1\76\13\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\5\52"+
+    "\1\76\17\52\1\0\11\52\1\0\17\52\1\76\25\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\25\52"+
+    "\1\0\11\52\1\0\21\52\1\76\1\u01c9\7\52\1\76"+
+    "\12\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\15\52\1\u01ca\7\52\1\0\11\52\1\0\5\52\1\u01ca"+
+    "\37\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u01cb\20\52\1\u01cb"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u01cc\20\52\1\u01cc"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\7\52\1\u01cd\1\52\1\0\20\52\1\u01cd"+
+    "\24\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\253\5\52\1\0\11\52\1\0\6\52\1\253"+
+    "\34\52\12\0\1\u01ce\100\0\1\u01ce\63\0\2\u0162\17\0"+
+    "\1\u0162\35\0\1\u01cf\112\0\1\110\10\0\1\110\1\u01d0"+
+    "\4\110\1\0\1\110\4\u01d0\1\110\1\0\4\110\1\0"+
+    "\2\110\2\u01d0\14\0\2\110\2\0\4\110\1\u01d0\1\110"+
+    "\1\u01d0\1\110\1\u01d0\5\110\1\u01d0\6\110\1\u01d0\1\110"+
+    "\1\u01d0\1\110\1\u01d0\1\110\1\u01d0\2\110\1\u01d0\5\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\1\u01d1\1\117\2\0\43\117\1\331"+
+    "\10\0\6\331\1\0\1\331\2\u0166\1\331\1\u0166\1\331"+
+    "\1\0\4\331\1\0\2\331\1\333\1\331\14\0\2\331"+
+    "\2\0\4\331\1\333\11\331\1\333\6\331\1\u0166\10\331"+
+    "\1\333\4\331\21\0\2\u0166\1\0\1\u0166\60\0\1\u0166"+
+    "\15\0\1\331\10\0\1\331\1\u0169\4\331\1\0\1\331"+
+    "\4\u0169\1\331\1\0\4\331\1\0\1\331\1\u0168\2\u0169"+
+    "\14\0\2\331\2\0\4\331\1\u0169\1\u0168\1\u0169\1\331"+
+    "\1\u0169\5\331\1\u0169\6\331\1\u0169\1\331\1\u0169\1\331"+
+    "\1\u0169\1\331\1\u0169\2\331\1\u0169\4\331\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\3\117\1\370\37\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\1\u01d2\1\117\2\0\43\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u01d3\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\5\117\1\u01d4"+
+    "\26\117\1\u01d5\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\6\117\1\u01d6\34\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\1\117\1\u01d7\41\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\34\117\1\343\6\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\3\117\1\343\37\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\34\117\1\u01d8\6\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\6\117\1\u01d9"+
+    "\34\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u01da\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u01db\34\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\5\117\1\u01dc\35\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\40\117\1\u01dd\2\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\1\117\1\u01de\41\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\3\117\1\u01df\37\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\32\117\1\u01e0\10\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\6\117\1\366"+
+    "\34\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\30\117"+
+    "\1\u01e1\12\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u01dc\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\1\117\1\u0194\41\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\33\117\1\u01e2\7\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\33\117\1\u01e3\7\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u01e4\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u01e1\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\3\117\1\u0173"+
+    "\37\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\1\117\1\u01e5\2\0"+
+    "\43\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\31\117"+
+    "\1\u01e6\11\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\343\34\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\15\117\1\343\25\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\5\117\1\u01e7\35\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\6\117\1\u01e8\34\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\34\117\1\u01d5\6\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\343\42\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\5\117\1\u0186\35\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\31\117\1\u01e9"+
+    "\11\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\5\117"+
+    "\1\u01ea\35\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\6\117\1\u01e5\34\117\1\110\10\0\6\117\1\0\5\117"+
+    "\1\u01eb\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\1\117\1\u01ec\41\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\30\117\1\u01e5\12\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\3\117\1\u0171\37\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\33\117\1\u018b\7\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u01ed\1\117"+
+    "\1\u01ee\37\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\5\117\1\343\35\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u01ef"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\31\117\1\u01f0\11\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u01f1\34\117\1\110\10\0\6\117"+
+    "\1\0\5\117\1\u01f2\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\43\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\27\117\1\u01f3\13\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\36\117\1\343\4\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u01f4\11\117"+
+    "\12\0\1\u01f5\6\0\4\u01f5\11\0\2\u01f5\24\0\1\u01f5"+
+    "\1\0\1\u01f5\1\0\1\u01f5\5\0\1\u01f5\6\0\1\u01f5"+
+    "\1\0\1\u01f5\1\0\1\u01f5\1\0\1\u01f5\2\0\1\u01f5"+
+    "\16\0\1\u01f6\6\0\4\u01f6\11\0\2\u01f6\24\0\1\u01f6"+
+    "\1\0\1\u01f6\1\0\1\u01f6\5\0\1\u01f6\6\0\1\u01f6"+
+    "\1\0\1\u01f6\1\0\1\u01f6\1\0\1\u01f6\2\0\1\u01f6"+
+    "\16\0\1\u01f7\100\0\1\u01f7\71\0\1\u01f8\126\0\1\u01a3"+
+    "\106\0\1\u01f9\111\0\1\u01fa\73\0\1\u01fb\100\0\1\u01fb"+
+    "\20\0\3\201\1\u01fc\2\201\1\0\6\201\6\0\4\201"+
+    "\14\0\1\u01fc\1\201\2\0\43\201\52\0\1\u01a9\10\0"+
+    "\1\u011f\47\0\1\u01fd\117\0\2\u01fe\1\0\7\u01aa\1\0"+
+    "\6\u01aa\1\0\1\u01fe\1\0\1\u01fe\1\u01aa\1\u01fe\4\u01aa"+
+    "\2\u01fe\1\0\3\u01fe\1\0\5\u01fe\2\u01aa\2\u01fe\43\u01aa"+
+    "\2\52\1\0\1\52\1\0\2\52\2\0\4\52\1\u0147"+
+    "\1\52\1\0\25\52\1\0\11\52\1\0\2\52\1\u0147"+
+    "\42\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\21\52\1\u012a\10\52\1\u012a"+
+    "\12\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\12\52\1\234\22\52\1\234"+
+    "\7\52\1\0\1\52\1\0\2\52\2\0\3\52\1\u01b8"+
+    "\2\52\1\0\25\52\1\0\6\52\1\u01b8\2\52\1\0"+
+    "\45\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u0147"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u0147"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u012a"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u012a"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\10\52\1\u01ff\20\52\1\u01ff"+
+    "\13\52\1\0\1\52\1\0\2\52\2\0\2\52\1\u0200"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\u0200"+
+    "\14\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0201\5\52\1\0\11\52\1\0\6\52\1\u0201"+
+    "\1\52\1\u01bc\20\52\1\u01bc\13\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\16\52\1\u0202\17\52\1\u0202\6\52\1\0\1\52\1\0"+
+    "\2\52\2\0\6\52\1\0\25\52\1\0\11\52\1\0"+
+    "\14\52\2\u012a\27\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\12\52\1\u0203"+
+    "\22\52\1\u0203\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\10\52\1\u0204"+
+    "\20\52\1\u0204\13\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\307"+
+    "\22\52\1\307\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\21\52\1\u0205"+
+    "\10\52\1\u0205\12\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u01bc\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u01bc\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\16\52\1\u0206\6\52\1\0\11\52\1\0"+
+    "\4\52\1\u0206\40\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\12\52\1\312"+
+    "\22\52\1\312\7\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u0207\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u0207\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\16\52\1\u0208"+
+    "\17\52\1\u0208\6\52\1\0\1\52\1\0\2\52\2\0"+
+    "\2\52\1\u012a\3\52\1\0\25\52\1\0\11\52\1\0"+
+    "\30\52\1\u012a\14\52\1\0\1\52\1\0\2\52\2\0"+
+    "\5\52\1\u0209\1\0\25\52\1\0\11\52\1\0\1\52"+
+    "\1\u0209\43\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\12\52\1\u020a\22\52"+
+    "\1\u020a\7\52\1\0\1\52\1\0\2\52\2\0\1\52"+
+    "\1\227\4\52\1\0\25\52\1\0\11\52\1\0\33\52"+
+    "\1\227\11\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\17\52\1\u0147\5\52\1\0\11\52\1\0\6\52"+
+    "\1\u0147\36\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\17\52\1\u020b\5\52\1\0\11\52\1\0\6\52"+
+    "\1\u020b\36\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\u020c\20\52"+
+    "\1\u020c\13\52\1\0\1\52\1\0\2\52\2\0\3\52"+
+    "\1\u020d\2\52\1\0\25\52\1\0\6\52\1\u020d\2\52"+
+    "\1\0\45\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\5\52\1\u020e\17\52\1\0\11\52\1\0\17\52"+
+    "\1\u020e\25\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\11\52\1\234\22\52"+
+    "\1\234\10\52\1\0\1\52\1\0\2\52\2\0\3\52"+
+    "\1\u020f\2\52\1\0\25\52\1\0\6\52\1\u020f\2\52"+
+    "\1\0\45\52\1\0\1\52\1\0\2\52\2\0\5\52"+
+    "\1\u0210\1\0\15\52\1\u0211\7\52\1\0\7\52\1\u0212"+
+    "\1\52\1\0\1\52\1\u0210\3\52\1\u0211\12\52\1\u0212"+
+    "\24\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\307\5\52\1\0\11\52\1\0\6\52\1\307"+
+    "\34\52\13\0\1\u0213\74\0\1\u0213\12\0\1\110\10\0"+
+    "\1\110\1\u0214\4\110\1\0\1\110\4\u0214\1\110\1\0"+
+    "\4\110\1\0\2\110\2\u0214\14\0\2\110\2\0\4\110"+
+    "\1\u0214\1\110\1\u0214\1\110\1\u0214\5\110\1\u0214\6\110"+
+    "\1\u0214\1\110\1\u0214\1\110\1\u0214\1\110\1\u0214\2\110"+
+    "\1\u0214\5\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u0215\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\35\117\1\u0216\5\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\12\117\1\u01e7\30\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u0217\34\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\30\117\1\u01ee\12\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\30\117\1\u0218\12\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\31\117\1\u0219\11\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\7\117\1\u021a"+
+    "\33\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\3\117"+
+    "\1\u021b\37\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\34\117\1\u021c\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u021d"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\31\117\1\u01f1\11\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u021e\34\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\6\117\1\u021f\34\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0220\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u01e5\41\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\u0221\42\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\117\1\u0222"+
+    "\41\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\5\117"+
+    "\1\u0223\35\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\2\117\1\u0224\40\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u0225\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\32\117\1\343\10\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\6\117\1\u0226\34\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\30\117\1\u0227\12\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\30\117\1\u0228\12\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\1\u0229\1\117\2\0\43\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\1\117\1\343"+
+    "\41\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\40\117"+
+    "\1\u0186\2\117\1\110\10\0\6\117\1\0\5\117\1\u022a"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\43\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0186\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\117"+
+    "\1\u022b\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\5\117\1\u018f\35\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\1\117\1\376\41\117\13\0\1\u022c\74\0"+
+    "\1\u022c\64\0\1\u01f9\10\0\1\u01a3\47\0\1\u022d\117\0"+
+    "\2\u022e\1\0\7\u01fa\1\0\6\u01fa\1\0\1\u022e\1\0"+
+    "\1\u022e\1\u01fa\1\u022e\4\u01fa\2\u022e\1\0\3\u022e\1\0"+
+    "\5\u022e\2\u01fa\2\u022e\43\u01fa\13\0\1\u022f\74\0\1\u022f"+
+    "\23\0\4\201\1\u0230\1\201\1\0\6\201\6\0\4\201"+
+    "\14\0\2\201\2\0\2\201\1\u0230\40\201\10\0\1\u01aa"+
+    "\112\0\2\52\1\0\1\52\1\0\2\52\2\0\1\76"+
+    "\5\52\1\0\25\52\1\0\11\52\1\0\3\52\1\76"+
+    "\41\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\11\52\1\u0231\22\52\1\u0231"+
+    "\10\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\12\52\1\u0147\22\52\1\u0147"+
+    "\7\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0232\5\52\1\0\11\52\1\0\6\52\1\u0232"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\5\52\1\u0233"+
+    "\1\0\25\52\1\0\11\52\1\0\1\52\1\u0233\43\52"+
+    "\1\0\1\52\1\0\2\52\2\0\2\52\1\u0234\3\52"+
+    "\1\0\25\52\1\0\11\52\1\0\30\52\1\u0234\14\52"+
+    "\1\0\1\52\1\0\2\52\2\0\6\52\1\0\25\52"+
+    "\1\0\11\52\1\0\22\52\1\u0235\22\52\1\0\1\52"+
+    "\1\0\2\52\2\0\6\52\1\0\25\52\1\0\11\52"+
+    "\1\0\11\52\1\u0201\22\52\1\u0201\10\52\1\0\1\52"+
+    "\1\0\2\52\2\0\1\u01c4\5\52\1\0\25\52\1\0"+
+    "\11\52\1\0\3\52\1\u01c4\41\52\1\0\1\52\1\0"+
+    "\2\52\2\0\1\u0236\5\52\1\0\25\52\1\0\11\52"+
+    "\1\0\3\52\1\u0236\41\52\1\0\1\52\1\0\2\52"+
+    "\2\0\6\52\1\0\25\52\1\0\11\52\1\0\13\52"+
+    "\1\u0146\23\52\1\u0146\5\52\1\0\1\52\1\0\2\52"+
+    "\2\0\1\u01ff\5\52\1\0\25\52\1\0\11\52\1\0"+
+    "\3\52\1\u01ff\41\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\14\52\2\u0237"+
+    "\27\52\1\0\1\52\1\0\2\52\2\0\1\52\1\u0238"+
+    "\4\52\1\0\25\52\1\0\11\52\1\0\33\52\1\u0238"+
+    "\11\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u012a\5\52\1\0\11\52\1\0\6\52\1\u012a"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\15\52\1\u01ff\7\52\1\0\11\52\1\0\5\52\1\u01ff"+
+    "\37\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\17\52\1\u0239\5\52\1\0\11\52\1\0\6\52\1\u0239"+
+    "\36\52\1\0\1\52\1\0\2\52\2\0\3\52\1\300"+
+    "\2\52\1\0\25\52\1\0\6\52\1\300\2\52\1\0"+
+    "\45\52\1\0\1\52\1\0\2\52\2\0\2\52\1\u023a"+
+    "\3\52\1\0\25\52\1\0\11\52\1\0\30\52\1\u023a"+
+    "\12\52\14\0\1\u023b\37\0\1\u023b\46\0\1\110\10\0"+
+    "\1\110\1\u023c\4\110\1\0\1\110\4\u023c\1\110\1\0"+
+    "\4\110\1\0\2\110\2\u023c\14\0\2\110\2\0\4\110"+
+    "\1\u023c\1\110\1\u023c\1\110\1\u023c\5\110\1\u023c\6\110"+
+    "\1\u023c\1\110\1\u023c\1\110\1\u023c\1\110\1\u023c\2\110"+
+    "\1\u023c\5\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\1\u023d\1\117\2\0"+
+    "\43\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\1\u023e\1\117\2\0"+
+    "\43\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\15\117"+
+    "\1\u023f\25\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\4\117\1\u0240\36\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\35\117\1\u0241\5\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\1\u0242\1\117\2\0\43\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\4\117\1\343\36\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\33\117\1\343\7\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\33\117\1\u0243\7\117\1\110"+
+    "\10\0\3\117\1\u0244\2\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\2\117\1\u0245\1\117\14\0\2\117"+
+    "\2\0\43\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\1\117\1\u0186"+
+    "\2\0\43\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\30\117\1\u0246\12\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\u0247"+
+    "\1\117\2\0\43\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\5\117\1\u0248\35\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\6\117\1\u01e7\34\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\36\117\1\u0171\4\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\31\117\1\u0249\11\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\35\117\1\343\5\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\31\117\1\u024a"+
+    "\11\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\35\117"+
+    "\1\u024b\5\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\5\117\1\u01ee\35\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\1\117"+
+    "\1\u017b\2\0\43\117\14\0\1\u024c\37\0\1\u024c\56\0"+
+    "\1\u01fa\126\0\1\u024d\37\0\1\u024d\57\0\5\201\1\u024e"+
+    "\1\0\6\201\6\0\4\201\14\0\2\201\2\0\1\201"+
+    "\1\u024e\41\201\2\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u0127\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u0127\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\14\52\1\76\10\52\1\0\11\52\1\0"+
+    "\41\52\1\76\3\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u024f\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u024f\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u014f\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u014f\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\5\52\1\u0250\17\52\1\0\11\52\1\0"+
+    "\17\52\1\u0250\25\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\221"+
+    "\22\52\1\221\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\17\52\1\u01ff\5\52\1\0\11\52\1\0"+
+    "\6\52\1\u01ff\36\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\11\52\1\u014a"+
+    "\22\52\1\u014a\10\52\1\0\1\52\1\0\2\52\2\0"+
+    "\6\52\1\0\25\52\1\0\11\52\1\0\14\52\2\u0251"+
+    "\27\52\1\0\1\52\1\0\2\52\2\0\3\52\1\312"+
+    "\2\52\1\0\25\52\1\0\6\52\1\312\2\52\1\0"+
+    "\43\52\15\0\1\u0252\44\0\1\u0252\40\0\1\110\10\0"+
+    "\1\110\1\117\4\110\1\0\1\110\4\117\1\110\1\0"+
+    "\4\110\1\0\2\110\2\117\14\0\2\110\2\0\4\110"+
+    "\1\117\1\110\1\117\1\110\1\117\5\110\1\117\6\110"+
+    "\1\117\1\110\1\117\1\110\1\117\1\110\1\117\2\110"+
+    "\1\117\5\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\1\117"+
+    "\1\u0248\41\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0224\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\6\117\1\u0253\34\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\31\117\1\u0254\11\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\33\117\1\u0175\7\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\6\117\1\u0255\34\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\1\117\1\u0256\41\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\35\117\1\u0257"+
+    "\5\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\5\117"+
+    "\1\u0258\35\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\34\117\1\u0259\6\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\34\117\1\u0227\6\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\37\117\1\343\3\117\1\110\10\0\6\117"+
+    "\1\0\6\117\1\0\1\110\1\326\2\117\1\0\4\117"+
+    "\14\0\2\117\2\0\35\117\1\u01e5\5\117\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\33\117\1\u01ee\7\117\1\110"+
+    "\10\0\6\117\1\0\5\117\1\u0186\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\43\117\15\0"+
+    "\1\u025a\44\0\1\u025a\55\0\1\u025b\44\0\1\u025b\40\0"+
+    "\2\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\14\52\1\u0147\10\52\1\0\11\52\1\0\41\52\1\u0147"+
+    "\3\52\1\0\1\52\1\0\2\52\2\0\6\52\1\0"+
+    "\25\52\1\0\11\52\1\0\11\52\1\223\22\52\1\223"+
+    "\10\52\1\0\1\52\1\0\2\52\2\0\4\52\1\u025c"+
+    "\1\52\1\0\25\52\1\0\11\52\1\0\2\52\1\u025c"+
+    "\40\52\16\0\1\u025d\42\0\1\u025d\41\0\1\110\10\0"+
+    "\6\117\1\0\6\117\1\0\1\110\1\326\2\117\1\0"+
+    "\4\117\14\0\2\117\2\0\35\117\1\u025e\5\117\1\110"+
+    "\10\0\6\117\1\0\6\117\1\0\1\110\1\326\2\117"+
+    "\1\0\4\117\14\0\2\117\2\0\33\117\1\u0186\7\117"+
+    "\1\110\10\0\6\117\1\0\6\117\1\0\1\110\1\326"+
+    "\2\117\1\0\4\117\14\0\2\117\2\0\35\117\1\u01ee"+
+    "\5\117\1\110\10\0\6\117\1\0\6\117\1\0\1\110"+
+    "\1\326\2\117\1\0\4\117\14\0\2\117\2\0\6\117"+
+    "\1\u019c\34\117\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u01e7\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\34\117\1\u025f\6\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\2\117\2\0\35\117\1\u0260\5\117\16\0\1\u0261\42\0"+
+    "\1\u0261\57\0\1\u0262\42\0\1\u0262\41\0\2\52\1\0"+
+    "\1\52\1\0\2\52\2\0\6\52\1\0\15\52\1\u0263"+
+    "\7\52\1\0\11\52\1\0\5\52\1\u0263\35\52\17\0"+
+    "\1\u0264\103\0\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\1\117\1\u0171\41\117\1\110\10\0\6\117\1\0\6\117"+
+    "\1\0\1\110\1\326\2\117\1\0\4\117\14\0\2\117"+
+    "\2\0\31\117\1\u0257\11\117\1\110\10\0\6\117\1\0"+
+    "\6\117\1\0\1\110\1\326\2\117\1\0\4\117\14\0"+
+    "\1\u0265\1\117\2\0\43\117\17\0\1\u0266\122\0\1\u0267"+
+    "\103\0\2\52\1\0\1\52\1\0\2\52\2\0\6\52"+
+    "\1\0\25\52\1\0\11\52\1\0\10\52\1\223\20\52"+
+    "\1\223\11\52\1\110\10\0\6\117\1\0\6\117\1\0"+
+    "\1\110\1\326\2\117\1\0\4\117\14\0\2\117\2\0"+
+    "\42\117\1\u0256";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[45899];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\6\0\2\1\1\0\2\1\5\0\2\1\1\11\4\1"+
+    "\1\11\5\1\1\11\2\1\2\11\2\1\1\11\1\1"+
+    "\3\11\1\1\1\11\25\1\1\11\1\1\1\11\1\1"+
+    "\3\11\1\1\1\11\2\1\2\11\7\1\1\11\3\1"+
+    "\1\11\3\1\1\11\20\1\2\11\2\1\1\11\1\1"+
+    "\1\11\1\1\1\11\6\1\1\11\5\1\2\11\5\0"+
+    "\1\11\103\1\1\11\3\0\1\11\1\0\73\1\1\11"+
+    "\2\1\1\0\1\11\5\0\2\1\1\0\1\11\4\0"+
+    "\100\1\1\0\1\1\1\0\3\1\1\0\66\1\10\0"+
+    "\1\1\1\11\2\0\44\1\1\0\1\11\45\1\1\0"+
+    "\1\11\3\0\1\1\1\0\1\1\2\0\24\1\1\0"+
+    "\30\1\4\0\13\1\1\0\20\1\2\0\4\1\1\0"+
+    "\7\1\2\0\1\1\1\0\3\1\2\0\1\1\1\11"+
+    "\1\1\2\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[615];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to HTMLTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -7;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public HTMLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public HTMLTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public HTMLTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 192) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 67: break;
+        case 60: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 68: break;
+        case 50: 
+          { /* Skip all escaped chars. */
+          }
+        case 69: break;
+        case 52: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 70: break;
+        case 46: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 71: break;
+        case 38: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 72: break;
+        case 66: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 73: break;
+        case 39: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 74: break;
+        case 23: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 75: break;
+        case 14: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 76: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+          }
+        case 77: break;
+        case 37: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 78: break;
+        case 61: 
+          { addToken(Token.FUNCTION);
+          }
+        case 79: break;
+        case 40: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 80: break;
+        case 26: 
+          { addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 81: break;
+        case 64: 
+          { yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 82: break;
+        case 24: 
+          { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 83: break;
+        case 34: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 84: break;
+        case 18: 
+          { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+          }
+        case 85: break;
+        case 25: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 86: break;
+        case 32: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 87: break;
+        case 45: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 88: break;
+        case 56: 
+          { boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+          }
+        case 89: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 90: break;
+        case 31: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 91: break;
+        case 10: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE);
+          }
+        case 92: break;
+        case 53: 
+          { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 93: break;
+        case 36: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 94: break;
+        case 42: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR);
+          }
+        case 95: break;
+        case 20: 
+          { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 96: break;
+        case 44: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 97: break;
+        case 41: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 98: break;
+        case 12: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 99: break;
+        case 48: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 100: break;
+        case 17: 
+          { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+          }
+        case 101: break;
+        case 21: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 102: break;
+        case 33: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 103: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 104: break;
+        case 6: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 105: break;
+        case 19: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 106: break;
+        case 35: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 107: break;
+        case 63: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+          }
+        case 108: break;
+        case 28: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 109: break;
+        case 16: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 110: break;
+        case 11: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 111: break;
+        case 27: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 112: break;
+        case 51: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 113: break;
+        case 57: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 114: break;
+        case 30: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 115: break;
+        case 49: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 116: break;
+        case 58: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 117: break;
+        case 55: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE);
+          }
+        case 118: break;
+        case 54: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 119: break;
+        case 29: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 120: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 121: break;
+        case 22: 
+          { yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 122: break;
+        case 43: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 123: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 124: break;
+        case 15: 
+          { addToken(Token.OPERATOR);
+          }
+        case 125: break;
+        case 47: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 126: break;
+        case 13: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 127: break;
+        case 62: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 128: break;
+        case 59: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 129: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken;
+          }
+        case 130: break;
+        case 65: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 131: break;
+        case 1: 
+          { 
+          }
+        case 132: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 616: break;
+            case INTAG_CHECK_TAG_NAME: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 617: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 618: break;
+            case INTAG_SCRIPT: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 619: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 620: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 621: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 622: break;
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 623: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+            }
+            case 624: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 625: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 626: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 627: break;
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 628: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 629: break;
+            case JAVASCRIPT: {
+              addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 630: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken;
+            }
+            case 631: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex	(revision 25584)
@@ -0,0 +1,1299 @@
+/*
+ * 02/11/2008
+ *
+ * JSPTokenMaker.java - Generates tokens for JSP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JSP files (supporting HTML 5).
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JSPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+%%
+
+%public
+%class JSPTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in a JSP hidden comment ("<%-- ... --%>").
+	 */
+	public static final int INTERNAL_IN_HIDDEN_COMMENT		= -7;
+
+	/**
+	 * Token type specifying we're in a JSP directive (either include, page
+	 * or taglib).
+	 */
+	public static final int INTERNAL_IN_JSP_DIRECTIVE			= -8;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -9;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -12;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -13;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -14;
+
+	/**
+	 * Token type specifying we're in a Java documentation comment.
+	 */
+	public static final int INTERNAL_IN_JAVA_DOCCOMMENT		= -(1<<11);
+
+	/**
+	 * Token type specifying we're in Java code.
+	 */
+	public static final int INTERNAL_IN_JAVA_EXPRESSION		= -(2<<11);
+
+	/**
+	 * Token type specifying we're in Java multiline comment.
+	 */
+	public static final int INTERNAL_IN_JAVA_MLC				= -(3<<11);
+
+	/**
+	 * The state JSP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int jspInState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for JSP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JSPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		jspInState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_HIDDEN_COMMENT:
+				state = HIDDEN_COMMENT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JSP_DIRECTIVE:
+				state = JSP_DIRECTIVE;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_JAVAxxx - jspInState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_JAVA_DOCCOMMENT:
+							state = JAVA_DOCCOMMENT;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_JAVA_EXPRESSION:
+							state = JAVA_EXPRESSION;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_JAVA_MLC:
+							state = JAVA_MLC;
+							start = text.offset;
+							break;
+					}
+					jspInState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace			= ([ \t\f])
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+AmperItem				= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'/=>]+)
+UnclosedStringLiteral	= ([\"][^\"]*)
+StringLiteral			= ({UnclosedStringLiteral}[\"])
+UnclosedCharLiteral		= ([\'][^\']*)
+CharLiteral			= ({UnclosedCharLiteral}[\'])
+EndScriptTag			= ("</" [sS][cC][rR][iI][pP][tT] ">")
+
+JspExpressionStart		= ("<%=")
+JspScriptletStart		= ("<%")
+JspDeclarationStart		= ("<%!")
+JspStart				= ({JspExpressionStart}|{JspScriptletStart}|{JspDeclarationStart})
+
+// Java stuff.
+Letter							= [A-Za-z]
+LetterOrUnderscore				= ({Letter}|"_")
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+AnyCharacterButApostropheOrBackSlash	= ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash	= ([^\\\"\n])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape							= ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+WhiteSpace				= ([ \t\f])
+JCharLiteral				= ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+JUnclosedCharLiteral			= ([\'][^\'\n]*)
+JErrorCharLiteral			= ({UnclosedCharLiteral}[\'])
+JStringLiteral				= ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+JUnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+JErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+MLCBegin					= "/*"
+MLCEnd					= "*/"
+DocCommentBegin			= "/**"
+LineCommentBegin			= "//"
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral				= ("true"|"false")
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+DocumentationKeyword		= ("author"|"deprecated"|"exception"|"link"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+JIdentifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+Annotation				= ("@"{JIdentifier}?)
+PrimitiveTypes				= ("boolean"|"byte"|"char"|"double" |"float"|"int"|"long"|"short")
+
+CurrentBlockTag				= ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+ProposedBlockTag			= ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
+BlockTag					= ({CurrentBlockTag}|{ProposedBlockTag})
+InlineTag					= ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+// JavaScript stuff.
+JS_MLCBegin				= ({MLCBegin})
+JS_MLCEnd					= ({MLCEnd})
+JS_LineCommentBegin			= ({LineCommentBegin})
+JS_IntegerLiteral			= ({IntegerLiteral})
+JS_HexLiteral				= ({HexLiteral})
+JS_FloatLiteral			= ({FloatLiteral})
+JS_ErrorNumberFormat		= ({ErrorNumberFormat})
+JS_Separator				= ({Separator})
+JS_Separator2				= ({Separator2})
+JS_Operator				= ({Operator})
+JS_Identifier				= ({JIdentifier})
+JS_ErrorIdentifier			= ({ErrorIdentifier})
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state JAVASCRIPT
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state HIDDEN_COMMENT
+%state JAVA_DOCCOMMENT
+%state JAVA_EXPRESSION
+%state JAVA_MLC
+%state JSP_DIRECTIVE
+
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	"<"[sS][cC][rR][iI][pP][tT]	{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+								}
+	"<!"						{ start = zzMarkedPos-2; yybegin(DTD); }
+	"<?"						{ start = zzMarkedPos-2; yybegin(PI); }
+	"<%--"					{ start = zzMarkedPos-4; yybegin(HIDDEN_COMMENT); }
+	{JspStart}				{ addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	"<%@"                         { addToken(Token.SEPARATOR); yybegin(JSP_DIRECTIVE); }
+	"<"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"</"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+	{Identifier}				{ addToken(Token.IDENTIFIER); } // Catches everything.
+	{AmperItem}				{ addToken(Token.DATA_TYPE); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	"-->"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); }
+	"-"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+<HIDDEN_COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken; }
+	"--%>"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_MULTILINE); }
+	"-"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
+	"?>"						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
+	"?"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+	[Aa] |
+	[aA][bB][bB][rR] |
+	[aA][cC][rR][oO][nN][yY][mM] |
+	[aA][dD][dD][rR][eE][sS][sS] |
+	[aA][pP][pP][lL][eE][tT] |
+	[aA][rR][eE][aA] |
+	[aA][rR][tT][iI][cC][lL][eE] |
+	[aA][sS][iI][dD][eE] |
+	[aA][uU][dD][iI][oO] |
+	[bB] |
+	[bB][aA][sS][eE] |
+	[bB][aA][sS][eE][fF][oO][nN][tT] |
+	[bB][dD][oO] |
+	[bB][gG][sS][oO][uU][nN][dD] |
+	[bB][iI][gG] |
+	[bB][lL][iI][nN][kK] |
+	[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+	[bB][oO][dD][yY] |
+	[bB][rR] |
+	[bB][uU][tT][tT][oO][nN] |
+	[cC][aA][nN][vV][aA][sS] |
+	[cC][aA][pP][tT][iI][oO][nN] |
+	[cC][eE][nN][tT][eE][rR] |
+	[cC][iI][tT][eE] |
+	[cC][oO][dD][eE] |
+	[cC][oO][lL] |
+	[cC][oO][lL][gG][rR][oO][uU][pP] |
+	[cC][oO][mM][mM][aA][nN][dD] |
+	[cC][oO][mM][mM][eE][nN][tT] |
+	[dD][dD] |
+	[dD][aA][tT][aA][gG][rR][iI][dD] |
+	[dD][aA][tT][aA][lL][iI][sS][tT] |
+	[dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+	[dD][eE][lL] |
+	[dD][eE][tT][aA][iI][lL][sS] |
+	[dD][fF][nN] |
+	[dD][iI][aA][lL][oO][gG] |
+	[dD][iI][rR] |
+	[dD][iI][vV] |
+	[dD][lL] |
+	[dD][tT] |
+	[eE][mM] |
+	[eE][mM][bB][eE][dD] |
+	[eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+	[fF][iI][eE][lL][dD][sS][eE][tT] |
+	[fF][iI][gG][uU][rR][eE] |
+	[fF][oO][nN][tT] |
+	[fF][oO][oO][tT][eE][rR] |
+	[fF][oO][rR][mM] |
+	[fF][rR][aA][mM][eE] |
+	[fF][rR][aA][mM][eE][sS][eE][tT] |
+	[hH][123456] |
+	[hH][eE][aA][dD] |
+	[hH][eE][aA][dD][eE][rR] |
+	[hH][rR] |
+	[hH][tT][mM][lL] |
+	[iI] |
+	[iI][fF][rR][aA][mM][eE] |
+	[iI][lL][aA][yY][eE][rR] |
+	[iI][mM][gG] |
+	[iI][nN][pP][uU][tT] |
+	[iI][nN][sS] |
+	[iI][sS][iI][nN][dD][eE][xX] |
+	[kK][bB][dD] |
+	[kK][eE][yY][gG][eE][nN] |
+	[lL][aA][bB][eE][lL] |
+	[lL][aA][yY][eE][rR] |
+	[lL][eE][gG][eE][nN][dD] |
+	[lL][iI] |
+	[lL][iI][nN][kK] |
+	[mM][aA][pP] |
+	[mM][aA][rR][kK] |
+	[mM][aA][rR][qQ][uU][eE][eE] |
+	[mM][eE][nN][uU] |
+	[mM][eE][tT][aA] |
+	[mM][eE][tT][eE][rR] |
+	[mM][uU][lL][tT][iI][cC][oO][lL] |
+	[nN][aA][vV] |
+	[nN][eE][sS][tT] |
+	[nN][oO][bB][rR] |
+	[nN][oO][eE][mM][bB][eE][dD] |
+	[nN][oO][fF][rR][aA][mM][eE][sS] |
+	[nN][oO][lL][aA][yY][eE][rR] |
+	[nN][oO][sS][cC][rR][iI][pP][tT] |
+	[oO][bB][jJ][eE][cC][tT] |
+	[oO][lL] |
+	[oO][pP][tT][gG][rR][oO][uU][pP] |
+	[oO][pP][tT][iI][oO][nN] |
+	[oO][uU][tT][pP][uU][tT] |
+	[pP] |
+	[pP][aA][rR][aA][mM] |
+	[pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+	[pP][rR][eE] |
+	[pP][rR][oO][gG][rR][eE][sS][sS] |
+	[qQ] |
+	[rR][uU][lL][eE] |
+	[sS] |
+	[sS][aA][mM][pP] |
+	[sS][cC][rR][iI][pP][tT] |
+	[sS][eE][cC][tT][iI][oO][nN] |
+	[sS][eE][lL][eE][cC][tT] |
+	[sS][eE][rR][vV][eE][rR] |
+	[sS][mM][aA][lL][lL] |
+	[sS][oO][uU][rR][cC][eE] |
+	[sS][pP][aA][cC][eE][rR] |
+	[sS][pP][aA][nN] |
+	[sS][tT][rR][iI][kK][eE] |
+	[sS][tT][rR][oO][nN][gG] |
+	[sS][tT][yY][lL][eE] |
+	[sS][uU][bB] |
+	[sS][uU][pP] |
+	[tT][aA][bB][lL][eE] |
+	[tT][bB][oO][dD][yY] |
+	[tT][dD] |
+	[tT][eE][xX][tT][aA][rR][eE][aA] |
+	[tT][fF][oO][oO][tT] |
+	[tT][hH] |
+	[tT][hH][eE][aA][dD] |
+	[tT][iI][mM][eE] |
+	[tT][iI][tT][lL][eE] |
+	[tT][rR] |
+	[tT][tT] |
+	[uU] |
+	[uU][lL] |
+	[vV][aA][rR] |
+	[vV][iI][dD][eE][oO]    { addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+	.						{ /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+	{JspStart}				{ addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\"<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\"]					{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\'<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\']					{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{JspStart}				{ addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\"<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\"]					{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	{JspStart}				{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+	[^\'<]*					{}
+	"<"						{ /* Allowing JSP expressions, etc. */ }
+	[\']					{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+	{EndScriptTag}					{
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	// ECMA keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"return" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"debugger" |
+	"default" |
+	"do" |
+	"enum" |
+	"export" |
+	"extends" |
+	"final" |
+	"finally" |
+	"goto" |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"interface" |
+	"native" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"static" |
+	"super" |
+	"switch" |
+	"synchronized" |
+	"throw" |
+	"throws" |
+	"transient" |
+	"try" |
+	"volatile" |
+	"null"						{ addToken(Token.RESERVED_WORD); }
+	{PrimitiveTypes}				{ addToken(Token.DATA_TYPE); }
+
+	// Literals.
+	{BooleanLiteral}				{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	{JspStart}				{ addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf<\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+	{JS_MLCEnd}					{ yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+
+<JS_EOL_COMMENT> {
+	[^hwf<\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+
+<JAVA_EXPRESSION> {
+
+	"%>"							{ addToken(Token.SEPARATOR); start = zzMarkedPos; yybegin(jspInState); }
+
+	/* Keywords */
+	"abstract"|
+	"assert" |
+	"break"	 |
+	"case"	 |
+	"catch"	 |
+	"class"	 |
+	"const"	 |
+	"continue" |
+	"default" |
+	"do"	 |
+	"else"	 |
+	"enum"	 |
+	"extends" |
+	"final"	 |
+	"finally" |
+	"for"	 |
+	"goto"	 |
+	"if"	 |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"interface" |
+	"native" |
+	"new"	 |
+	"null"	 |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"static" |
+	"strictfp" |
+	"super"	 |
+	"switch" |
+	"synchronized" |
+	"this"	 |
+	"throw"	 |
+	"throws" |
+	"transient" |
+	"try"	 |
+	"void"	 |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+	"return"				{ addToken(Token.RESERVED_WORD_2); }
+
+	/* Data types. */
+	{PrimitiveTypes}			{ addToken(Token.DATA_TYPE); }
+
+	/* Booleans. */
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	/* java.lang classes */
+	"Appendable" |
+	"AutoCloseable" |
+	"CharSequence" |
+	"Cloneable" |
+	"Comparable" |
+	"Iterable" |
+	"Readable" |
+	"Runnable" |
+	"Thread.UncaughtExceptionHandler" |
+	"Boolean" |
+	"Byte" |
+	"Character" |
+	"Character.Subset" | 
+	"Character.UnicodeBlock" | 
+	"Class" |
+	"ClassLoader" |
+	"Compiler" |
+	"Double" |
+	"Enum" |
+	"Float" |
+	"InheritableThreadLocal" |
+	"Integer" |
+	"Long" |
+	"Math" |
+	"Number" |
+	"Object" |
+	"Package" |
+	"Process" |
+	"ProcessBuilder" |
+	"ProcessBuilder.Redirect" |
+	"Runtime" |
+	"RuntimePermission" |
+	"SecurityManager" |
+	"Short" |
+	"StackTraceElement" |
+	"StrictMath" |
+	"String" |
+	"StringBuffer" |
+	"StringBuilder" |
+	"System" |
+	"Thread" |
+	"ThreadGroup" |
+	"ThreadLocal" |
+	"Throwable" |
+	"Void" |
+	"Character.UnicodeScript" |
+	"ProcessBuilder.Redirect.Type" |
+	"Thread.State" |
+	"ArithmeticException" |
+	"ArrayIndexOutOfBoundsException" |
+	"ArrayStoreException" |
+	"ClassCastException" |
+	"ClassNotFoundException" |
+	"CloneNotSupportedException" |
+	"EnumConstantNotPresentException" |
+	"Exception" |
+	"IllegalAccessException" |
+	"IllegalArgumentException" |
+	"IllegalMonitorStateException" |
+	"IllegalStateException" |
+	"IllegalThreadStateException" |
+	"IndexOutOfBoundsException" |
+	"InstantiationException" |
+	"InterruptedException" |
+	"NegativeArraySizeException" |
+	"NoSuchFieldException" |
+	"NoSuchMethodException" |
+	"NullPointerException" |
+	"NumberFormatException" |
+	"RuntimeException" |
+	"SecurityException" |
+	"StringIndexOutOfBoundsException" |
+	"TypeNotPresentException" |
+	"UnsupportedOperationException" |
+	"AbstractMethodError" |
+	"AssertionError" |
+	"ClassCircularityError" |
+	"ClassFormatError" |
+	"Error" |
+	"ExceptionInInitializerError" |
+	"IllegalAccessError" |
+	"IncompatibleClassChangeError" |
+	"InstantiationError" |
+	"InternalError" |
+	"LinkageError" |
+	"NoClassDefFoundError" |
+	"NoSuchFieldError" |
+	"NoSuchMethodError" |
+	"OutOfMemoryError" |
+	"StackOverflowError" |
+	"ThreadDeath" |
+	"UnknownError" |
+	"UnsatisfiedLinkError" |
+	"UnsupportedClassVersionError" |
+	"VerifyError" |
+	"VirtualMachineError" 			{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+	{JIdentifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{JCharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{JUnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+	{JErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{JStringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{JUnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+	{JErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(JAVA_MLC); }
+	{DocCommentBegin}				{ start = zzMarkedPos-3; yybegin(JAVA_DOCCOMMENT); }
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+	/* Annotations. */
+	{Annotation}					{ addToken(Token.ANNOTATION); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JAVA_MLC> {
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken; }
+	{MLCEnd}					{ yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken; }
+}
+
+
+<JAVA_DOCCOMMENT> {
+
+	[^hwf\@\{\n\<\*]+			{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+
+	"@"{BlockTag}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"@"							{}
+	"{@"{InlineTag}[^\}]*"}"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"{"							{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
+	"<"[/]?({Letter}[^\>]*)?">"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+	\<							{}
+	{MLCEnd}					{ yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+	\*							{}
+	<<EOF>>						{ yybegin(JAVA_EXPRESSION); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
+
+}
+
+
+<JSP_DIRECTIVE> {
+	"include" |
+	"page" |
+	"taglib"					{ addToken(Token.RESERVED_WORD); }
+	"/"						{ addToken(Token.RESERVED_WORD); }
+	{InTagIdentifier}			{ addToken(Token.IDENTIFIER); }
+	{Whitespace}+				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"%>"						{ yybegin(YYINITIAL); addToken(Token.SEPARATOR); }
+	"%"						{ addToken(Token.IDENTIFIER); }
+	">"						{ addToken(Token.IDENTIFIER); /* Needed as InTagIdentifier ignores it. */ }
+	{UnclosedStringLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); }
+	{StringLiteral}			{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedCharLiteral}		{ addToken(Token.ERROR_CHAR); }
+	{CharLiteral}				{ addToken(Token.LITERAL_CHAR); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_IN_JSP_DIRECTIVE); return firstToken; }
+}
+
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java	(revision 25584)
@@ -0,0 +1,4483 @@
+/* The following code was generated by JFlex 1.4.1 on 2/6/12 12:07 PM */
+
+/*
+ * 02/11/2008
+ *
+ * JSPTokenMaker.java - Generates tokens for JSP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JSP files (supporting HTML 5).
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JSPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+
+public class JSPTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INATTR_SINGLE_SCRIPT = 10;
+  public static final int JS_CHAR = 13;
+  public static final int JAVA_EXPRESSION = 18;
+  public static final int HIDDEN_COMMENT = 16;
+  public static final int JS_MLC = 14;
+  public static final int JAVA_DOCCOMMENT = 17;
+  public static final int INTAG_SCRIPT = 8;
+  public static final int JSP_DIRECTIVE = 20;
+  public static final int COMMENT = 1;
+  public static final int INATTR_DOUBLE_SCRIPT = 9;
+  public static final int PI = 2;
+  public static final int JAVASCRIPT = 11;
+  public static final int INTAG = 4;
+  public static final int INTAG_CHECK_TAG_NAME = 5;
+  public static final int DTD = 3;
+  public static final int JS_EOL_COMMENT = 15;
+  public static final int INATTR_SINGLE = 7;
+  public static final int YYINITIAL = 0;
+  public static final int INATTR_DOUBLE = 6;
+  public static final int JS_STRING = 12;
+  public static final int JAVA_MLC = 19;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\2\1\0\1\1\1\41\22\0\1\4\1\23\1\10"+
+    "\1\42\1\43\1\22\1\5\1\11\2\106\1\44\1\62\1\61\1\52"+
+    "\1\53\1\12\1\27\3\40\3\122\1\31\2\26\1\65\1\6\1\3"+
+    "\1\7\1\21\1\64\1\103\1\107\1\30\1\14\1\100\1\51\1\47"+
+    "\1\115\1\121\1\16\1\123\1\116\1\46\1\113\1\111\1\110\1\17"+
+    "\1\117\1\15\1\13\1\20\1\114\1\120\1\24\1\45\1\112\1\24"+
+    "\1\106\1\32\1\106\1\63\1\25\1\0\1\55\1\37\1\73\1\71"+
+    "\1\54\1\50\1\105\1\67\1\75\1\126\1\76\1\56\1\77\1\36"+
+    "\1\70\1\72\1\125\1\34\1\57\1\35\1\33\1\102\1\101\1\74"+
+    "\1\104\1\124\1\127\1\63\1\60\1\66\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\6\0\2\1\1\0\2\1\12\0\2\2\1\3\1\4"+
+    "\1\5\1\6\1\1\1\7\5\1\1\10\2\1\1\11"+
+    "\1\12\2\13\1\5\1\14\1\15\1\16\1\17\1\20"+
+    "\1\21\1\22\1\23\2\21\2\23\1\21\2\23\4\21"+
+    "\1\23\6\21\1\23\1\1\1\24\1\25\1\1\1\13"+
+    "\1\26\1\27\1\17\1\30\1\31\1\32\1\33\2\14"+
+    "\1\2\1\14\1\34\1\35\1\14\2\2\1\14\2\36"+
+    "\5\2\1\32\1\2\1\14\5\2\1\37\1\14\10\2"+
+    "\1\1\1\40\1\41\1\42\1\1\1\43\1\44\1\45"+
+    "\1\1\1\46\6\1\1\47\1\1\1\50\2\1\1\51"+
+    "\7\1\1\52\1\14\1\53\1\54\1\14\6\2\1\14"+
+    "\20\2\1\55\6\2\1\1\1\56\1\1\2\2\1\57"+
+    "\1\60\1\61\1\62\4\2\1\4\2\63\1\64\1\65"+
+    "\1\66\1\6\5\0\1\67\1\64\32\21\1\23\11\21"+
+    "\1\23\5\21\1\23\30\21\1\70\1\71\2\0\1\64"+
+    "\1\0\1\14\1\72\1\0\1\73\1\32\1\2\1\14"+
+    "\1\74\1\36\1\75\1\74\1\75\1\74\1\76\1\74"+
+    "\35\2\1\61\7\2\2\61\7\2\1\77\1\100\1\101"+
+    "\1\0\1\102\10\0\1\103\1\104\20\0\1\53\1\105"+
+    "\1\53\1\54\1\0\1\60\1\54\1\106\1\107\20\2"+
+    "\1\110\20\2\1\55\17\2\1\111\1\112\1\113\3\2"+
+    "\1\114\1\63\1\64\1\0\1\115\3\0\1\116\2\0"+
+    "\1\64\14\21\1\23\63\21\1\70\1\0\1\117\1\0"+
+    "\1\32\1\2\1\75\1\0\2\76\52\2\1\6\11\2"+
+    "\40\0\1\57\1\53\1\0\2\53\1\54\1\0\1\60"+
+    "\3\54\1\120\42\2\1\32\26\2\1\63\1\121\1\122"+
+    "\2\0\1\123\17\21\1\23\14\21\1\23\6\21\1\0"+
+    "\1\124\1\32\2\2\1\125\6\2\1\6\6\2\1\126"+
+    "\23\2\1\0\1\1\3\0\1\127\1\0\1\130\2\0"+
+    "\1\131\10\0\1\132\15\0\3\53\1\54\32\2\1\126"+
+    "\3\2\1\32\23\2\1\61\1\2\1\63\2\0\11\21"+
+    "\1\23\12\21\1\0\1\32\3\2\1\61\3\2\1\61"+
+    "\16\2\35\0\3\53\1\54\5\2\1\126\26\2\1\32"+
+    "\22\2\1\63\12\21\1\0\1\32\15\2\24\0\2\53"+
+    "\1\54\1\126\24\2\1\126\2\2\1\133\4\2\1\32"+
+    "\10\2\1\126\10\2\1\134\3\21\1\0\5\2\4\0"+
+    "\1\132\6\0\1\53\14\2\1\126\7\2\1\126\1\2"+
+    "\1\0\6\2\1\32\21\2\1\21\1\0\2\2\13\0"+
+    "\1\53\31\2\2\0\22\2\1\21\1\135\1\2\1\136"+
+    "\1\137\5\0\13\2\1\126\15\2\2\0\3\2\1\126"+
+    "\15\2\5\0\10\2\1\0\15\2\2\0\16\2\2\0"+
+    "\6\2\2\0\13\2\2\0\17\2\2\0\12\2\1\126"+
+    "\1\0\15\2\2\0\10\2\1\0\11\2\2\0\4\2"+
+    "\1\126\1\0\5\2\2\0\3\2\2\0\4\2\1\0"+
+    "\2\2\2\0\3\2\1\0\2\2\2\0\3\2\2\0"+
+    "\1\2\2\0\3\2\2\0\1\2\2\0\3\2\2\0"+
+    "\1\2\2\0\1\2\4\0\1\2\2\0\1\126\13\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1460];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\130\0\260\0\u0108\0\u0160\0\u01b8\0\u0210\0\u0268"+
+    "\0\u02c0\0\u0318\0\u0370\0\u03c8\0\u0420\0\u0478\0\u04d0\0\u0528"+
+    "\0\u0580\0\u05d8\0\u0630\0\u0688\0\u06e0\0\u0738\0\u0790\0\u07e8"+
+    "\0\u0840\0\u0898\0\u08f0\0\u0948\0\u07e8\0\u09a0\0\u09f8\0\u0a50"+
+    "\0\u0aa8\0\u0b00\0\u07e8\0\u0b58\0\u0bb0\0\u07e8\0\u07e8\0\u0c08"+
+    "\0\u0c60\0\u07e8\0\u07e8\0\u07e8\0\u07e8\0\u0cb8\0\u07e8\0\u0d10"+
+    "\0\u07e8\0\u0d68\0\u0dc0\0\u0e18\0\u0e70\0\u0ec8\0\u0f20\0\u0f78"+
+    "\0\u0fd0\0\u1028\0\u1080\0\u10d8\0\u1130\0\u1188\0\u11e0\0\u1238"+
+    "\0\u1290\0\u12e8\0\u1340\0\u1398\0\u0d10\0\u13f0\0\u1448\0\u07e8"+
+    "\0\u14a0\0\u14f8\0\u07e8\0\u07e8\0\u1550\0\u07e8\0\u07e8\0\u15a8"+
+    "\0\u07e8\0\u1600\0\u1658\0\u07e8\0\u16b0\0\u07e8\0\u07e8\0\u1708"+
+    "\0\u1760\0\u17b8\0\u1810\0\u1868\0\u18c0\0\u1918\0\u1970\0\u19c8"+
+    "\0\u1a20\0\u1a78\0\u07e8\0\u1ad0\0\u1b28\0\u1b80\0\u1bd8\0\u1c30"+
+    "\0\u1c88\0\u1ce0\0\u07e8\0\u1d38\0\u1d90\0\u1de8\0\u1e40\0\u1e98"+
+    "\0\u1ef0\0\u1f48\0\u1fa0\0\u1ff8\0\u2050\0\u07e8\0\u07e8\0\u20a8"+
+    "\0\u2100\0\u07e8\0\u07e8\0\u20a8\0\u2158\0\u07e8\0\u21b0\0\u2208"+
+    "\0\u2260\0\u22b8\0\u2310\0\u2368\0\u07e8\0\u23c0\0\u07e8\0\u2418"+
+    "\0\u2470\0\u07e8\0\u24c8\0\u2520\0\u2578\0\u25d0\0\u2628\0\u2680"+
+    "\0\u26d8\0\u07e8\0\u2730\0\u2788\0\u27e0\0\u2838\0\u2890\0\u28e8"+
+    "\0\u2940\0\u2998\0\u29f0\0\u2a48\0\u2aa0\0\u2af8\0\u2b50\0\u2ba8"+
+    "\0\u2c00\0\u2c58\0\u2cb0\0\u2d08\0\u2d60\0\u2db8\0\u2e10\0\u2e68"+
+    "\0\u2ec0\0\u2f18\0\u2f70\0\u2fc8\0\u3020\0\u3078\0\u30d0\0\u3128"+
+    "\0\u3180\0\u31d8\0\u3230\0\u3288\0\u32e0\0\u07e8\0\u3338\0\u3390"+
+    "\0\u33e8\0\u3440\0\u3498\0\u07e8\0\u07e8\0\u34f0\0\u3548\0\u35a0"+
+    "\0\u35f8\0\u3650\0\u36a8\0\u3700\0\u3758\0\u37b0\0\u07e8\0\u07e8"+
+    "\0\u3808\0\u3860\0\u38b8\0\u3910\0\u3968\0\u07e8\0\u39c0\0\u3a18"+
+    "\0\u3a70\0\u3ac8\0\u3b20\0\u3b78\0\u3bd0\0\u3c28\0\u3c80\0\u3cd8"+
+    "\0\u3d30\0\u3d88\0\u3de0\0\u3e38\0\u3e90\0\u3ee8\0\u3f40\0\u3f98"+
+    "\0\u3ff0\0\u4048\0\u40a0\0\u40f8\0\u4150\0\u41a8\0\u4200\0\u4258"+
+    "\0\u42b0\0\u4308\0\u4360\0\u43b8\0\u4410\0\u4468\0\u44c0\0\u4518"+
+    "\0\u4570\0\u45c8\0\u4620\0\u4678\0\u46d0\0\u4728\0\u4780\0\u47d8"+
+    "\0\u4830\0\u4888\0\u48e0\0\u4938\0\u4990\0\u49e8\0\u4a40\0\u4a98"+
+    "\0\u4af0\0\u4b48\0\u4ba0\0\u4bf8\0\u4c50\0\u4ca8\0\u4d00\0\u4d58"+
+    "\0\u4db0\0\u4e08\0\u4e60\0\u4eb8\0\u4f10\0\u4f68\0\u4fc0\0\u5018"+
+    "\0\u5070\0\u50c8\0\u5120\0\u07e8\0\u16b0\0\u5178\0\u51d0\0\u5228"+
+    "\0\u5228\0\u07e8\0\u5280\0\u52d8\0\u5330\0\u5388\0\u53e0\0\u5438"+
+    "\0\u5438\0\u5438\0\u5490\0\u54e8\0\u5540\0\u5598\0\u55f0\0\u5648"+
+    "\0\u56a0\0\u56f8\0\u5750\0\u57a8\0\u5800\0\u5858\0\u58b0\0\u5908"+
+    "\0\u5960\0\u59b8\0\u5a10\0\u5a68\0\u5ac0\0\u5b18\0\u5b70\0\u5bc8"+
+    "\0\u5c20\0\u5c78\0\u5cd0\0\u5d28\0\u5d80\0\u5dd8\0\u5e30\0\u5e88"+
+    "\0\u5ee0\0\u5f38\0\u5f90\0\u5fe8\0\u6040\0\u6098\0\u60f0\0\u6148"+
+    "\0\u61a0\0\u61f8\0\u6250\0\u62a8\0\u6300\0\u1760\0\u6358\0\u63b0"+
+    "\0\u6408\0\u6460\0\u64b8\0\u6510\0\u6568\0\u07e8\0\u65c0\0\u6618"+
+    "\0\u6670\0\u07e8\0\u66c8\0\u6720\0\u6778\0\u67d0\0\u6828\0\u6880"+
+    "\0\u68d8\0\u6930\0\u07e8\0\u07e8\0\u6988\0\u69e0\0\u6a38\0\u6a90"+
+    "\0\u6ae8\0\u6b40\0\u6b98\0\u6bf0\0\u6c48\0\u6ca0\0\u6cf8\0\u6d50"+
+    "\0\u6da8\0\u6e00\0\u6e58\0\u6eb0\0\u6f08\0\u07e8\0\u6f60\0\u6fb8"+
+    "\0\u7010\0\u07e8\0\u7068\0\u70c0\0\u7118\0\u7170\0\u71c8\0\u7220"+
+    "\0\u7278\0\u72d0\0\u7328\0\u7380\0\u73d8\0\u7430\0\u7488\0\u74e0"+
+    "\0\u7538\0\u7590\0\u75e8\0\u7640\0\u7698\0\u07e8\0\u76f0\0\u7748"+
+    "\0\u77a0\0\u77f8\0\u7850\0\u78a8\0\u7900\0\u7958\0\u79b0\0\u7a08"+
+    "\0\u7a60\0\u7ab8\0\u7b10\0\u7b68\0\u6300\0\u7bc0\0\u7c18\0\u7c70"+
+    "\0\u7cc8\0\u7d20\0\u7d78\0\u7dd0\0\u7e28\0\u7e80\0\u7ed8\0\u7f30"+
+    "\0\u7f88\0\u7fe0\0\u8038\0\u8090\0\u80e8\0\u8140\0\u07e8\0\u07e8"+
+    "\0\u07e8\0\u8198\0\u81f0\0\u8248\0\u3650\0\u82a0\0\u07e8\0\u82f8"+
+    "\0\u07e8\0\u8350\0\u83a8\0\u8400\0\u07e8\0\u8458\0\u84b0\0\u0c08"+
+    "\0\u8508\0\u8560\0\u85b8\0\u8610\0\u8668\0\u86c0\0\u8718\0\u8770"+
+    "\0\u87c8\0\u8820\0\u8878\0\u88d0\0\u8928\0\u8980\0\u89d8\0\u8a30"+
+    "\0\u8a88\0\u8ae0\0\u8b38\0\u8b90\0\u8be8\0\u8c40\0\u8c98\0\u8cf0"+
+    "\0\u8d48\0\u4678\0\u8da0\0\u8df8\0\u8e50\0\u8ea8\0\u8f00\0\u8f58"+
+    "\0\u8fb0\0\u9008\0\u9060\0\u90b8\0\u9110\0\u9168\0\u91c0\0\u9218"+
+    "\0\u9270\0\u92c8\0\u9320\0\u9378\0\u93d0\0\u9428\0\u9480\0\u94d8"+
+    "\0\u9530\0\u9588\0\u95e0\0\u0fd0\0\u9638\0\u9690\0\u96e8\0\u9740"+
+    "\0\u9798\0\u97f0\0\u9848\0\u98a0\0\u98f8\0\u9950\0\u99a8\0\u9a00"+
+    "\0\u07e8\0\u9a58\0\u9ab0\0\u9b08\0\u9b60\0\u9bb8\0\u9c10\0\u9c68"+
+    "\0\u5438\0\u9cc0\0\u9d18\0\u9d70\0\u9dc8\0\u9e20\0\u9e78\0\u9ed0"+
+    "\0\u9f28\0\u9f80\0\u9fd8\0\ua030\0\ua088\0\ua0e0\0\ua138\0\ua190"+
+    "\0\ua1e8\0\ua240\0\ua298\0\ua2f0\0\ua348\0\ua3a0\0\ua3f8\0\ua450"+
+    "\0\ua4a8\0\ua500\0\ua558\0\ua5b0\0\ua608\0\ua660\0\ua6b8\0\ua710"+
+    "\0\ua768\0\ua7c0\0\ua818\0\ua870\0\ua8c8\0\ua920\0\ua978\0\ua9d0"+
+    "\0\uaa28\0\uaa80\0\uaad8\0\uab30\0\uab88\0\uabe0\0\uac38\0\uac90"+
+    "\0\uace8\0\uad40\0\uad98\0\uadf0\0\uae48\0\uaea0\0\uaef8\0\uaf50"+
+    "\0\uafa8\0\ub000\0\ub058\0\ub0b0\0\ub108\0\ub160\0\ub1b8\0\ub210"+
+    "\0\ub268\0\ub2c0\0\ub318\0\ub370\0\ub3c8\0\ub420\0\ub478\0\ub4d0"+
+    "\0\ub528\0\ub580\0\ub5d8\0\ub630\0\ub688\0\ub6e0\0\ub738\0\ub790"+
+    "\0\ub7e8\0\ub840\0\ub898\0\ub8f0\0\ub948\0\ub9a0\0\u07e8\0\ub9f8"+
+    "\0\uba50\0\ubaa8\0\ubb00\0\ubb58\0\ubbb0\0\ubc08\0\ubc60\0\ubcb8"+
+    "\0\ubd10\0\u9b08\0\ubd68\0\ubdc0\0\ube18\0\ube70\0\ubec8\0\ubf20"+
+    "\0\ubf78\0\ubfd0\0\uc028\0\uc080\0\uc0d8\0\uc130\0\uc188\0\uc1e0"+
+    "\0\uc238\0\uc290\0\uc2e8\0\uc340\0\uc398\0\uc3f0\0\uc448\0\uc4a0"+
+    "\0\uc4f8\0\uc550\0\uc5a8\0\uc600\0\uc658\0\uc6b0\0\uc708\0\uc760"+
+    "\0\uc7b8\0\uc810\0\uc868\0\uc8c0\0\uc918\0\uc970\0\uc9c8\0\uca20"+
+    "\0\uca78\0\ucad0\0\ucb28\0\ucb80\0\ucbd8\0\ucc30\0\ucc88\0\ucce0"+
+    "\0\ucd38\0\ucd90\0\ucde8\0\uce40\0\uce98\0\ucef0\0\ucf48\0\ucfa0"+
+    "\0\ucff8\0\ud050\0\ud0a8\0\ud100\0\u07e8\0\u07e8\0\ud158\0\ud1b0"+
+    "\0\ud208\0\ud260\0\ud2b8\0\ud310\0\ud368\0\ud3c0\0\ud418\0\ud470"+
+    "\0\ud4c8\0\ud520\0\ud578\0\ud5d0\0\ud628\0\ud680\0\ud6d8\0\ud730"+
+    "\0\ud788\0\ud7e0\0\ud838\0\u4888\0\ud890\0\ud8e8\0\ud940\0\ud998"+
+    "\0\ud9f0\0\uda48\0\udaa0\0\udaf8\0\udb50\0\u9168\0\udba8\0\udc00"+
+    "\0\udc58\0\udcb0\0\udd08\0\udd60\0\uddb8\0\u07e8\0\ude10\0\ude68"+
+    "\0\udec0\0\u1760\0\udf18\0\udf70\0\udfc8\0\ue020\0\ue078\0\ue0d0"+
+    "\0\u1760\0\ue128\0\ue180\0\ue1d8\0\ue230\0\ue288\0\ue2e0\0\u1760"+
+    "\0\ue338\0\ue390\0\ue3e8\0\ue440\0\ue498\0\ue4f0\0\ue548\0\ue5a0"+
+    "\0\ue5f8\0\ue650\0\ue6a8\0\ue700\0\ue758\0\ue7b0\0\ue808\0\ue860"+
+    "\0\ue8b8\0\ue910\0\ue968\0\u6618\0\u07e8\0\ue9c0\0\uea18\0\uea70"+
+    "\0\ueac8\0\ueb20\0\u07e8\0\ueb78\0\uebd0\0\uec28\0\uec80\0\uecd8"+
+    "\0\ued30\0\ued88\0\uede0\0\uee38\0\uee90\0\ueee8\0\u07e8\0\uef40"+
+    "\0\uef98\0\ueff0\0\uf048\0\uf0a0\0\uf0f8\0\uf150\0\uf1a8\0\uf200"+
+    "\0\uf258\0\uf2b0\0\uf308\0\uf360\0\uf3b8\0\uf410\0\uf468\0\uf4c0"+
+    "\0\uf518\0\uf570\0\uf5c8\0\uf620\0\uf678\0\uf6d0\0\uf728\0\uf780"+
+    "\0\uf7d8\0\uf830\0\uf888\0\uf8e0\0\uf938\0\uf990\0\uf9e8\0\ufa40"+
+    "\0\ufa98\0\ufaf0\0\ufb48\0\ufba0\0\ufbf8\0\ufc50\0\ufca8\0\ufd00"+
+    "\0\ufd58\0\ufdb0\0\ufe08\0\ufe60\0\ufeb8\0\uff10\0\uff68\0\uffc0"+
+    "\1\30\1\160\1\310\1\u0120\1\u0178\1\u01d0\1\u0228\1\u0280"+
+    "\1\u02d8\1\u0330\1\u0388\1\u03e0\1\u0438\1\u0490\1\u04e8\1\u0540"+
+    "\1\u0598\1\u05f0\0\u3390\1\u0648\1\u06a0\1\u06f8\0\ud208\1\u0750"+
+    "\1\u07a8\1\u0800\1\u0858\1\u08b0\1\u0908\1\u0960\1\u09b8\1\u0a10"+
+    "\1\u0a68\1\u0a68\1\u0ac0\1\u0b18\1\u0b70\1\u0bc8\1\u0c20\1\u0c78"+
+    "\1\u0cd0\1\u0d28\1\u0d80\1\u0dd8\1\u0e30\1\u0e88\1\u0ee0\1\u0f38"+
+    "\0\u9ed0\1\u0f90\1\u0fe8\1\u1040\1\u1098\1\u10f0\1\u1148\1\u11a0"+
+    "\1\u11f8\1\u1250\1\u12a8\1\u1300\1\u1358\1\u13b0\1\u1408\1\u1460"+
+    "\1\u14b8\1\u1510\1\u1568\1\u15c0\1\u1618\0\ueac8\1\u1670\1\u16c8"+
+    "\0\uec28\1\u1720\1\u1778\1\u17d0\1\u1828\1\u1880\1\u18d8\1\u1930"+
+    "\1\u1988\1\u19e0\1\u1a38\1\u1a90\1\u1ae8\1\u1b40\1\u1b98\1\u1bf0"+
+    "\1\u1c48\1\u1ca0\1\u1cf8\1\u1d50\1\u1da8\1\u1e00\1\u1e58\1\u1eb0"+
+    "\1\u1f08\1\u1f60\1\u1fb8\1\u2010\1\u2068\1\u20c0\1\u2118\1\u2170"+
+    "\1\u21c8\1\u2220\1\u2278\1\u22d0\1\u2328\1\u2380\1\u23d8\1\u2430"+
+    "\1\u2488\1\u24e0\1\u2538\1\u2590\1\u25e8\1\u2640\1\u2698\1\u26f0"+
+    "\1\u2748\1\u27a0\1\u27f8\1\u2850\1\u28a8\1\u2900\1\u2958\1\u29b0"+
+    "\1\u2a08\1\u2a60\1\u2ab8\1\u2b10\1\u2b68\1\u2bc0\1\u2c18\1\u2c70"+
+    "\1\u2cc8\1\u2d20\1\u2d78\1\u2dd0\1\u2e28\1\u2e80\1\u2ed8\1\u2f30"+
+    "\1\u2f88\1\u2fe0\1\u3038\1\u3090\1\u30e8\1\u3140\1\u3198\1\u31f0"+
+    "\1\u3248\1\u32a0\1\u32f8\1\u3350\1\u33a8\1\u3400\1\u3458\1\u34b0"+
+    "\1\u3508\1\u3560\1\u35b8\1\u3610\1\u3668\1\u36c0\1\u3718\1\u3770"+
+    "\1\u37c8\1\u3820\1\u3878\1\u38d0\1\u3928\1\u3980\1\u39d8\1\u3a30"+
+    "\1\u3a88\1\u3ae0\1\u3b38\1\u3b90\1\u3be8\1\u3c40\1\u3c98\1\u3cf0"+
+    "\1\u3d48\1\u3da0\1\u3df8\1\u3e50\1\u3ea8\1\u3f00\1\u3f58\1\u3fb0"+
+    "\1\u4008\1\u4060\1\u40b8\1\u4110\1\u4168\1\u41c0\1\u4218\1\u4270"+
+    "\1\u42c8\1\u4320\1\u4378\1\u43d0\1\u4428\1\u4480\1\u44d8\1\u4530"+
+    "\1\u4588\1\u45e0\1\u4638\1\u4690\1\u46e8\1\u4740\1\u4798\1\u47f0"+
+    "\1\u4848\1\u48a0\1\u48f8\1\u4950\0\u1760\1\u49a8\1\u4a00\1\u4a58"+
+    "\1\u4ab0\1\u4b08\1\u4b60\1\u4bb8\1\u4c10\1\u4c68\1\u4cc0\1\u4d18"+
+    "\1\u4d70\1\u4dc8\1\u4e20\1\u4e78\1\u4ed0\1\u4f28\1\u4f80\1\u4fd8"+
+    "\1\u5030\1\u5088\1\u50e0\0\u3700\1\u5138\1\u5190\1\u51e8\1\u5240"+
+    "\1\u5298\1\u52f0\1\u5348\1\u53a0\1\u53f8\1\u5450\1\u54a8\1\u5500"+
+    "\1\u5558\1\u55b0\1\u5608\1\u5660\1\u56b8\1\u5710\1\u5768\1\u57c0"+
+    "\1\u5818\1\u5870\1\u58c8\1\u5920\1\u5978\1\u59d0\1\u5a28\1\u5a80"+
+    "\1\u5ad8\1\u5b30\1\u5b88\1\u5be0\1\u5c38\1\u5c90\1\u5ce8\1\u5d40"+
+    "\1\u5d98\1\u5df0\1\u5e48\1\u5ea0\1\u5ef8\1\u5f50\1\u5fa8\1\u6000"+
+    "\1\u6058\1\u60b0\1\u6108\1\u6160\1\u61b8\1\u6210\1\u6268\1\u62c0"+
+    "\1\u6318\1\u6370\1\u63c8\1\u6420\1\u6478\1\u64d0\1\u6528\1\u6580"+
+    "\1\u65d8\1\u6630\1\u6688\1\u66e0\1\u6738\1\u6790\1\u67e8\1\u6840"+
+    "\1\u6898\1\u68f0\1\u6948\1\u69a0\1\u69f8\1\u6a50\1\u6aa8\1\u6b00"+
+    "\1\u6b58\1\u6bb0\1\u6c08\1\u6c60\1\u6cb8\1\u6d10\1\u6d68\1\u6dc0"+
+    "\1\u6e18\1\u6e70\1\u6ec8\1\u6f20\1\u6f78\1\u6fd0\1\u7028\1\u7080"+
+    "\1\u70d8\1\u7130\1\u7188\1\u71e0\1\u7238\1\u7290\1\u72e8\1\u7340"+
+    "\1\u7398\1\u73f0\1\u7448\1\u74a0\1\u74f8\1\u7550\1\u75a8\1\u7600"+
+    "\1\u7658\1\u76b0\1\u7708\1\u7760\1\u77b8\1\u7810\1\u7868\1\u78c0"+
+    "\1\u7918\1\u7970\1\u79c8\1\u7a20\1\u7a78\1\u7ad0\1\u7b28\1\u7b80"+
+    "\1\u7bd8\1\u7c30\1\u7c88\1\u7ce0\1\u7d38\1\u7d90\0\u07e8\1\u7de8"+
+    "\0\u07e8\0\u07e8\1\u7e40\1\u7e98\1\u7ef0\1\u7f48\1\u7fa0\1\u7ff8"+
+    "\1\u8050\1\u80a8\1\u8100\1\u8158\1\u81b0\1\u8208\1\u8260\1\u82b8"+
+    "\1\u8310\1\u8368\1\u83c0\1\u8418\1\u8470\1\u84c8\1\u8520\1\u8578"+
+    "\1\u85d0\1\u8628\1\u8680\1\u86d8\1\u8730\1\u8788\1\u87e0\1\u8838"+
+    "\1\u8890\1\u88e8\1\u8940\1\u8998\1\u89f0\1\u8a48\1\u8aa0\1\u8af8"+
+    "\1\u8b50\1\u8ba8\1\u8c00\1\u8c58\1\u8cb0\1\u8d08\1\u8d60\1\u8db8"+
+    "\1\u8e10\1\u8e68\1\u8ec0\1\u8f18\1\u8f70\1\u8fc8\1\u9020\1\u9078"+
+    "\1\u90d0\1\u9128\1\u9180\1\u91d8\1\u9230\1\u9288\1\u92e0\1\u9338"+
+    "\1\u9390\1\u93e8\1\u9440\1\u9498\1\u94f0\1\u9548\1\u95a0\1\u95f8"+
+    "\1\u9650\1\u96a8\1\u9700\1\u9758\1\u97b0\1\u9808\1\u9860\1\u98b8"+
+    "\1\u9910\1\u9968\1\u99c0\1\u9a18\1\u9a70\1\u9ac8\1\u9b20\1\u9b78"+
+    "\1\u9bd0\1\u9c28\1\u9c80\1\u9cd8\1\u9d30\1\u9d88\1\u9de0\1\u9e38"+
+    "\1\u9e90\1\u9ee8\1\u9f40\1\u9f98\1\u9ff0\1\ua048\1\ua0a0\1\ua0f8"+
+    "\1\ua150\1\ua1a8\1\ua200\1\ua258\1\ua2b0\1\ua308\1\ua360\1\ua3b8"+
+    "\1\ua410\1\ua468\1\ua4c0\1\ua518\1\ua570\1\ua5c8\1\ua620\1\ua678"+
+    "\1\ua6d0\1\ua728\1\ua780\1\ua7d8\1\ua830\1\ua888\1\ua8e0\1\ua938"+
+    "\1\ua990\1\ua9e8\1\uaa40\1\uaa98\1\uaaf0\1\uab48\1\uaba0\1\uabf8"+
+    "\1\uac50\1\uaca8\1\uad00\1\uad58\1\uadb0\1\uae08\1\uae60\1\uaeb8"+
+    "\0\u07e8\1\uaf10\1\uaf68\1\uafc0\1\ub018\1\ub070\1\ub0c8\1\ub120"+
+    "\1\ub178\1\ub1d0\1\ub228\1\ub280\1\ub2d8\1\ub330\1\ub388\1\ub3e0"+
+    "\1\ub438\1\ub490\1\ub4e8\1\ub540\1\ub598\1\ub5f0\1\ub648\1\ub6a0"+
+    "\1\ub6f8\1\ub750\1\ub7a8\1\ub800\1\ub858\1\ub8b0\1\ub908\1\ub960"+
+    "\1\ub9b8\1\uba10\1\uba68\1\ubac0\1\ubb18\1\ubb70\1\ubbc8\1\ubc20"+
+    "\1\ubc78\1\ubcd0\1\ubd28\1\ubd80\1\ubdd8\1\ube30\1\ube88\1\ubee0"+
+    "\1\ubf38\1\ubf90\1\ubfe8\1\uc040\1\uc098\1\uc0f0\1\uc148\1\uc1a0"+
+    "\1\uc1f8\1\uc250\1\uc2a8\1\uc300\1\uc358\1\uc3b0\1\uc408\1\uc460"+
+    "\1\uc4b8\1\uc510\1\uc568\1\uc5c0\1\uc618\1\uc670\1\uc6c8\1\uc720"+
+    "\1\uc778\1\uc7d0\1\uc828\1\uc880\1\uc8d8\1\uc930\1\uc988\1\uc9e0"+
+    "\1\uca38\1\uca90\1\ucae8\1\ucb40\1\ucb98\1\ucbf0\1\ucc48\1\ucca0"+
+    "\1\uccf8\1\ucd50\1\ucda8\1\uce00\1\uce58\1\uceb0\1\ucf08\1\ucf60"+
+    "\1\ucfb8\1\ud010\1\ud068\1\ud0c0\1\ud118\1\ud170\1\ud1c8\1\ud220"+
+    "\1\ud278\1\ud2d0\1\ud328\1\ud380\1\ud3d8\1\ud430\1\ud488\1\ud4e0"+
+    "\1\ud538\1\ud590\1\ud5e8\1\ud640";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1460];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\26\1\27\1\30\1\31\1\32\1\33\122\26\2\34"+
+    "\1\35\45\34\1\36\1\34\1\37\14\34\1\40\11\34"+
+    "\1\41\26\34\2\42\1\43\61\42\1\44\43\42\2\45"+
+    "\1\46\16\45\1\47\106\45\2\50\1\0\1\51\1\52"+
+    "\2\50\1\53\1\54\1\55\1\56\6\50\1\57\106\50"+
+    "\2\60\1\0\1\60\1\61\2\60\4\61\1\62\1\63"+
+    "\1\64\1\65\1\66\1\67\1\61\6\60\1\70\2\60"+
+    "\1\71\1\64\1\67\1\72\1\70\6\60\1\73\2\74"+
+    "\1\75\2\60\1\75\1\76\1\73\1\62\7\60\1\77"+
+    "\1\100\1\101\1\66\1\63\1\60\1\65\1\102\1\103"+
+    "\1\101\1\60\1\104\4\60\1\76\1\100\1\72\1\60"+
+    "\1\103\1\71\1\60\1\102\1\105\1\104\1\77\3\60"+
+    "\1\105\2\60\3\106\1\107\4\106\1\110\117\106\3\111"+
+    "\1\107\5\111\1\110\116\111\1\50\1\112\1\0\1\51"+
+    "\1\32\2\50\1\53\1\113\1\114\1\115\6\50\1\116"+
+    "\106\50\3\106\1\107\4\106\1\117\117\106\3\111\1\107"+
+    "\5\111\1\117\116\111\1\120\1\32\1\121\1\122\1\32"+
+    "\1\123\1\124\1\125\1\126\1\127\1\130\3\131\1\132"+
+    "\2\131\1\133\2\125\2\131\1\134\1\135\1\131\1\134"+
+    "\1\120\1\136\1\137\1\140\1\141\1\142\1\134\1\143"+
+    "\1\120\1\131\1\125\3\131\1\144\1\131\1\145\1\146"+
+    "\1\147\1\150\1\151\1\152\1\153\1\124\1\154\1\125"+
+    "\3\53\2\131\1\155\1\156\1\157\1\131\1\160\3\131"+
+    "\1\161\1\162\1\120\1\131\1\163\1\153\2\131\1\164"+
+    "\10\131\1\134\4\131\1\153\2\165\1\166\5\165\1\167"+
+    "\21\165\1\170\75\165\2\171\1\172\6\171\1\173\20\171"+
+    "\1\174\75\171\2\175\1\176\1\177\40\175\1\200\3\175"+
+    "\1\201\16\175\1\202\11\175\1\203\26\175\2\204\1\205"+
+    "\1\206\44\204\1\201\16\204\1\202\11\204\1\203\26\204"+
+    "\2\34\1\207\45\34\1\36\1\34\1\210\14\34\1\40"+
+    "\11\34\1\41\26\34\2\211\1\212\1\213\40\211\1\214"+
+    "\3\211\1\215\16\211\1\216\11\211\1\217\1\211\1\220"+
+    "\23\211\1\221\1\120\1\32\1\222\1\223\1\32\1\123"+
+    "\1\124\1\125\1\224\1\225\1\226\1\227\1\230\1\231"+
+    "\1\232\1\233\1\234\1\133\1\235\1\125\2\131\1\134"+
+    "\1\135\1\236\1\134\1\120\1\131\1\237\1\240\1\141"+
+    "\1\142\1\134\1\143\1\120\1\131\1\125\1\131\1\241"+
+    "\1\242\1\243\1\244\1\145\1\146\1\245\1\246\1\151"+
+    "\1\247\1\153\1\124\1\154\1\125\3\53\2\131\1\250"+
+    "\1\251\1\157\1\131\1\252\2\131\1\253\1\254\1\255"+
+    "\1\256\1\131\1\163\1\153\1\257\1\260\1\261\1\131"+
+    "\1\262\1\263\3\131\1\264\1\131\1\134\4\131\1\153"+
+    "\2\265\1\266\41\265\1\267\3\265\1\36\16\265\1\40"+
+    "\11\265\1\41\26\265\1\270\1\271\1\0\1\270\1\32"+
+    "\2\270\1\53\1\272\1\273\1\274\6\270\1\275\1\276"+
+    "\12\270\1\277\34\270\1\300\2\270\1\301\32\270\2\26"+
+    "\4\0\123\26\1\27\2\0\1\32\1\0\122\26\142\0"+
+    "\1\302\1\303\5\304\1\0\1\305\1\306\1\304\1\0"+
+    "\4\304\1\0\6\304\4\0\5\304\2\0\3\304\1\303"+
+    "\4\0\1\307\2\0\14\304\1\0\2\304\1\0\20\304"+
+    "\2\0\1\32\2\0\1\32\123\0\4\33\1\0\1\33"+
+    "\1\310\121\33\2\34\1\0\45\34\1\0\1\34\1\0"+
+    "\14\34\1\0\11\34\1\0\26\34\35\0\1\311\37\0"+
+    "\1\312\104\0\1\313\112\0\1\314\173\0\1\315\26\0"+
+    "\2\42\1\0\61\42\1\0\43\42\21\0\1\316\106\0"+
+    "\2\45\1\0\16\45\1\0\106\45\2\50\1\0\1\50"+
+    "\1\0\2\50\4\0\6\50\1\0\110\50\1\0\1\50"+
+    "\1\0\2\50\4\0\6\50\1\0\1\317\105\50\21\0"+
+    "\1\57\106\0\2\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\110\60\1\0\1\60\1\0\2\60\4\0"+
+    "\1\60\1\320\2\60\1\321\1\322\1\0\11\60\1\323"+
+    "\1\60\1\322\13\60\1\324\2\60\1\324\1\325\12\60"+
+    "\1\326\1\60\1\321\1\320\3\60\1\327\7\60\1\325"+
+    "\1\326\2\60\1\327\1\323\15\60\1\0\1\60\1\0"+
+    "\2\60\4\0\3\60\1\330\2\60\1\0\27\60\1\331"+
+    "\2\60\1\331\1\332\12\60\1\333\4\60\1\330\11\60"+
+    "\1\332\1\333\21\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\11\60\1\334\60\60\1\334\15\60\1\0"+
+    "\1\60\1\0\2\60\4\0\1\335\5\60\1\0\14\60"+
+    "\1\336\7\60\1\337\2\340\5\60\1\337\1\335\17\60"+
+    "\1\341\11\60\1\336\1\60\1\341\16\60\1\0\1\60"+
+    "\1\0\2\60\4\0\2\60\1\342\3\60\1\0\12\60"+
+    "\1\342\11\60\1\343\6\60\1\344\1\343\30\60\1\344"+
+    "\22\60\1\0\1\60\1\0\2\60\4\0\2\60\1\105"+
+    "\1\345\1\60\1\105\1\0\6\60\1\346\3\60\2\105"+
+    "\1\60\1\346\7\60\2\347\1\350\2\60\1\350\1\351"+
+    "\11\60\1\352\1\60\1\105\3\60\1\345\2\60\1\105"+
+    "\6\60\1\351\11\60\1\352\10\60\1\0\1\60\1\0"+
+    "\2\60\4\0\2\60\1\105\1\341\2\60\1\0\11\60"+
+    "\1\353\1\105\11\60\1\354\6\60\1\355\1\354\11\60"+
+    "\1\356\1\357\3\60\1\341\2\60\1\357\4\60\1\360"+
+    "\1\60\1\355\1\356\3\60\1\353\1\360\14\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\24\60\1\105"+
+    "\7\60\1\105\53\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\27\60\1\361\2\60\1\361\1\362\12\60"+
+    "\1\363\16\60\1\362\1\363\21\60\1\0\1\60\1\0"+
+    "\2\60\4\0\3\60\1\364\2\60\1\0\27\60\1\365"+
+    "\2\60\1\365\1\366\17\60\1\364\11\60\1\366\22\60"+
+    "\1\0\1\60\1\0\2\60\4\0\2\60\1\367\1\370"+
+    "\2\60\1\0\12\60\1\367\33\60\1\371\4\60\1\370"+
+    "\12\60\1\371\21\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\55\60\1\372\2\60\1\373\10\60\1\372"+
+    "\4\60\1\373\11\60\1\0\1\60\1\0\2\60\4\0"+
+    "\1\374\1\375\1\376\1\60\1\377\1\60\1\0\6\60"+
+    "\1\u0100\2\60\1\u0101\1\376\2\60\1\u0100\17\60\1\374"+
+    "\11\60\1\u0102\1\377\1\375\4\60\1\u0102\13\60\1\u0101"+
+    "\15\60\1\0\1\60\1\0\2\60\4\0\2\60\1\105"+
+    "\2\60\1\u0103\1\0\12\60\1\105\1\u0103\2\60\1\105"+
+    "\10\60\1\u0104\2\60\1\u0104\45\60\1\105\7\60\1\0"+
+    "\1\60\1\0\2\60\4\0\4\60\1\u0105\1\60\1\0"+
+    "\6\60\1\u0106\2\60\1\u0107\3\60\1\u0106\6\60\1\105"+
+    "\7\60\1\105\13\60\1\u0105\21\60\1\u0107\15\60\1\0"+
+    "\1\60\1\0\2\60\4\0\3\60\1\u0108\1\60\1\105"+
+    "\1\0\13\60\1\105\10\60\1\105\2\u0109\1\u010a\2\60"+
+    "\1\u010a\1\u010b\1\105\12\60\1\105\3\60\1\u0108\2\60"+
+    "\1\105\6\60\1\u010b\22\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\6\60\1\u010c\6\60\1\u010c\11\60"+
+    "\1\u010d\2\60\1\u010d\55\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\11\60\1\u010e\15\60\1\u010f\2\60"+
+    "\1\u010f\1\u0110\31\60\1\u0110\4\60\1\u010e\15\60\1\0"+
+    "\1\60\1\0\2\60\4\0\3\60\1\u0111\2\60\1\0"+
+    "\33\60\1\u0112\17\60\1\u0111\11\60\1\u0112\20\60\3\106"+
+    "\1\0\4\106\1\0\117\106\22\0\1\u0113\105\0\3\111"+
+    "\1\0\5\111\1\0\116\111\1\50\1\112\1\0\1\50"+
+    "\1\32\2\50\4\0\6\50\1\0\106\50\21\0\1\u0114"+
+    "\106\0\1\120\12\0\6\120\3\0\15\120\1\0\2\120"+
+    "\1\0\5\120\2\0\4\120\7\0\17\120\1\0\20\120"+
+    "\4\0\1\u0115\3\0\1\53\2\0\1\u0116\7\0\1\u0117"+
+    "\112\0\1\53\1\0\1\53\127\0\1\53\120\0\7\u0118"+
+    "\1\u0119\2\u0118\1\u011a\17\u0118\1\u011b\11\u0118\1\u011c\63\u0118"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\3\131\1\u011e\2\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\10\0\1\53\11\0\1\u011f\106\0"+
+    "\1\u0120\12\0\6\u0120\3\0\2\u0120\2\134\1\u0120\1\134"+
+    "\6\u0120\1\134\1\0\2\u0120\1\0\1\u0120\1\u0121\2\u0122"+
+    "\1\u0123\1\0\1\u0124\1\u0123\1\u0120\1\u0121\1\u0120\7\0"+
+    "\2\u0120\1\u0122\6\u0120\1\u0122\5\u0120\1\0\13\u0120\1\134"+
+    "\4\u0120\1\0\1\u0120\12\0\6\u0120\3\0\2\u0120\1\u0125"+
+    "\1\u0126\1\u0120\1\u0126\6\u0120\1\u0126\1\0\2\u0120\1\0"+
+    "\1\u0127\1\u0121\2\u0122\1\u0123\1\0\1\u0124\1\u0123\1\u0120"+
+    "\1\u0121\1\u0120\7\0\2\u0120\1\u0122\2\u0120\1\u0127\3\u0120"+
+    "\1\u0122\5\u0120\1\0\13\u0120\1\u0126\4\u0120\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u0128\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u0129\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\131\1\u012a\4\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\1\u012b\13\131\1\120"+
+    "\1\u012c\1\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\u012d\5\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u012e\1\u012f\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u0130\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\1\131\1\u0131"+
+    "\12\131\1\120\1\u0132\1\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\u0133\5\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u0134\1\u0135"+
+    "\1\131\7\0\1\131\1\u0136\4\131\1\u0137\5\131\1\120"+
+    "\2\131\1\0\20\131\10\0\1\53\42\0\1\53\103\0"+
+    "\2\u0124\1\0\1\u0124\6\0\1\u0124\61\0\1\u0124\5\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u0138"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u0139\1\u013a\7\0\5\131\1\u013b\5\131\1\u013c\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\4\131\1\u013d\1\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\131\1\u013e\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\u013f\1\131\1\u0140\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\u0141\11\131\1\u0142\1\131"+
+    "\1\120\1\u0143\1\131\1\0\20\131\10\0\1\53\52\0"+
+    "\1\53\45\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\u0144"+
+    "\3\131\7\0\1\131\1\u0145\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\u0146\1\u0147\4\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u0148\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\131\1\u0149\1\u014a\1\131\7\0\1\u014b\1\u014c\12\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\3\131\1\u014d\2\131\1\0\1\120"+
+    "\1\131\1\0\3\131\1\u014e\1\131\2\0\3\131\1\u014f"+
+    "\7\0\10\131\1\u0150\3\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\u0151\5\131\1\u0152\5\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0136"+
+    "\2\131\7\0\1\131\1\u0153\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\131\1\u0154\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0155"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\2\165\1\0\5\165\1\0\21\165\1\0\75\165\2\u0156"+
+    "\1\0\30\u0156\1\u0157\40\u0156\1\u0158\33\u0156\2\171\1\0"+
+    "\6\171\1\0\20\171\1\0\75\171\2\175\2\0\40\175"+
+    "\1\0\3\175\1\0\16\175\1\0\11\175\1\0\26\175"+
+    "\12\0\1\u0159\127\0\1\u015a\152\0\1\u015b\37\0\1\u015c"+
+    "\67\0\1\u015d\173\0\1\u015e\26\0\2\204\2\0\44\204"+
+    "\1\0\16\204\1\0\11\204\1\0\26\204\12\0\1\u015f"+
+    "\167\0\1\u0160\55\0\2\211\2\0\40\211\1\0\3\211"+
+    "\1\0\16\211\1\0\11\211\1\0\1\211\1\0\23\211"+
+    "\13\0\1\u0161\6\u0162\1\u0163\2\0\1\u0162\3\0\1\u0162"+
+    "\2\0\5\u0162\5\0\5\u0162\2\0\4\u0162\7\0\14\u0162"+
+    "\1\0\2\u0162\1\0\13\u0162\1\0\4\u0162\13\0\1\u0164"+
+    "\152\0\1\u0165\37\0\1\u0166\67\0\1\u0167\173\0\1\u0168"+
+    "\62\0\1\u0169\1\u016a\16\0\1\u016b\1\u016c\1\0\1\u016d"+
+    "\10\0\1\u016e\1\u016f\1\u0170\1\u0171\1\0\1\u0172\4\0"+
+    "\1\u0173\130\0\1\u0174\27\0\1\u0115\3\0\1\53\120\0"+
+    "\2\224\1\u0175\5\224\1\u0176\21\224\1\u0177\75\224\2\u0178"+
+    "\1\u0179\6\u0178\1\u017a\20\u0178\1\u017b\75\u0178\7\0\1\53"+
+    "\2\0\1\u017c\31\0\1\u017d\63\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u017e\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u017f\3\131\7\0\1\u0180"+
+    "\13\131\1\120\1\u0181\1\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\2\131\1\u0182\1\131\7\0"+
+    "\1\u0183\1\u0184\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\u0185\5\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u0186\3\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u0187\1\u0188"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u0189\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u018a\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\131\1\u018b\2\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\u018c\13\131\1\120\1\u018d\1\131\1\0\20\131"+
+    "\10\0\1\53\11\0\1\u018e\106\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u018f\12\131\1\120"+
+    "\1\u0190\1\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\u0191\3\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u012a\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\u012b\13\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\131\1\u0192\4\131\1\u0193\5\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\2\131\1\u0194\1\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\131\1\u0134\1\u0135\1\131\7\0\1\131\1\u0136\4\131"+
+    "\1\u0137\5\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u0195\1\131"+
+    "\1\u0196\2\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\5\131\1\u0197\6\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\3\131\1\u0138\2\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\2\131\1\u0139\1\131\7\0\5\131\1\u0198\6\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\4\131\1\u013d\1\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u0199\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\u013f\1\131\1\u019a\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\u0141"+
+    "\11\131\1\u0142\1\131\1\120\1\u0143\1\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u019b\3\131"+
+    "\7\0\1\131\1\u0145\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\u0146"+
+    "\1\u0147\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\131\1\u019c\2\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\3\131\1\u019d\2\131\1\0\1\120\1\131\1\0\3\131"+
+    "\1\u014e\1\131\2\0\4\131\7\0\10\131\1\u0150\3\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u019e\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\1\u0151\13\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\131\1\u0153\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\u019f\3\0\2\u019f\2\120\1\u019f"+
+    "\2\120\5\u019f\1\120\1\0\1\120\1\u019f\1\0\5\u019f"+
+    "\2\0\4\u019f\7\0\14\u019f\1\120\2\u019f\1\0\13\u019f"+
+    "\1\120\4\u019f\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\u01a0\1\u01a1\2\131\1\u01a2\1\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u01a3\7\0\3\131"+
+    "\1\u01a4\10\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\u01a5\3\131\1\u01a6"+
+    "\1\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\u01a7\5\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u01a8\3\131\7\0"+
+    "\1\131\1\u01a9\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u01aa\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u01ab\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u01ac\3\131\7\0\1\131\1\u01ad"+
+    "\4\131\1\u01ae\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\2\265\1\0\41\265\1\0\3\265\1\0\16\265\1\0"+
+    "\11\265\1\0\26\265\12\0\1\u01af\115\0\2\270\1\0"+
+    "\1\270\1\0\2\270\4\0\6\270\1\0\107\270\1\271"+
+    "\1\0\1\270\1\32\2\270\4\0\6\270\1\0\106\270"+
+    "\10\272\1\u0176\117\272\11\273\1\u01b0\116\273\2\270\1\0"+
+    "\1\270\1\0\2\270\4\0\6\270\1\u01b1\110\270\1\0"+
+    "\1\270\1\0\2\270\4\0\6\270\1\0\33\270\1\u01b2"+
+    "\54\270\1\0\1\270\1\0\2\270\4\0\6\270\1\0"+
+    "\33\270\1\u01b3\54\270\1\0\1\270\1\0\2\270\4\0"+
+    "\6\270\1\0\14\270\1\u01b4\71\270\13\0\6\u01b5\3\0"+
+    "\1\u01b5\1\0\4\u01b5\1\0\6\u01b5\4\0\5\u01b5\2\0"+
+    "\4\u01b5\7\0\14\u01b5\1\0\2\u01b5\1\0\20\u01b5\14\0"+
+    "\1\304\1\u01b6\4\304\3\0\1\304\1\0\4\304\1\0"+
+    "\6\304\4\0\5\304\2\0\4\304\7\0\4\304\1\u01b6"+
+    "\7\304\1\0\2\304\1\0\20\304\14\0\6\304\3\0"+
+    "\1\304\1\0\4\304\1\0\6\304\4\0\5\304\2\0"+
+    "\4\304\7\0\14\304\1\0\2\304\1\0\20\304\10\0"+
+    "\1\u01b7\13\0\1\u01b7\26\0\1\u01b8\30\0\1\u01b9\76\0"+
+    "\1\u01ba\147\0\1\u01bb\113\0\1\u01bc\72\0\1\u01bd\143\0"+
+    "\1\u01be\173\0\1\u01bf\26\0\2\50\1\0\1\50\1\0"+
+    "\2\50\1\u01b7\3\0\6\50\1\0\1\50\1\u01c0\104\50"+
+    "\2\60\1\0\1\60\1\0\2\60\4\0\2\60\1\u01c1"+
+    "\3\60\1\0\12\60\1\u01c1\75\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\33\60\1\u01c2\31\60\1\u01c2"+
+    "\22\60\1\0\1\60\1\0\2\60\4\0\2\60\1\u01c3"+
+    "\3\60\1\0\12\60\1\u01c3\47\60\1\334\5\60\1\334"+
+    "\17\60\1\0\1\60\1\0\2\60\4\0\4\60\1\105"+
+    "\1\60\1\0\6\60\1\105\6\60\1\105\32\60\1\105"+
+    "\37\60\1\0\1\60\1\0\2\60\4\0\1\60\1\u01c4"+
+    "\1\u01c5\3\60\1\0\12\60\1\u01c5\11\60\1\u01c6\7\60"+
+    "\1\u01c6\14\60\1\u01c4\36\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\55\60\1\u01c7\13\60\1\u01c7\16\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\11\60"+
+    "\1\u01c8\60\60\1\u01c8\15\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\33\60\1\u01c9\31\60\1\u01c9\22\60"+
+    "\1\0\1\60\1\0\2\60\4\0\5\60\1\u01ca\1\0"+
+    "\13\60\1\u01ca\74\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\14\60\1\u01cb\52\60\1\u01cb\20\60\1\0"+
+    "\1\60\1\0\2\60\4\0\4\60\1\u01c4\1\60\1\0"+
+    "\14\60\1\u01cc\33\60\1\u01c4\16\60\1\u01cc\20\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\24\60\1\u01cd"+
+    "\7\60\1\u01cd\12\60\1\u01ca\5\60\1\u01ce\1\u01ca\12\60"+
+    "\1\u01ce\16\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\24\60\1\u01ca\7\60\1\u01ca\53\60\1\0\1\60"+
+    "\1\0\2\60\4\0\3\60\1\u01cf\2\60\1\0\53\60"+
+    "\1\u01cf\34\60\1\0\1\60\1\0\2\60\4\0\1\105"+
+    "\3\60\1\u01d0\1\60\1\0\35\60\1\105\12\60\1\u01d0"+
+    "\37\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\33\60\1\u01d1\31\60\1\u01d1\22\60\1\0\1\60\1\0"+
+    "\2\60\4\0\2\60\1\u01d2\3\60\1\0\12\60\1\u01d2"+
+    "\75\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\63\60\1\105\7\60\1\105\14\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\27\60\1\105\2\60\1\105"+
+    "\13\60\1\u01d3\17\60\1\u01d3\21\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\33\60\1\u01d4\31\60\1\u01d4"+
+    "\22\60\1\0\1\60\1\0\2\60\4\0\2\60\1\u01d5"+
+    "\3\60\1\0\12\60\1\u01d5\75\60\1\0\1\60\1\0"+
+    "\2\60\4\0\5\60\1\334\1\0\13\60\1\334\41\60"+
+    "\1\u01ca\13\60\1\u01ca\16\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\46\60\1\356\17\60\1\356\21\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\46\60"+
+    "\1\u01d6\17\60\1\u01d6\21\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\23\60\1\u01d7\26\60\1\u01d7\35\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\6\60"+
+    "\1\334\6\60\1\334\72\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\27\60\1\u01d8\2\60\1\u01d8\55\60"+
+    "\1\0\1\60\1\0\2\60\4\0\5\60\1\u01d9\1\0"+
+    "\13\60\1\u01d9\74\60\1\0\1\60\1\0\2\60\4\0"+
+    "\3\60\1\u01da\2\60\1\0\46\60\1\u01db\4\60\1\u01da"+
+    "\12\60\1\u01db\21\60\1\0\1\60\1\0\2\60\4\0"+
+    "\1\u01dc\5\60\1\0\35\60\1\u01dc\52\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\47\60\1\u01dd\6\60"+
+    "\1\u01dd\31\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\46\60\1\105\17\60\1\105\21\60\1\0\1\60"+
+    "\1\0\2\60\4\0\1\u01de\5\60\1\0\35\60\1\u01de"+
+    "\52\60\1\0\1\60\1\0\2\60\4\0\1\u01df\5\60"+
+    "\1\0\35\60\1\u01df\52\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\60\60\1\105\15\60\1\105\11\60"+
+    "\1\0\1\60\1\0\2\60\4\0\1\u01e0\5\60\1\0"+
+    "\6\60\1\u0112\6\60\1\u0112\6\60\1\337\2\u01e1\1\u01e2"+
+    "\2\60\1\u01e2\1\60\1\337\1\u01e0\52\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\14\60\1\u01e3\52\60"+
+    "\1\u01e3\20\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\63\60\1\u01e4\7\60\1\u01e4\14\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\6\60\1\u01e5\6\60"+
+    "\1\u01e5\44\60\1\u01e6\5\60\1\u01e6\17\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\33\60\1\u01e7\31\60"+
+    "\1\u01e7\22\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\27\60\1\u01e8\2\60\1\u01e8\30\60\1\u01e9\7\60"+
+    "\1\u01e9\14\60\1\0\1\60\1\0\2\60\4\0\2\60"+
+    "\1\u01ea\3\60\1\0\12\60\1\u01ea\1\60\1\u01df\31\60"+
+    "\1\u01cb\17\60\1\u01cb\1\u01df\20\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\6\60\1\u01eb\6\60\1\u01eb"+
+    "\72\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\27\60\1\u01ec\2\60\1\u01ec\55\60\1\0\1\60\1\0"+
+    "\2\60\4\0\3\60\1\u01ed\2\60\1\0\53\60\1\u01ed"+
+    "\34\60\1\0\1\60\1\0\2\60\4\0\2\60\1\u01ee"+
+    "\3\60\1\0\12\60\1\u01ee\75\60\1\0\1\60\1\0"+
+    "\2\60\4\0\5\60\1\u01ef\1\0\13\60\1\u01ef\13\60"+
+    "\1\u01f0\2\60\1\u01f0\55\60\1\0\1\60\1\0\2\60"+
+    "\4\0\4\60\1\u01f1\1\60\1\0\50\60\1\u01f1\37\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\6\60"+
+    "\1\u0112\6\60\1\u0112\72\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\47\60\1\u01f2\6\60\1\u01f2\31\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\47\60"+
+    "\1\u01f3\6\60\1\u01f3\31\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\55\60\1\u01f4\13\60\1\u01f4\16\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\33\60"+
+    "\1\u01f5\31\60\1\u01f5\22\60\1\0\1\60\1\0\2\60"+
+    "\4\0\5\60\1\u01f6\1\0\13\60\1\u01f6\74\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\101\60\1\u01c6"+
+    "\2\60\1\u01c6\3\60\1\0\1\60\1\0\2\60\4\0"+
+    "\5\60\1\u01f7\1\0\13\60\1\u01f7\74\60\1\0\1\60"+
+    "\1\0\2\60\4\0\2\60\1\105\3\60\1\0\12\60"+
+    "\1\105\20\60\1\u01f8\24\60\1\105\4\60\1\u01f8\10\60"+
+    "\1\105\11\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\14\60\1\105\52\60\1\105\20\60\1\0\1\60"+
+    "\1\0\2\60\4\0\5\60\1\u01f9\1\0\13\60\1\u01f9"+
+    "\10\60\1\105\7\60\1\105\53\60\1\0\1\60\1\0"+
+    "\2\60\4\0\5\60\1\u01fa\1\0\13\60\1\u01fa\74\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\47\60"+
+    "\1\105\6\60\1\105\31\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\62\60\1\u01fb\5\60\1\u01fb\17\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\24\60"+
+    "\1\u01fc\7\60\1\u01fc\53\60\1\0\1\60\1\0\2\60"+
+    "\4\0\5\60\1\u01fd\1\0\13\60\1\u01fd\1\u01fe\52\60"+
+    "\1\u01fe\20\60\1\0\1\60\1\0\2\60\4\0\2\60"+
+    "\1\u01ff\1\60\1\105\1\60\1\0\12\60\1\u01ff\35\60"+
+    "\1\105\37\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\47\60\1\u0200\6\60\1\u0200\31\60\1\0\1\60"+
+    "\1\0\2\60\4\0\2\60\1\105\3\60\1\0\12\60"+
+    "\1\105\73\60\7\0\1\u0201\13\0\1\u0201\117\0\1\u0202"+
+    "\43\0\1\u0202\57\0\1\u01b7\13\0\1\u01b7\104\0\12\u0118"+
+    "\1\u0203\17\u0118\1\u011b\77\u0118\1\0\125\u0118\44\0\1\u0204"+
+    "\63\0\1\120\12\0\6\120\3\0\7\120\1\u0205\5\120"+
+    "\1\0\2\120\1\0\5\120\2\0\4\120\7\0\17\120"+
+    "\1\0\20\120\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\3\131\1\u0206"+
+    "\1\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\10\0\1\53\11\0\1\125\106\0\1\u0120\12\0"+
+    "\6\u0120\3\0\15\u0120\1\0\2\u0120\1\0\5\u0120\2\0"+
+    "\4\u0120\7\0\17\u0120\1\0\20\u0120\1\0\1\u0120\12\0"+
+    "\6\u0120\3\0\2\u0120\2\u0207\1\u0120\1\u0207\6\u0120\1\u0207"+
+    "\1\0\2\u0120\1\0\5\u0120\1\u0208\1\0\4\u0120\2\0"+
+    "\1\u0208\4\0\17\u0120\1\0\13\u0120\1\u0207\4\u0120\1\0"+
+    "\1\u0120\12\0\6\u0120\3\0\2\u0120\2\u0124\1\u0120\1\u0124"+
+    "\6\u0120\1\u0124\1\0\2\u0120\1\0\2\u0120\2\u0122\1\u0123"+
+    "\2\0\1\u0123\3\u0120\7\0\2\u0120\1\u0122\6\u0120\1\u0122"+
+    "\5\u0120\1\0\13\u0120\1\u0124\4\u0120\1\0\1\u0120\12\0"+
+    "\6\u0120\3\0\2\u0120\2\u0125\1\u0120\1\u0125\6\u0120\1\u0125"+
+    "\1\0\2\u0120\1\0\2\u0120\2\u0122\1\u0123\1\0\1\u0124"+
+    "\1\u0123\3\u0120\7\0\2\u0120\1\u0122\6\u0120\1\u0122\5\u0120"+
+    "\1\0\13\u0120\1\u0125\4\u0120\1\0\1\u0120\12\0\6\u0120"+
+    "\3\0\2\u0120\1\u0125\1\u0126\1\u0120\1\u0126\6\u0120\1\u0126"+
+    "\1\0\2\u0120\1\0\1\u0120\1\u0209\2\u0122\1\u0123\1\0"+
+    "\1\u0124\1\u0123\1\u0120\1\u0209\1\u0120\7\0\2\u0120\1\u0122"+
+    "\6\u0120\1\u0122\5\u0120\1\0\13\u0120\1\u0126\4\u0120\1\0"+
+    "\1\u0120\12\0\1\u0120\1\u020a\4\u0120\3\0\2\u0120\4\u020a"+
+    "\5\u0120\2\u020a\1\0\2\u0120\1\0\2\u0120\3\u020a\2\0"+
+    "\2\u020a\2\u0120\7\0\2\u0120\1\u020a\1\u0120\1\u020a\4\u0120"+
+    "\1\u020a\5\u0120\1\0\1\u020a\12\u0120\1\u020a\4\u0120\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u020b\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u020c\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\u020d\5\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u020e\2\131\7\0\14\131"+
+    "\1\120\1\u014e\1\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\131\1\u020f\4\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\6\131"+
+    "\1\u0210\5\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\3\131\1\u0211"+
+    "\10\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\2\131\1\u0212\1\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\12\131\1\u014e\1\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\2\131\1\u0213\3\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u0214\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\131\1\u0215\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u0216"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u0217\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\2\131\1\u0218\1\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u0219\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\131\1\u014e\4\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u021a\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\u021b\5\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\3\131\1\u021c\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\4\131\1\u021d\7\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u021e\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\3\131\1\u021f"+
+    "\10\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u0220\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\3\131\1\u0221\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u0222\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\3\131\1\u0223\10\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0224"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\131"+
+    "\1\u0225\12\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\6\131\1\u0226"+
+    "\5\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\3\131\1\u0227\2\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\4\131\1\u0228\1\131\1\0\1\120"+
+    "\1\131\1\0\3\131\1\u0229\1\131\2\0\2\131\1\u022a"+
+    "\1\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\u022b\5\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\4\131\1\u022c\1\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u022d\4\131\1\u022e"+
+    "\5\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\131\1\u022f\4\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\4\131"+
+    "\1\u0230\7\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u0231\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\3\131\1\u021c"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u0232\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u0233\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\3\131\1\u0234\2\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\2\131\1\u0235\3\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\3\131\1\u0236\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\2\131"+
+    "\1\u0237\2\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\2\131\1\u0238\15\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\3\131\1\u0239\10\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\6\131\1\u023a\5\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u023b\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u023c\1\131\7\0\6\131\1\u023d\5\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u023e\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\2\131\1\u014e\15\131"+
+    "\15\0\1\u023f\11\0\4\u023f\5\0\2\u023f\6\0\3\u023f"+
+    "\2\0\2\u023f\13\0\1\u023f\1\0\1\u023f\4\0\1\u023f"+
+    "\6\0\1\u023f\12\0\1\u023f\21\0\1\u0240\11\0\4\u0240"+
+    "\5\0\2\u0240\6\0\3\u0240\2\0\2\u0240\13\0\1\u0240"+
+    "\1\0\1\u0240\4\0\1\u0240\6\0\1\u0240\12\0\1\u0240"+
+    "\20\0\1\u0241\43\0\1\u0241\142\0\1\u0242\113\0\1\u0243"+
+    "\106\0\1\u0244\173\0\1\u0245\41\0\1\u0246\43\0\1\u0246"+
+    "\72\0\1\u0247\120\0\6\u0162\1\u0163\2\0\1\u0162\3\0"+
+    "\1\u0162\2\0\5\u0162\5\0\5\u0162\2\0\4\u0162\7\0"+
+    "\14\u0162\1\0\2\u0162\1\0\13\u0162\1\0\4\u0162\1\0"+
+    "\21\u0162\1\u0163\106\u0162\72\0\1\u0248\113\0\1\u0249\106\0"+
+    "\1\u024a\173\0\1\u024b\102\0\1\u024c\106\0\1\u024d\33\0"+
+    "\1\u024e\1\u024f\133\0\1\u0250\66\0\1\u0251\150\0\1\u0252"+
+    "\20\0\1\u0253\71\0\1\u0254\144\0\1\u0255\130\0\1\u0256"+
+    "\127\0\1\u0257\110\0\1\u0258\145\0\1\u0259\131\0\1\u025a"+
+    "\12\0\1\u025b\1\0\1\u025c\1\0\1\u025d\4\0\1\u025e"+
+    "\25\0\10\u0175\1\u025f\21\u0175\1\u0260\77\u0175\1\u0261\5\u0175"+
+    "\1\u0262\1\224\15\u0175\1\224\1\u0175\2\224\1\u0263\5\224"+
+    "\7\u0175\1\224\51\u0175\1\224\5\u0175\2\u0264\1\u0265\6\u0264"+
+    "\1\u01b0\116\u0264\11\u0265\1\u01b0\116\u0265\2\u0264\1\u0265\5\u0264"+
+    "\1\u0178\1\u0266\15\u0264\1\u0267\1\u0264\1\u0268\1\u0178\1\u0269"+
+    "\4\u0178\1\u0267\7\u0264\1\u0178\51\u0264\1\u0268\5\u0264\2\u017c"+
+    "\1\0\125\u017c\44\0\1\u026a\63\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u026b\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u026c\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\4\131\1\u026d\7\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u026e\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\3\131\1\u026f\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\131"+
+    "\1\u0270\2\131\7\0\1\131\1\u0271\12\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\131\1\u0272\2\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\10\131\1\u0273\3\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131"+
+    "\1\u0274\2\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u0275\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u0276\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u0277\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u0278\7\0\1\u0279"+
+    "\1\131\1\u027a\1\131\1\u027b\7\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u027c\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\131\1\u027d\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\4\131"+
+    "\1\u027e\7\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u027f\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\3\131\1\u0280\10\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u0281\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\2\131\1\u0282\3\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u0283\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\3\131\1\u0284\2\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131"+
+    "\1\u0285\2\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\131"+
+    "\1\u0286\12\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u0287\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\u0288\5\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\4\131\1\u0289\7\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u021e\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\3\131"+
+    "\1\u028a\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u028b"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\1\131"+
+    "\1\u0224\2\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\3\131\1\u0229\1\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\4\131"+
+    "\1\u0230\7\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\u028c\5\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\u019f"+
+    "\3\0\6\u019f\1\u028d\6\u019f\1\0\1\120\1\u019f\1\0"+
+    "\5\u019f\2\0\4\u019f\7\0\14\u019f\1\120\2\u019f\1\0"+
+    "\20\u019f\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u028e\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u028f\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u0290\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\3\131"+
+    "\1\u0291\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\3\131\1\u0292\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\3\131\1\u0293\10\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u0294\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\17\131"+
+    "\1\u0295\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u0296\1\131\7\0\10\131\1\u0297\3\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\1\131\1\u0298\1\0\20\131"+
+    "\1\0\1\120\12\0\1\u0299\1\u029a\4\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u029b"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u029c\7\0\7\131"+
+    "\1\u029d\4\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u029e\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\6\131\1\u029f\5\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u02a0\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\2\270\1\0\1\270\1\0"+
+    "\2\270\4\0\6\270\1\0\63\270\1\u02a1\24\270\1\0"+
+    "\1\270\1\0\2\270\4\0\6\270\1\0\63\270\1\u02a2"+
+    "\24\270\1\0\1\270\1\0\2\270\4\0\6\270\1\0"+
+    "\51\270\1\u02a3\34\270\13\0\2\304\1\u02a4\3\304\3\0"+
+    "\1\304\1\0\4\304\1\0\1\304\1\u02a4\4\304\4\0"+
+    "\5\304\2\0\4\304\7\0\14\304\1\0\2\304\1\0"+
+    "\20\304\53\0\1\u02a5\127\0\1\u02a6\142\0\1\u02a7\116\0"+
+    "\1\u01bb\145\0\1\u02a8\110\0\1\u02a9\54\0\2\60\1\0"+
+    "\1\60\1\0\2\60\4\0\3\60\1\u02aa\2\60\1\0"+
+    "\53\60\1\u02aa\34\60\1\0\1\60\1\0\2\60\4\0"+
+    "\1\60\1\u01e6\4\60\1\0\14\60\1\105\34\60\1\u01e6"+
+    "\15\60\1\105\20\60\1\0\1\60\1\0\2\60\4\0"+
+    "\3\60\1\u02ab\2\60\1\0\46\60\1\u02ac\4\60\1\u02ab"+
+    "\12\60\1\u02ac\21\60\1\0\1\60\1\0\2\60\4\0"+
+    "\5\60\1\u02ad\1\0\13\60\1\u02ad\74\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\60\60\1\u01e6\15\60"+
+    "\1\u01e6\11\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\27\60\1\u02ae\2\60\1\u02ae\55\60\1\0\1\60"+
+    "\1\0\2\60\4\0\4\60\1\105\1\60\1\0\50\60"+
+    "\1\105\37\60\1\0\1\60\1\0\2\60\4\0\2\60"+
+    "\1\u02af\3\60\1\0\12\60\1\u02af\75\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\24\60\1\u01f4\7\60"+
+    "\1\u01f4\53\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\27\60\1\105\2\60\1\105\55\60\1\0\1\60"+
+    "\1\0\2\60\4\0\5\60\1\u01e6\1\0\13\60\1\u01e6"+
+    "\74\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\60\60\1\u02b0\15\60\1\u02b0\11\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\63\60\1\u02b1\7\60\1\u02b1"+
+    "\14\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\55\60\1\u02b2\13\60\1\u02b2\16\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\14\60\1\u02b3\52\60\1\u02b3"+
+    "\20\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\11\60\1\u01df\60\60\1\u01df\15\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\62\60\1\u01e6\5\60\1\u01e6"+
+    "\17\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\33\60\1\u02b4\31\60\1\u02b4\22\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\63\60\1\u01f3\7\60\1\u01f3"+
+    "\14\60\1\0\1\60\1\0\2\60\4\0\3\60\1\u02b5"+
+    "\2\60\1\0\53\60\1\u02b5\34\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\33\60\1\u01ea\31\60\1\u01ea"+
+    "\22\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\46\60\1\u01df\17\60\1\u01df\21\60\1\0\1\60\1\0"+
+    "\2\60\4\0\5\60\1\u02b6\1\0\13\60\1\u02b6\74\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\33\60"+
+    "\1\u010c\31\60\1\u010c\22\60\1\0\1\60\1\0\2\60"+
+    "\4\0\5\60\1\u02b7\1\0\13\60\1\u02b7\74\60\1\0"+
+    "\1\60\1\0\2\60\4\0\1\60\1\u02b8\4\60\1\0"+
+    "\51\60\1\u02b8\36\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\27\60\1\u02b9\2\60\1\u02b9\55\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\62\60\1\105"+
+    "\5\60\1\105\17\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\46\60\1\u02ba\17\60\1\u02ba\21\60\1\0"+
+    "\1\60\1\0\2\60\4\0\5\60\1\105\1\0\13\60"+
+    "\1\105\74\60\1\0\1\60\1\0\2\60\4\0\1\60"+
+    "\1\320\4\60\1\0\51\60\1\320\36\60\1\0\1\60"+
+    "\1\0\2\60\4\0\2\60\1\u02bb\3\60\1\0\12\60"+
+    "\1\u02bb\75\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\55\60\1\u02bc\13\60\1\u02bc\16\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\54\60\1\105\17\60"+
+    "\1\105\13\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\27\60\1\u02bd\2\60\1\u02bd\55\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\27\60\1\u01f4\2\60"+
+    "\1\u01f4\55\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\27\60\1\u0112\2\60\1\u0112\55\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\55\60\1\u02be\13\60"+
+    "\1\u02be\16\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\24\60\1\u02bf\7\60\1\u02bf\53\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\11\60\1\u02c0\60\60"+
+    "\1\u02c0\15\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\55\60\1\105\13\60\1\105\16\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\27\60\1\u010c\2\60"+
+    "\1\u010c\55\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\14\60\1\u02c1\52\60\1\u02c1\20\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\47\60\1\u01ca\6\60"+
+    "\1\u01ca\31\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\46\60\1\u02c2\17\60\1\u02c2\21\60\1\0\1\60"+
+    "\1\0\2\60\4\0\3\60\1\u02c3\2\60\1\0\53\60"+
+    "\1\u02c3\34\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\33\60\1\105\31\60\1\105\22\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\24\60\1\u02c4\7\60"+
+    "\1\u02c4\53\60\1\0\1\60\1\0\2\60\4\0\3\60"+
+    "\1\357\2\60\1\0\53\60\1\357\34\60\1\0\1\60"+
+    "\1\0\2\60\4\0\2\60\1\u02c5\3\60\1\0\12\60"+
+    "\1\u02c5\75\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\47\60\1\u02c6\6\60\1\u02c6\31\60\1\0\1\60"+
+    "\1\0\2\60\4\0\3\60\1\u02b7\2\60\1\0\53\60"+
+    "\1\u02b7\7\60\1\u02b1\7\60\1\u02b1\14\60\1\0\1\60"+
+    "\1\0\2\60\4\0\4\60\1\u01d0\1\60\1\0\50\60"+
+    "\1\u01d0\37\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\24\60\1\u02c7\7\60\1\u02c7\53\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\33\60\1\u02c8\31\60"+
+    "\1\u02c8\22\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\33\60\1\u02c9\31\60\1\u02c9\22\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\63\60\1\u02ca\7\60"+
+    "\1\u02ca\14\60\1\0\1\60\1\0\2\60\4\0\5\60"+
+    "\1\u02cb\1\0\13\60\1\u02cb\74\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\27\60\1\u0112\2\60\1\u0112"+
+    "\1\105\31\60\1\105\22\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\11\60\1\105\60\60\1\105\15\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\54\60"+
+    "\1\105\17\60\1\105\1\u02cc\5\60\1\u02cc\4\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\27\60\1\357"+
+    "\2\60\1\357\53\60\14\0\1\u02cd\56\0\1\u02cd\131\0"+
+    "\1\u0203\1\0\1\u0203\5\0\1\u0203\34\0\1\u02ce\115\0"+
+    "\1\120\12\0\1\120\1\u02cf\4\120\3\0\2\120\4\u02cf"+
+    "\5\120\2\u02cf\1\0\2\120\1\0\2\120\3\u02cf\2\0"+
+    "\2\u02cf\2\120\7\0\2\120\1\u02cf\1\120\1\u02cf\4\120"+
+    "\1\u02cf\5\120\1\0\1\u02cf\12\120\1\u02cf\4\120\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\6\131"+
+    "\1\u02d0\5\131\1\120\2\131\1\0\20\131\1\0\1\u0120"+
+    "\12\0\6\u0120\3\0\2\u0120\2\u0207\1\u0120\1\u0207\6\u0120"+
+    "\1\u0207\1\0\2\u0120\1\0\2\u0120\2\u0122\1\u0120\2\0"+
+    "\4\u0120\7\0\2\u0120\1\u0122\6\u0120\1\u0122\5\u0120\1\0"+
+    "\13\u0120\1\u0207\4\u0120\27\0\2\u0207\1\0\1\u0207\6\0"+
+    "\1\u0207\61\0\1\u0207\5\0\1\u0120\12\0\1\u0120\1\u020a"+
+    "\4\u0120\3\0\2\u0120\4\u020a\5\u0120\2\u020a\1\0\2\u0120"+
+    "\1\0\1\u0120\1\u0209\3\u020a\2\0\2\u020a\1\u0209\1\u0120"+
+    "\7\0\2\u0120\1\u020a\1\u0120\1\u020a\4\u0120\1\u020a\5\u0120"+
+    "\1\0\1\u020a\12\u0120\1\u020a\4\u0120\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\3\131\1\u013a\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\u02d1\5\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\u02d2"+
+    "\3\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u02d3"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\1\131\1\u02d4"+
+    "\12\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\3\131\1\u014e\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u02d5\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u014e\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u02d6\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u02d7\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\2\131\1\u02d8\1\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u02d9\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\4\131\1\u02da\7\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\3\131\1\u020d\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u02db"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u02dc\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\10\131\1\u014e"+
+    "\3\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u014e\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u02dd\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u02de\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\131\1\u02df\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\2\131\1\u02e0\1\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u02e1\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\1\131"+
+    "\1\u02d9\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u0136\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u02e2\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u02db\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u0231"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\4\131\1\u02e3"+
+    "\7\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\u02e4\5\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u02e5\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u02e6\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\4\131"+
+    "\1\u02e7\1\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\2\131\1\u02e2\1\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u02e8\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\13\131\1\u02e9\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\3\131\1\u02ea\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\7\131\1\u02eb\4\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\4\131\1\u023b\7\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\3\131\1\u0210\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\131\1\u02d9\4\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u02ec\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u02ed\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\u02ee\3\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u02ef\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\6\131\1\u02f0\5\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u02f1"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\2\131\1\u02f2\1\131"+
+    "\7\0\1\131\1\u02df\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\2\131\1\u021c"+
+    "\1\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\u014e"+
+    "\13\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u02f3\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\2\131\1\u014e\11\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\1\131\1\u014e\12\131\1\120\2\131"+
+    "\1\0\20\131\15\0\1\u02f4\11\0\4\u02f4\5\0\2\u02f4"+
+    "\6\0\3\u02f4\2\0\2\u02f4\13\0\1\u02f4\1\0\1\u02f4"+
+    "\4\0\1\u02f4\6\0\1\u02f4\12\0\1\u02f4\21\0\1\u02f5"+
+    "\11\0\4\u02f5\5\0\2\u02f5\6\0\3\u02f5\2\0\2\u02f5"+
+    "\13\0\1\u02f5\1\0\1\u02f5\4\0\1\u02f5\6\0\1\u02f5"+
+    "\12\0\1\u02f5\21\0\1\u02f6\56\0\1\u02f6\121\0\1\u02f7"+
+    "\116\0\1\u0242\145\0\1\u02f8\110\0\1\u02f9\70\0\1\u02fa"+
+    "\56\0\1\u02fa\55\0\1\u02fb\173\0\1\u02fc\116\0\1\u0248"+
+    "\145\0\1\u02fd\110\0\1\u02fe\111\0\1\u02ff\127\0\1\u0300"+
+    "\126\0\1\u0301\164\0\1\u0302\113\0\1\u0303\15\0\1\u0304"+
+    "\71\0\1\u0305\126\0\1\u0306\17\0\1\u0307\111\0\1\u0308"+
+    "\150\0\1\u0309\142\0\1\u030a\71\0\1\u030b\130\0\1\u030c"+
+    "\127\0\1\u030d\33\0\1\u030e\72\0\1\u030f\170\0\1\u0310"+
+    "\122\0\1\u0311\127\0\1\u0312\75\0\1\u0313\146\0\1\u0314"+
+    "\52\0\2\u0175\1\u0261\5\u0175\1\u0315\117\u0175\10\u0261\1\u025f"+
+    "\117\u0261\2\u0262\1\u0315\5\u0262\1\u0176\21\u0262\1\u0316\75\u0262"+
+    "\10\u0175\1\u025f\3\u0175\1\u0317\11\u0175\4\u0317\1\u0260\4\u0175"+
+    "\2\u0317\6\u0175\3\u0317\2\u0175\2\u0317\13\u0175\1\u0317\1\u0175"+
+    "\1\u0317\4\u0175\1\u0317\6\u0175\1\u0317\12\u0175\1\u0317\5\u0175"+
+    "\2\u0264\1\u0265\6\u0264\1\u017a\116\u0264\11\u0265\1\u017a\116\u0265"+
+    "\11\0\1\u01b0\116\0\2\u0264\1\u0265\6\u0264\1\u01b0\15\u0264"+
+    "\1\u0268\1\u0264\1\u0268\6\u0264\1\u0268\61\u0264\1\u0268\7\u0264"+
+    "\1\u0265\6\u0264\1\u01b0\15\u0264\1\u0178\1\u0264\1\u0178\6\u0264"+
+    "\1\u0178\61\u0264\1\u0178\7\u0264\1\u0265\6\u0264\1\u017a\2\u0264"+
+    "\1\u0318\11\u0264\4\u0318\5\u0264\2\u0318\6\u0264\3\u0318\2\u0264"+
+    "\2\u0318\13\u0264\1\u0318\1\u0264\1\u0318\4\u0264\1\u0318\6\u0264"+
+    "\1\u0318\12\u0264\1\u0318\5\u0264\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\6\131\1\u0319\5\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\4\131\1\u031a\7\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\u031b\5\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u031c"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u031d\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\3\131\1\u031e\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\3\131\1\u031f\2\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u0320\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\3\131\1\u0321\10\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131"+
+    "\1\u0322\1\u0323\2\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\2\131\1\u0323\11\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u0323"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u0324\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u0325\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u0326\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\u0327"+
+    "\3\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\131"+
+    "\1\u0328\12\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u0329\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\4\131\1\u032a\7\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\7\131\1\u032b\4\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u032c\3\131\7\0\1\131\1\u032d\12\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u032e\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\2\131\1\u032f"+
+    "\1\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u02e0\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\u0330\5\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\1\131\1\u02e0\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\7\131\1\u0331\4\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u031c"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\131"+
+    "\1\u0332\12\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\10\131\1\u0333"+
+    "\3\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u0334\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u02df\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\6\131\1\u0335\5\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\4\131"+
+    "\1\u0336\1\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\120\3\0\7\120\1\u0337\5\120\1\0"+
+    "\2\120\1\0\5\120\2\0\4\120\7\0\17\120\1\0"+
+    "\20\120\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\131\1\u0338\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0339"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u033a"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u033b\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u033c\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u033d\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\1\131\1\u033e\16\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u033f\3\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\2\131\1\u0340\1\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\4\131\1\u0341\1\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\131\1\u0342\2\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\u0343\5\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u0344\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\u02e0\13\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\u0345\5\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u0346\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u0347\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\6\131\1\u0348\5\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\2\131\1\u02e0\11\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\2\131\1\u0349\3\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\2\270\1\0\1\270\1\0\2\270"+
+    "\4\0\6\270\1\0\34\270\1\u034a\53\270\1\0\1\270"+
+    "\1\0\2\270\4\0\6\270\1\0\32\270\1\u034b\55\270"+
+    "\1\0\1\270\1\0\2\270\4\0\6\270\1\0\34\270"+
+    "\1\u034c\51\270\13\0\3\304\1\u034d\2\304\3\0\1\304"+
+    "\1\0\4\304\1\0\6\304\4\0\5\304\2\0\4\304"+
+    "\7\0\6\304\1\u034d\5\304\1\0\2\304\1\0\20\304"+
+    "\13\0\1\u034e\174\0\1\u01bb\5\0\1\u02a7\47\0\3\u034f"+
+    "\1\0\1\u034f\7\u02a9\1\0\2\u034f\1\u02a9\1\u034f\4\u02a9"+
+    "\1\0\6\u02a9\1\0\1\u034f\1\u02a9\1\u034f\5\u02a9\2\u034f"+
+    "\4\u02a9\1\0\2\u034f\1\0\3\u034f\14\u02a9\1\u034f\2\u02a9"+
+    "\1\u034f\20\u02a9\1\0\2\60\1\0\1\60\1\0\2\60"+
+    "\4\0\4\60\1\u01df\1\60\1\0\50\60\1\u01df\37\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\54\60"+
+    "\1\u01ca\17\60\1\u01ca\13\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\14\60\1\341\52\60\1\341\20\60"+
+    "\1\0\1\60\1\0\2\60\4\0\3\60\1\u02b7\2\60"+
+    "\1\0\53\60\1\u02b7\34\60\1\0\1\60\1\0\2\60"+
+    "\4\0\1\60\1\u01df\4\60\1\0\51\60\1\u01df\36\60"+
+    "\1\0\1\60\1\0\2\60\4\0\1\60\1\u01ca\4\60"+
+    "\1\0\51\60\1\u01ca\36\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\33\60\1\u0350\31\60\1\u0350\22\60"+
+    "\1\0\1\60\1\0\2\60\4\0\2\60\1\u0351\3\60"+
+    "\1\0\12\60\1\u0351\75\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\27\60\1\u0352\2\60\1\u0352\1\u02bd"+
+    "\31\60\1\u02bd\22\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\47\60\1\u0353\6\60\1\u0353\31\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\55\60\1\u01ca"+
+    "\13\60\1\u01ca\16\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\14\60\1\u0354\52\60\1\u0354\20\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\33\60\1\u0355"+
+    "\31\60\1\u0355\22\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\46\60\1\u0109\17\60\1\u0109\21\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\54\60\1\u0356"+
+    "\17\60\1\u0356\13\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\25\60\2\u0357\61\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\11\60\1\u02bd\60\60\1\u02bd"+
+    "\15\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\33\60\1\u0358\31\60\1\u0358\22\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\14\60\1\u010c\52\60\1\u010c"+
+    "\20\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\27\60\1\u0359\2\60\1\u0359\55\60\1\0\1\60\1\0"+
+    "\2\60\4\0\6\60\1\0\47\60\1\u035a\6\60\1\u035a"+
+    "\31\60\1\0\1\60\1\0\2\60\4\0\2\60\1\u01ca"+
+    "\3\60\1\0\12\60\1\u01ca\75\60\1\0\1\60\1\0"+
+    "\2\60\4\0\5\60\1\u035b\1\0\13\60\1\u035b\74\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\14\60"+
+    "\1\u035c\52\60\1\u035c\20\60\1\0\1\60\1\0\2\60"+
+    "\4\0\1\60\1\334\4\60\1\0\51\60\1\334\36\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\27\60"+
+    "\1\u01df\2\60\1\u01df\55\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\27\60\1\u035d\2\60\1\u035d\55\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\46\60"+
+    "\1\341\17\60\1\341\21\60\1\0\1\60\1\0\2\60"+
+    "\4\0\3\60\1\u035e\2\60\1\0\53\60\1\u035e\34\60"+
+    "\1\0\1\60\1\0\2\60\4\0\5\60\1\u035f\1\0"+
+    "\13\60\1\u035f\10\60\1\u0360\7\60\1\u0360\26\60\1\u0361"+
+    "\7\60\1\u0361\14\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\27\60\1\u0109\2\60\1\u0109\55\60\1\0"+
+    "\1\60\1\0\2\60\4\0\3\60\1\u0362\2\60\1\0"+
+    "\53\60\1\u0362\34\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\11\60\1\u0363\60\60\1\u0363\13\60\15\0"+
+    "\1\u0364\16\0\1\u0364\73\0\1\120\12\0\1\120\1\u0365"+
+    "\4\120\3\0\2\120\4\u0365\5\120\2\u0365\1\0\2\120"+
+    "\1\0\2\120\3\u0365\2\0\2\u0365\2\120\7\0\2\120"+
+    "\1\u0365\1\120\1\u0365\4\120\1\u0365\5\120\1\0\1\u0365"+
+    "\12\120\1\u0365\4\120\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\3\131\1\u0366\2\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u0367\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\3\131"+
+    "\1\u0368\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\12\131"+
+    "\1\u0369\1\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\1\131\1\u036a"+
+    "\12\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\13\131\1\u021c\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\7\131\1\u014e\4\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u036b\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131"+
+    "\1\u036c\3\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u02d9"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\2\131\1\u036d\1\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\3\131\1\u0282\10\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\3\131\1\u036e\2\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\131\1\u02ed\4\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u036f\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\6\131\1\u0370\5\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\u0371\13\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\1\131\1\u0372\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\u0373\5\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u021c\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u0216\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u0374\3\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u02e6\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u0375\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u0376\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u0377\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u014e\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u0378\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u0379\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u037a\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\2\131\1\u02e0\15\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\u037b\3\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u0151\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\16\0\1\u037c\16\0\1\u037c\105\0\1\u037d\174\0"+
+    "\1\u0242\5\0\1\u02f7\47\0\3\u037e\1\0\1\u037e\7\u02f9"+
+    "\1\0\2\u037e\1\u02f9\1\u037e\4\u02f9\1\0\6\u02f9\1\0"+
+    "\1\u037e\1\u02f9\1\u037e\5\u02f9\2\u037e\4\u02f9\1\0\2\u037e"+
+    "\1\0\3\u037e\14\u02f9\1\u037e\2\u02f9\1\u037e\20\u02f9\16\0"+
+    "\1\u037f\16\0\1\u037f\105\0\1\u0380\174\0\1\u0248\5\0"+
+    "\1\u02fc\47\0\3\u0381\1\0\1\u0381\7\u02fe\1\0\2\u0381"+
+    "\1\u02fe\1\u0381\4\u02fe\1\0\6\u02fe\1\0\1\u0381\1\u02fe"+
+    "\1\u0381\5\u02fe\2\u0381\4\u02fe\1\0\2\u0381\1\0\3\u0381"+
+    "\14\u02fe\1\u0381\2\u02fe\1\u0381\20\u02fe\34\0\1\u0382\164\0"+
+    "\1\u0383\113\0\1\u0384\13\0\1\u0385\127\0\1\u0307\136\0"+
+    "\1\u0386\104\0\1\u0387\1\0\1\u0388\140\0\1\u0389\135\0"+
+    "\1\u038a\125\0\1\u038b\124\0\1\u038c\73\0\1\u038d\150\0"+
+    "\1\u038e\126\0\1\u038f\127\0\1\u0390\127\0\1\u0391\132\0"+
+    "\1\u0392\105\0\1\u0393\1\u0394\164\0\1\u0395\125\0\1\u0396"+
+    "\125\0\1\u0397\116\0\1\u0398\51\0\10\u0315\1\0\21\u0315"+
+    "\1\u0399\77\u0315\1\0\5\u0315\2\u0262\15\u0315\1\u0262\1\u0315"+
+    "\2\u0262\1\u039a\5\u0262\7\u0315\1\u0262\51\u0315\1\u0262\5\u0315"+
+    "\10\u0175\1\u025f\3\u0175\1\u039b\11\u0175\4\u039b\1\u0260\4\u0175"+
+    "\2\u039b\6\u0175\3\u039b\2\u0175\2\u039b\13\u0175\1\u039b\1\u0175"+
+    "\1\u039b\4\u0175\1\u039b\6\u0175\1\u039b\12\u0175\1\u039b\5\u0175"+
+    "\2\u0264\1\u0265\6\u0264\1\u017a\2\u0264\1\u039c\11\u0264\4\u039c"+
+    "\5\u0264\2\u039c\6\u0264\3\u039c\2\u0264\2\u039c\13\u0264\1\u039c"+
+    "\1\u0264\1\u039c\4\u0264\1\u039c\6\u0264\1\u039c\12\u0264\1\u039c"+
+    "\5\u0264\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131"+
+    "\1\u039d\2\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\4\131\1\u039e\7\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\7\131\1\u039f\4\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u03a0\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u02e0"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u03a1\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\3\131\1\u03a2\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u03a3\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\1\u03a4\5\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\131"+
+    "\1\u03a5\2\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0276"+
+    "\2\131\7\0\6\131\1\u03a6\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\6\131\1\u03a7\5\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u028c"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u03a8"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\1\131\1\u03a9\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u03aa\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u03ab\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\5\131\1\u03ac\6\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\10\131\1\u03ad\3\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\1\131\1\u03ae\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\u03af"+
+    "\3\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u03b0\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u03b1\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\12\131\1\u0323\1\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\2\131\1\u03b2\15\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u03b3\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\131\1\u03b4\4\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u03b5"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u02e0"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\1\131\1\u03b6\4\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\3\131\1\u03b7\10\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\4\131\1\u03b8\7\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\2\131\1\u0282\1\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\1\120\1\u03b9\4\120"+
+    "\3\0\2\120\4\u03b9\5\120\2\u03b9\1\0\2\120\1\0"+
+    "\2\120\3\u03b9\2\0\2\u03b9\2\120\7\0\2\120\1\u03b9"+
+    "\1\120\1\u03b9\4\120\1\u03b9\5\120\1\0\1\u03b9\12\120"+
+    "\1\u03b9\4\120\1\0\1\120\12\0\1\131\1\u03ba\4\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\1\u03bb\1\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\u03bc"+
+    "\13\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\131\1\u03bd\4\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u03be\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\3\131\1\u0275\2\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\3\131\1\u03bf"+
+    "\1\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\4\131\1\u031c\7\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\4\131\1\u03c0\1\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u03c1\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u03c2\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\4\131\1\u03c3\7\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u03c4\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\3\131\1\u03c5\10\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u03c6\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\131\1\u03c7\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\3\131\1\u03c8\1\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\u03c9\5\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\2\270\1\0\1\270"+
+    "\1\0\2\270\4\0\6\270\1\0\53\270\1\u03ca\34\270"+
+    "\1\0\1\270\1\0\2\270\4\0\6\270\1\0\11\270"+
+    "\1\u03cb\74\270\13\0\4\304\1\u03cc\1\304\3\0\1\304"+
+    "\1\0\4\304\1\0\6\304\4\0\5\304\2\0\4\304"+
+    "\7\0\3\304\1\u03cc\10\304\1\0\2\304\1\0\20\304"+
+    "\13\0\1\u02a9\115\0\2\60\1\0\1\60\1\0\2\60"+
+    "\4\0\1\105\5\60\1\0\35\60\1\105\52\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\46\60\1\u03cd"+
+    "\17\60\1\u03cd\21\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\14\60\1\u01df\52\60\1\u01df\20\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\27\60\1\u03ce"+
+    "\2\60\1\u03ce\55\60\1\0\1\60\1\0\2\60\4\0"+
+    "\5\60\1\u03cf\1\0\13\60\1\u03cf\74\60\1\0\1\60"+
+    "\1\0\2\60\4\0\2\60\1\u03d0\3\60\1\0\12\60"+
+    "\1\u03d0\75\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\75\60\1\u03d1\5\60\1\u03d1\4\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\46\60\1\u0352\17\60"+
+    "\1\u0352\21\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\55\60\1\u03d2\13\60\1\u03d2\16\60\1\0\1\60"+
+    "\1\0\2\60\4\0\1\u02c4\5\60\1\0\35\60\1\u02c4"+
+    "\52\60\1\0\1\60\1\0\2\60\4\0\1\u03d3\5\60"+
+    "\1\0\35\60\1\u03d3\52\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\62\60\1\u01ea\5\60\1\u01ea\17\60"+
+    "\1\0\1\60\1\0\2\60\4\0\1\u0350\5\60\1\0"+
+    "\35\60\1\u0350\52\60\1\0\1\60\1\0\2\60\4\0"+
+    "\6\60\1\0\24\60\1\u0350\7\60\1\u0350\53\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\27\60\1\u03d4"+
+    "\2\60\1\u03d4\55\60\1\0\1\60\1\0\2\60\4\0"+
+    "\3\60\1\361\2\60\1\0\53\60\1\361\34\60\1\0"+
+    "\1\60\1\0\2\60\4\0\2\60\1\u03d5\3\60\1\0"+
+    "\12\60\1\u03d5\75\60\1\0\1\60\1\0\2\60\4\0"+
+    "\1\60\1\u03d6\4\60\1\0\51\60\1\u03d6\36\60\1\0"+
+    "\1\60\1\0\2\60\4\0\6\60\1\0\27\60\1\u01ca"+
+    "\2\60\1\u01ca\53\60\16\0\1\u03d7\56\0\1\u03d7\32\0"+
+    "\1\120\12\0\1\120\1\u03d8\4\120\3\0\2\120\4\u03d8"+
+    "\5\120\2\u03d8\1\0\2\120\1\0\2\120\3\u03d8\2\0"+
+    "\2\u03d8\2\120\7\0\2\120\1\u03d8\1\120\1\u03d8\4\120"+
+    "\1\u03d8\5\120\1\0\1\u03d8\12\120\1\u03d8\4\120\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\6\131"+
+    "\1\u03d9\5\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u014e\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\6\131\1\u03da\5\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\3\131\1\u014e\1\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u03db\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u03dc\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u03dd\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\2\131\1\u0210\11\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u03de\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\4\131\1\u014e"+
+    "\7\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\131\1\u03df\4\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\1\131\1\u0223"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\2\131\1\u02ed\1\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\4\131\1\u03e0\7\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\3\131\1\u03e1\2\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\2\131\1\242"+
+    "\2\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\1\131\1\u021c\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u03e2"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\3\131\1\u03e3\1\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\3\131\1\u03e4\2\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\6\131\1\u0190\5\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\10\131\1\u03e5\3\131\1\120\2\131"+
+    "\1\0\20\131\17\0\1\u03e6\56\0\1\u03e6\44\0\1\u02f9"+
+    "\133\0\1\u03e7\56\0\1\u03e7\44\0\1\u02fe\151\0\1\u03e8"+
+    "\127\0\1\u03e9\150\0\1\u03ea\153\0\1\u03eb\120\0\1\u03ec"+
+    "\127\0\1\u03ed\70\0\1\u03ee\164\0\1\u03ef\114\0\1\u03f0"+
+    "\126\0\1\u0307\131\0\1\u03f1\125\0\1\u03f2\152\0\1\u0307"+
+    "\135\0\1\u03f3\56\0\1\u03f4\167\0\1\u0307\130\0\1\u03f5"+
+    "\106\0\1\u03f6\151\0\1\u03f7\46\0\1\u03f8\166\0\1\u03f7"+
+    "\127\0\1\u03f9\106\0\1\u0396\74\0\2\u0315\1\0\135\u0315"+
+    "\1\0\3\u0315\1\u03fa\11\u0315\4\u03fa\1\u0399\4\u0315\2\u03fa"+
+    "\6\u0315\3\u03fa\2\u0315\2\u03fa\13\u0315\1\u03fa\1\u0315\1\u03fa"+
+    "\4\u0315\1\u03fa\6\u0315\1\u03fa\12\u0315\1\u03fa\5\u0315\10\u0175"+
+    "\1\u025f\3\u0175\1\u03fb\11\u0175\4\u03fb\1\u0260\4\u0175\2\u03fb"+
+    "\6\u0175\3\u03fb\2\u0175\2\u03fb\13\u0175\1\u03fb\1\u0175\1\u03fb"+
+    "\4\u0175\1\u03fb\6\u0175\1\u03fb\12\u0175\1\u03fb\5\u0175\2\u0264"+
+    "\1\u0265\6\u0264\1\u017a\2\u0264\1\u03fc\11\u0264\4\u03fc\5\u0264"+
+    "\2\u03fc\6\u0264\3\u03fc\2\u0264\2\u03fc\13\u0264\1\u03fc\1\u0264"+
+    "\1\u03fc\4\u0264\1\u03fc\6\u0264\1\u03fc\12\u0264\1\u03fc\5\u0264"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\1\131\1\u03fd\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u03fe\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\5\131"+
+    "\1\u03ff\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\1\131\1\u0400\16\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\6\131\1\u0401\5\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\10\131\1\u02e0\3\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\1\131\1\u0402\4\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\1\131\1\u0403\1\u0404\2\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\2\131\1\u0405\15\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u028c\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\2\131\1\u0406\15\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u0407\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\4\131\1\u0408\7\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\2\131\1\u03a9\1\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\10\131\1\u0409\3\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u040a\1\131\1\u040b\2\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u0332\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\3\131\1\u040c\2\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u040d\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\1\131\1\u040e\16\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\3\131\1\u040f"+
+    "\10\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u0410\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\3\131\1\u0411\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\1\131\1\u0282\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\2\131\1\u0412\11\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\131"+
+    "\1\u0413\12\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u0414\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\3\131\1\u0415\2\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\1\131\1\u0416"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\131\1\u0417\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u0418\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131"+
+    "\1\u0419\3\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\1\120\1\u041a\4\120\3\0\2\120\4\u041a"+
+    "\5\120\2\u041a\1\0\2\120\1\0\2\120\3\u041a\2\0"+
+    "\2\u041a\2\120\7\0\2\120\1\u041a\1\120\1\u041a\4\120"+
+    "\1\u041a\5\120\1\0\1\u041a\12\120\1\u041a\4\120\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\2\131\1\u041b\1\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\1\u041c\2\131\1\u041d\2\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\10\131\1\u041e"+
+    "\3\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u041f\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u0420\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\4\131"+
+    "\1\u0421\13\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\131\1\u0422\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\131\1\u0423\4\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u0424\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\u0425"+
+    "\13\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\3\131\1\u0426\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\3\131\1\u0427\10\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u0428\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\12\131\1\u0429\1\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\1\u042a\1\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u042b\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\2\270\1\0"+
+    "\1\270\1\0\2\270\4\0\6\270\1\0\15\270\1\u034b"+
+    "\72\270\1\0\1\270\1\0\2\270\4\0\6\270\1\0"+
+    "\47\270\1\u02a2\36\270\13\0\5\304\1\u042c\3\0\1\304"+
+    "\1\0\4\304\1\0\2\304\1\u042c\3\304\4\0\5\304"+
+    "\2\0\4\304\7\0\14\304\1\0\2\304\1\0\20\304"+
+    "\1\0\2\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\11\60\1\u01c7\60\60\1\u01c7\15\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\23\60\1\105\26\60"+
+    "\1\105\35\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\27\60\1\u042d\2\60\1\u042d\55\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\27\60\1\u01f0\2\60"+
+    "\1\u01f0\55\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\11\60\1\u042e\60\60\1\u042e\15\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\27\60\1\u0350\2\60"+
+    "\1\u0350\55\60\1\0\1\60\1\0\2\60\4\0\6\60"+
+    "\1\0\46\60\1\326\17\60\1\326\21\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\55\60\1\u042f\13\60"+
+    "\1\u042f\16\60\1\0\1\60\1\0\2\60\4\0\3\60"+
+    "\1\u010c\2\60\1\0\53\60\1\u010c\34\60\1\0\1\60"+
+    "\1\0\2\60\4\0\6\60\1\0\46\60\1\u01f4\17\60"+
+    "\1\u01f4\17\60\17\0\1\u0430\52\0\1\u0430\35\0\1\120"+
+    "\12\0\1\120\1\131\4\120\3\0\2\120\4\131\5\120"+
+    "\2\131\1\0\2\120\1\0\2\120\3\131\2\0\2\131"+
+    "\2\120\7\0\2\120\1\131\1\120\1\131\4\120\1\131"+
+    "\5\120\1\0\1\131\12\120\1\131\4\120\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u03dd\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u0431\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\3\131\1\u02d9\2\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\131\1\u0367\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\1\u014e\1\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\4\131"+
+    "\1\u02ed\7\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\1\131\1\u0432"+
+    "\12\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u0433\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\3\131\1\u031c\2\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\u021c\5\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\131"+
+    "\1\u0434\2\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\4\131\1\u0211\7\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u0435\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\20\0\1\u0436\52\0"+
+    "\1\u0436\54\0\1\u0437\52\0\1\u0437\73\0\1\u0307\166\0"+
+    "\1\u0438\123\0\1\u0439\115\0\1\u0307\126\0\1\u038b\106\0"+
+    "\1\u0392\163\0\1\u038b\72\0\1\u0307\151\0\1\u043a\125\0"+
+    "\1\u043b\146\0\1\u043c\124\0\1\u043d\75\0\1\u0438\161\0"+
+    "\1\u03e8\73\0\1\u043e\73\0\60\u03f7\1\u0307\47\u03f7\70\0"+
+    "\1\u043f\73\0\1\u0440\73\0\10\u0315\1\0\3\u0315\1\u0441"+
+    "\11\u0315\4\u0441\1\u0399\4\u0315\2\u0441\6\u0315\3\u0441\2\u0315"+
+    "\2\u0441\13\u0315\1\u0441\1\u0315\1\u0441\4\u0315\1\u0441\6\u0315"+
+    "\1\u0441\12\u0315\1\u0441\5\u0315\10\u0175\1\u025f\3\u0175\1\224"+
+    "\11\u0175\4\224\1\u0260\4\u0175\2\224\6\u0175\3\224\2\u0175"+
+    "\2\224\13\u0175\1\224\1\u0175\1\224\4\u0175\1\224\6\u0175"+
+    "\1\224\12\u0175\1\224\5\u0175\2\u0264\1\u0265\6\u0264\1\u017a"+
+    "\2\u0264\1\u0178\11\u0264\4\u0178\5\u0264\2\u0178\6\u0264\3\u0178"+
+    "\2\u0264\2\u0178\13\u0264\1\u0178\1\u0264\1\u0178\4\u0264\1\u0178"+
+    "\6\u0264\1\u0178\12\u0264\1\u0178\5\u0264\1\120\12\0\3\131"+
+    "\1\u041d\2\131\3\0\4\131\1\u0442\1\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\4\131\1\262\13\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u0443\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\13\131\1\u0444\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u0445\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0446"+
+    "\2\131\7\0\6\131\1\u0447\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\131\1\u0448\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\131\1\u0449\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\131"+
+    "\1\u044a\12\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\1\131\1\u044b"+
+    "\12\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\16\131\1\u044c\1\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u044d\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u044e\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\u044f\5\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u0450\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u0451\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u0452\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\u0453\5\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\131\1\u0454\2\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u0455\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\3\131\1\u0456"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\1\131\1\u0457\3\131\1\0\1\u0458\4\131"+
+    "\7\0\11\131\1\u0459\2\131\1\120\2\131\1\0\6\131"+
+    "\1\u045a\11\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u045b\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\3\131\1\u02e0\2\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u042a\3\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u045c\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\6\131\1\u045d\5\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\3\131\1\u045e\1\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\1\120\1\u045f"+
+    "\4\120\3\0\2\120\4\u045f\5\120\2\u045f\1\0\2\120"+
+    "\1\0\2\120\3\u045f\2\0\2\u045f\2\120\7\0\2\120"+
+    "\1\u045f\1\120\1\u045f\4\120\1\u045f\5\120\1\0\1\u045f"+
+    "\12\120\1\u045f\4\120\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\1\131\1\u0460\12\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u0461\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\3\131\1\u0462\2\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u0463\3\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\4\131\1\u0464"+
+    "\7\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\6\131\1\u0465\5\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\u0466\3\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u0467\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\2\131\1\u0468\2\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\13\131\1\u0469\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\2\131\1\u046a\2\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\4\131\1\u046b\13\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\3\131\1\u046c\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\1\131\1\u046d\12\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\3\131\1\u046e\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u042a\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\4\131\1\u046f\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\2\131\1\u0470\1\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\2\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\23\60"+
+    "\1\u01df\26\60\1\u01df\35\60\1\0\1\60\1\0\2\60"+
+    "\4\0\6\60\1\0\46\60\1\330\17\60\1\330\21\60"+
+    "\1\0\1\60\1\0\2\60\4\0\4\60\1\u0471\1\60"+
+    "\1\0\50\60\1\u0471\35\60\20\0\1\u0472\14\0\1\u0472"+
+    "\72\0\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131"+
+    "\1\u02ed\2\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u0473"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u023d\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\4\131\1\u021c\7\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\3\131\1\u0474\2\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\21\0\1\u0475\14\0\1\u0475\112\0\1\u0476"+
+    "\14\0\1\u0476\147\0\1\u0477\131\0\1\u0478\117\0\1\u0479"+
+    "\30\0\1\u047a\64\0\1\u038b\147\0\1\u047b\106\0\1\u047c"+
+    "\150\0\1\u047d\142\0\1\u047e\134\0\1\u047f\32\0\10\u0315"+
+    "\1\0\3\u0315\1\u0480\11\u0315\4\u0480\1\u0399\4\u0315\2\u0480"+
+    "\6\u0315\3\u0480\2\u0315\2\u0480\13\u0315\1\u0480\1\u0315\1\u0480"+
+    "\4\u0315\1\u0480\6\u0315\1\u0480\12\u0315\1\u0480\5\u0315\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\u0481\5\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\131\1\u0482\2\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u0483\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\1\u0484\1\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\3\131\1\u0485\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\131\1\u0486\4\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\131\1\u0487\2\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\131\1\u0488\4\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u0489\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u048a\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\u048b"+
+    "\5\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u048c\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\4\131"+
+    "\1\u048d\1\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\4\131\1\u048e\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\3\131\1\u048f\10\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\2\131\1\u042a\1\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u0490\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\131"+
+    "\1\u0491\2\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131"+
+    "\1\u0492\3\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u0493"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\1\u0494\4\131\1\u0495\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\1\u0496\3\131\1\u0497\13\131"+
+    "\1\0\1\120\12\0\6\131\3\0\4\131\1\u0498\1\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\1\131"+
+    "\1\u0499\12\131\1\120\2\131\1\0\20\131\14\0\1\u049a"+
+    "\100\0\1\u049b\13\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\262\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u049c\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\4\131\1\u049d\1\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u049e\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u049f\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\3\131\1\u014e\10\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\1\120\1\u019f\4\120"+
+    "\3\0\2\120\4\u019f\5\120\2\u019f\1\0\2\120\1\0"+
+    "\2\120\3\u019f\2\0\2\u019f\2\120\7\0\2\120\1\u019f"+
+    "\1\120\1\u019f\4\120\1\u019f\5\120\1\0\1\u019f\12\120"+
+    "\1\u019f\4\120\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\3\131\1\u04a0\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\131\1\u04a1\12\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\2\131"+
+    "\1\u027a\11\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u04a2\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u04a3\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u0429\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\10\131\1\u04a4\3\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u04a5\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\131\1\u04a6\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u04a7\3\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\6\131\1\u04a8"+
+    "\5\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u04a9\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\11\131\1\u04aa\2\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u04ab\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\3\131\1\u04ac\1\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u0195\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\4\131\1\u04ad\13\131\1\0\2\60"+
+    "\1\0\1\60\1\0\2\60\4\0\6\60\1\0\24\60"+
+    "\1\u04ae\7\60\1\u04ae\51\60\21\0\1\u04af\106\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\6\131\1\u04b0"+
+    "\5\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u0210\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\22\0\1\u04b1\127\0\1\u04b2"+
+    "\164\0\1\u0307\126\0\1\u04b3\147\0\1\u04b4\107\0\1\u04b5"+
+    "\107\0\1\u04b6\176\0\1\u0307\101\0\1\u03f7\106\0\1\u03f7"+
+    "\127\0\1\u04b7\72\0\10\u0315\1\0\3\u0315\1\u0262\11\u0315"+
+    "\4\u0262\1\u0399\4\u0315\2\u0262\6\u0315\3\u0262\2\u0315\2\u0262"+
+    "\13\u0315\1\u0262\1\u0315\1\u0262\4\u0315\1\u0262\6\u0315\1\u0262"+
+    "\12\u0315\1\u0262\5\u0315\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\3\131\1\u04b8"+
+    "\1\131\2\0\4\131\7\0\6\131\1\u04b9\5\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\4\131\1\u04ba\7\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u04bb\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\4\131\1\u048e\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\4\131\1\u04bc"+
+    "\13\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u04bd\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\4\131\1\u04be\7\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\2\131"+
+    "\1\u03a9\11\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\10\131\1\u04bf"+
+    "\3\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\2\131\1\u04c0\2\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\1\u04c1"+
+    "\5\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u04c2\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u04c3\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u04c4\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\5\131\1\u04c5\6\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u04c6\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u04c7\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\4\131\1\u04c8\1\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\1\131\1\u04c9\16\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u04ca\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u04cb"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\1\u04cc\13\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u04cd\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\4\131\1\u04ce"+
+    "\7\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\1\131\1\u04cf\12\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\u04d0\5\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\4\131\1\u013c\7\131\1\120\2\131\1\0"+
+    "\20\131\36\0\1\u04d1\130\0\1\u04d2\71\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\1\131\1\u04d3\12\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u04d4\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\2\131\1\u04d5\3\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u04d6\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\u0323"+
+    "\3\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u04d7"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\6\131\1\u04d8"+
+    "\5\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\4\131\1\u04d9\13\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u04da\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\2\131\1\u04db\3\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u04dc\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\1\u04dd\17\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u04de\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u04df\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\u04e0\3\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\2\131\1\u04e1\3\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\6\131\1\u04e2\5\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u04e3"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\2\60\1\0\1\60\1\0\2\60\4\0\6\60\1\0"+
+    "\33\60\1\330\31\60\1\330\20\60\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\15\131\1\u0433\2\131\51\0\1\u04e4\133\0\1\u04e5\110\0"+
+    "\1\u04e6\146\0\1\u04e7\153\0\1\u04e8\27\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\3\131\1\u03a9\1\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\2\131\1\u0487\1\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u04e9\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\3\131\1\u04ea\1\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u04eb"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\4\131\1\u048e\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\1\u04ec\5\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u04ed\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\131\1\u04ee\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\u04ef\5\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u04f0"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\1\0\1\u04f1\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u04f2\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\4\131\1\u04f3\7\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u04f4\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131"+
+    "\1\u04f5\3\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\2\131\1\u04f6\1\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\3\131\1\u04f7\1\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\4\131\1\u04f8\1\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\131\1\u04f9\2\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\1\131\1\u04fa\4\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\1\131\1\u04fb\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\4\131\1\u04fc\7\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u04fd"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\6\131\1\u04fe"+
+    "\5\131\1\120\2\131\1\0\20\131\56\0\1\u04ff\145\0"+
+    "\1\u0500\34\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\u0501\5\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u0502\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u0503\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\3\131"+
+    "\1\u0504\2\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u04bd\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\4\131\1\u04bd\7\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\u0505\3\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u03c8\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u0506\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\10\131\1\u0507\3\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u0508\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\2\131"+
+    "\1\u0509\1\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\u050a\13\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\3\131\1\u050b\1\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\u050c\3\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u050d\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\4\131\1\u050e\7\131\1\120\2\131\1\0\20\131"+
+    "\55\0\1\u050f\131\0\1\u04e7\126\0\1\u0307\143\0\1\u0307"+
+    "\126\0\1\u0510\37\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\4\131\1\u0511"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\2\131\1\u0512"+
+    "\1\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u0513"+
+    "\2\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\2\131\1\u0514\1\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u042a\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\u0515\5\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\3\131\1\u0516\10\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\4\131\1\u0282\7\131\1\120\2\131\1\0\20\131"+
+    "\14\0\1\u0517\100\0\1\u0518\13\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\10\131\1\u0519\3\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u051a\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\2\131\1\u04bd\11\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u051b\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\u051c\3\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\4\131\1\u051d\1\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\2\131\1\u051e\1\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\2\131\1\u04d7\3\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u051f\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\u0520"+
+    "\5\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u0521\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\6\131\1\u0522\5\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\2\131\1\u0523\1\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\36\0\1\u0524\147\0\1\u0525\52\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\3\131\1\u02e0"+
+    "\10\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\3\131\1\u0526\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\3\131\1\u0527\2\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u0528\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\2\131\1\u0529\3\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131"+
+    "\1\u04bd\4\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u0485\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u052a\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\2\131\1\u052b\11\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u0509\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\2\131"+
+    "\1\u052c\2\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\2\131\1\u052d\11\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\2\131\1\u052e\11\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\1\u052f\13\131\1\120\2\131\1\0\20\131\36\0\1\u047c"+
+    "\165\0\1\u03f7\34\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\2\131\1\u0530\1\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\131\1\u0531\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0532"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\1\131\1\u0533\2\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u04f4\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\3\131\1\u0534\10\131"+
+    "\1\120\2\131\1\0\20\131\34\0\1\u0535\132\0\1\u0536"+
+    "\71\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u0537\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\3\131"+
+    "\1\u0538\10\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\1\131\1\u0539"+
+    "\12\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\5\131\1\u053a\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\1\131\1\u053b\12\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u053c\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u053d"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\10\131"+
+    "\1\u0526\3\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u053e\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u053f\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\2\131\1\u0540\11\131\1\120\2\131"+
+    "\1\0\20\131\55\0\1\u0541\106\0\1\u0542\74\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\u0543\3\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\2\131\1\u032e\3\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\3\131\1\u0544"+
+    "\2\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\u0545\13\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0546"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\4\131\1\u0547\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\1\131\1\u0548\12\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\1\131"+
+    "\1\u0549\4\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\1\131\1\u054a\16\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\1\131\1\u054b\3\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\6\131\1\u054c\5\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u054d\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\12\131\1\u042a\1\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\1\131\1\u03a9\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u054e\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\1\131\1\u054f\12\131"+
+    "\1\120\2\131\1\0\20\131\40\0\1\u0550\165\0\1\u0551"+
+    "\32\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\3\131\1\u0552"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u0553\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\3\131\1\u052b\2\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\u0554\13\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\u0555\5\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\1\131\1\u0556\4\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\2\131"+
+    "\1\u0557\11\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u052b\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\1\131\1\u0558\12\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\u0559\3\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\106\0\1\u055a\22\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\3\131\1\u0485\2\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u055b\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\1\131\1\u055c\12\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\1\u055d\1\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u0195\4\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\5\131\1\u04c5\6\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\u055e\5\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\2\131\1\u055f\1\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\3\131\1\u0560\10\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\6\131\1\u0561\5\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u0416\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\10\131\1\u0562\3\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u0563\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u048f"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\60\0\1\u0564"+
+    "\143\0\1\u0565\34\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\3\131\1\u0553\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u0566\5\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\1\131\1\u0567"+
+    "\4\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u0568\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\2\131\1\u0569\1\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\1\u0494"+
+    "\5\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u0557\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\131\1\u056a\4\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\70\0\1\u056b\40\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u056c\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\2\131\1\u042a\11\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\1\u056d\5\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u055c\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\1\131\1\u056e\2\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\u056f\3\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\3\131\1\u0570\2\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\u03e1"+
+    "\3\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u03c8"+
+    "\3\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\55\0\1\u0571"+
+    "\143\0\1\u0572\37\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\1\131\1\u0414\12\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\1\u0573"+
+    "\3\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\2\131"+
+    "\1\u0574\11\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u0575\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\1\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\1\0\1\u0576\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\36\0\1\u0577\72\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\2\131\1\u0578\3\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\6\131\1\u0579\5\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\3\131\1\u057a\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\1\131\1\u057b\4\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\7\131\1\u042a\4\131\1\120\2\131\1\0\20\131\36\0"+
+    "\1\u0541\163\0\1\u057c\36\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\1\131\1\u057d\2\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\3\131\1\u04bd\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\3\131\1\u057e"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\16\0\1\u057f"+
+    "\163\0\1\u0580\56\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\6\131\1\u0581\5\131\1\120\2\131\1\0"+
+    "\20\131\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\15\131\1\u04d7\2\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\3\131\1\u0582"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u0583\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\55\0\1\u0584\53\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\2\131"+
+    "\1\u0585\11\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\3\131\1\u0586\7\0\14\131"+
+    "\1\120\2\131\1\0\20\131\55\0\1\u0587\147\0\1\u0588"+
+    "\33\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\1\131\1\u0589"+
+    "\2\131\7\0\14\131\1\120\2\131\1\0\20\131\1\0"+
+    "\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0"+
+    "\1\120\1\131\1\0\5\131\2\0\4\131\7\0\14\131"+
+    "\1\120\2\131\1\0\11\131\1\u058a\6\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\2\131\1\u058b\3\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\14\0\1\u058c\14\0"+
+    "\1\u058d\77\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\1\131\1\u0457\3\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\1\131\1\u058e\4\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\4\131\7\0\14\131\1\120\2\131\1\0\20\131\72\0"+
+    "\1\u058f\131\0\1\u0590\34\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\2\131\1\u0591\1\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\1\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131\2\0"+
+    "\1\u0592\3\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\6\131\1\u0593\5\131\1\120\2\131\1\0\20\131\74\0"+
+    "\1\u0594\112\0\1\u0595\51\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\1\u0596\13\131\1\120\2\131\1\0"+
+    "\20\131\76\0\1\u0597\106\0\1\u0598\53\0\1\120\12\0"+
+    "\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131"+
+    "\1\0\5\131\2\0\4\131\7\0\6\131\1\u0599\5\131"+
+    "\1\120\2\131\1\0\20\131\1\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\1\131\1\u059a\4\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\4\131\7\0\14\131\1\120"+
+    "\2\131\1\0\20\131\1\0\1\120\12\0\6\131\3\0"+
+    "\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\1\131\1\u059b\12\131\1\120\2\131"+
+    "\1\0\20\131\35\0\1\u059c\163\0\1\u059d\37\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\6\131\1\0\1\120"+
+    "\1\131\1\0\5\131\2\0\1\131\1\u059e\2\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\35\0\1\u059f\165\0"+
+    "\1\u05a0\35\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\6\131\1\0\1\120\1\131\1\0\5\131\2\0\4\131"+
+    "\7\0\14\131\1\120\2\131\1\0\15\131\1\u05a1\2\131"+
+    "\1\0\1\120\12\0\6\131\3\0\6\131\1\u011d\6\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\3\131\1\u0420"+
+    "\7\0\14\131\1\120\2\131\1\0\20\131\1\0\1\120"+
+    "\12\0\6\131\3\0\6\131\1\u011d\3\131\1\u04bd\2\131"+
+    "\1\0\1\120\1\131\1\0\5\131\2\0\4\131\7\0"+
+    "\14\131\1\120\2\131\1\0\20\131\76\0\1\u05a2\125\0"+
+    "\1\u05a3\34\0\1\120\12\0\6\131\3\0\6\131\1\u011d"+
+    "\3\131\1\u03b5\2\131\1\0\1\120\1\131\1\0\5\131"+
+    "\2\0\4\131\7\0\14\131\1\120\2\131\1\0\20\131"+
+    "\55\0\1\u05a4\110\0\1\u05a5\72\0\1\120\12\0\6\131"+
+    "\3\0\6\131\1\u011d\6\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\1\u05a6\3\131\7\0\14\131\1\120\2\131"+
+    "\1\0\20\131\73\0\1\u0571\133\0\1\u0541\124\0\1\u05a7"+
+    "\131\0\1\u05a8\32\0\1\120\12\0\6\131\3\0\6\131"+
+    "\1\u011d\1\131\1\u042a\4\131\1\0\1\120\1\131\1\0"+
+    "\5\131\2\0\4\131\7\0\14\131\1\120\2\131\1\0"+
+    "\20\131\36\0\1\u05a9\162\0\1\u05aa\112\0\1\u05ab\112\0"+
+    "\1\u05ac\111\0\1\u05ad\230\0\1\u05ae\112\0\1\u05af\100\0"+
+    "\1\u05b0\144\0\1\u0524\73\0\1\u05b1\162\0\1\u05b2\114\0"+
+    "\1\u05b3\125\0\1\u05b4\107\0\1\u0541\73\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[120472];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\6\0\2\1\1\0\2\1\12\0\2\1\1\11\4\1"+
+    "\1\11\5\1\1\11\2\1\2\11\2\1\4\11\1\1"+
+    "\1\11\1\1\1\11\26\1\1\11\2\1\2\11\1\1"+
+    "\2\11\1\1\1\11\2\1\1\11\1\1\2\11\13\1"+
+    "\1\11\7\1\1\11\12\1\2\11\2\1\2\11\2\1"+
+    "\1\11\6\1\1\11\1\1\1\11\2\1\1\11\7\1"+
+    "\1\11\43\1\1\11\5\1\2\11\11\1\2\11\5\0"+
+    "\1\11\105\1\1\11\2\0\1\1\1\0\1\1\1\11"+
+    "\1\0\72\1\1\11\2\1\1\0\1\11\10\0\2\11"+
+    "\20\0\1\1\1\11\2\1\1\0\1\11\23\1\1\11"+
+    "\40\1\3\11\5\1\1\11\1\0\1\11\3\0\1\11"+
+    "\2\0\101\1\1\11\1\0\1\1\1\0\3\1\1\0"+
+    "\66\1\40\0\1\11\1\1\1\0\3\1\1\0\77\1"+
+    "\2\11\2\0\44\1\1\0\1\11\45\1\1\0\1\11"+
+    "\3\0\1\1\1\0\1\11\2\0\1\1\10\0\1\11"+
+    "\15\0\71\1\2\0\24\1\1\0\27\1\35\0\76\1"+
+    "\1\0\16\1\24\0\66\1\1\0\5\1\4\0\1\1"+
+    "\6\0\27\1\1\0\31\1\1\0\2\1\13\0\32\1"+
+    "\2\0\23\1\1\11\1\1\2\11\5\0\31\1\2\0"+
+    "\21\1\5\0\10\1\1\0\15\1\2\0\16\1\2\0"+
+    "\6\1\2\0\13\1\2\0\17\1\2\0\12\1\1\11"+
+    "\1\0\15\1\2\0\10\1\1\0\11\1\2\0\5\1"+
+    "\1\0\5\1\2\0\3\1\2\0\4\1\1\0\2\1"+
+    "\2\0\3\1\1\0\2\1\2\0\3\1\2\0\1\1"+
+    "\2\0\3\1\2\0\1\1\2\0\3\1\2\0\1\1"+
+    "\2\0\1\1\4\0\1\1\2\0\1\1\13\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1460];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to JSPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in a JSP hidden comment ("<%-- ... --%>").
+	 */
+	public static final int INTERNAL_IN_HIDDEN_COMMENT		= -7;
+
+	/**
+	 * Token type specifying we're in a JSP directive (either include, page
+	 * or taglib).
+	 */
+	public static final int INTERNAL_IN_JSP_DIRECTIVE			= -8;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -9;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -12;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -13;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -14;
+
+	/**
+	 * Token type specifying we're in a Java documentation comment.
+	 */
+	public static final int INTERNAL_IN_JAVA_DOCCOMMENT		= -(1<<11);
+
+	/**
+	 * Token type specifying we're in Java code.
+	 */
+	public static final int INTERNAL_IN_JAVA_EXPRESSION		= -(2<<11);
+
+	/**
+	 * Token type specifying we're in Java multiline comment.
+	 */
+	public static final int INTERNAL_IN_JAVA_MLC				= -(3<<11);
+
+	/**
+	 * The state JSP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int jspInState;
+
+	/**
+	 * Whether closing markup tags are automatically completed for JSP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JSPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		jspInState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.PREPROCESSOR:
+				state = PI;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_HIDDEN_COMMENT:
+				state = HIDDEN_COMMENT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JSP_DIRECTIVE:
+				state = JSP_DIRECTIVE;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_JAVAxxx - jspInState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_JAVA_DOCCOMMENT:
+							state = JAVA_DOCCOMMENT;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_JAVA_EXPRESSION:
+							state = JAVA_EXPRESSION;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_JAVA_MLC:
+							state = JAVA_MLC;
+							start = text.offset;
+							break;
+					}
+					jspInState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public JSPTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public JSPTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 194) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 77: 
+          { addToken(Token.SEPARATOR); yybegin(JSP_DIRECTIVE);
+          }
+        case 96: break;
+        case 60: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 97: break;
+        case 10: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE);
+          }
+        case 98: break;
+        case 23: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 99: break;
+        case 81: 
+          { start = zzMarkedPos-4; yybegin(HIDDEN_COMMENT);
+          }
+        case 100: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 101: break;
+        case 91: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 102: break;
+        case 55: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR);
+          }
+        case 103: break;
+        case 37: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 104: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 105: break;
+        case 92: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+          }
+        case 106: break;
+        case 38: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 107: break;
+        case 86: 
+          { addToken(Token.FUNCTION);
+          }
+        case 108: break;
+        case 67: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+          }
+        case 109: break;
+        case 78: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE);
+          }
+        case 110: break;
+        case 32: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 111: break;
+        case 48: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 112: break;
+        case 52: 
+          { addToken(Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION);
+          }
+        case 113: break;
+        case 20: 
+          { /* Allowing JSP expressions, etc. */
+          }
+        case 114: break;
+        case 57: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 115: break;
+        case 63: 
+          { /* Skip all escaped chars. */
+          }
+        case 116: break;
+        case 93: 
+          { yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 117: break;
+        case 17: 
+          { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+          }
+        case 118: break;
+        case 50: 
+          { addToken(Token.IDENTIFIER); /* Needed as InTagIdentifier ignores it. */
+          }
+        case 119: break;
+        case 88: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_MULTILINE);
+          }
+        case 120: break;
+        case 65: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 121: break;
+        case 25: 
+          { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 122: break;
+        case 33: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 123: break;
+        case 84: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 124: break;
+        case 43: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 125: break;
+        case 80: 
+          { start = zzMarkedPos-3; yybegin(JAVA_DOCCOMMENT);
+          }
+        case 126: break;
+        case 54: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 127: break;
+        case 51: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 128: break;
+        case 64: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 129: break;
+        case 68: 
+          { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+          }
+        case 130: break;
+        case 66: 
+          { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 131: break;
+        case 27: 
+          { addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 132: break;
+        case 35: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 133: break;
+        case 12: 
+          { addToken(Token.OPERATOR);
+          }
+        case 134: break;
+        case 44: 
+          { addToken(Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 135: break;
+        case 82: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 136: break;
+        case 71: 
+          { start = zzMarkedPos-2; yybegin(JAVA_MLC);
+          }
+        case 137: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 138: break;
+        case 83: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 139: break;
+        case 40: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken;
+          }
+        case 140: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken;
+          }
+        case 141: break;
+        case 70: 
+          { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 142: break;
+        case 87: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 143: break;
+        case 94: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 144: break;
+        case 28: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 145: break;
+        case 41: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken;
+          }
+        case 146: break;
+        case 47: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 147: break;
+        case 36: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 148: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 149: break;
+        case 29: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 150: break;
+        case 24: 
+          { yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 151: break;
+        case 89: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 152: break;
+        case 79: 
+          { boolean highlightedAsRegex = false;
+			if (firstToken==null) {
+				addToken(Token.REGEX);
+				highlightedAsRegex = true;
+			}
+			else {
+				// If this is *likely* to be a regex, based on
+				// the previous token, highlight it as such.
+				Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+				if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+					addToken(Token.REGEX);
+					highlightedAsRegex = true;
+				}
+			}
+			// If it doesn't *appear* to be a regex, highlight it as
+			// individual tokens.
+			if (!highlightedAsRegex) {
+				int temp = zzStartRead + 1;
+				addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+				zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+			}
+
+          }
+        case 153: break;
+        case 59: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 154: break;
+        case 62: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 155: break;
+        case 73: 
+          { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 156: break;
+        case 46: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken;
+          }
+        case 157: break;
+        case 45: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 158: break;
+        case 26: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 159: break;
+        case 85: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 160: break;
+        case 18: 
+          { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+          }
+        case 161: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 162: break;
+        case 49: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 163: break;
+        case 72: 
+          { addToken(Token.SEPARATOR); start = zzMarkedPos; yybegin(jspInState);
+          }
+        case 164: break;
+        case 13: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 165: break;
+        case 75: 
+          { yybegin(YYINITIAL); addToken(Token.SEPARATOR);
+          }
+        case 166: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+          }
+        case 167: break;
+        case 74: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 168: break;
+        case 16: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 169: break;
+        case 95: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 170: break;
+        case 6: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 171: break;
+        case 42: 
+          { addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+          }
+        case 172: break;
+        case 31: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 173: break;
+        case 76: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 174: break;
+        case 19: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 175: break;
+        case 11: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 176: break;
+        case 90: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+          }
+        case 177: break;
+        case 58: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 178: break;
+        case 34: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 179: break;
+        case 61: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 180: break;
+        case 14: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 181: break;
+        case 15: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 182: break;
+        case 30: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 183: break;
+        case 69: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 184: break;
+        case 53: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 185: break;
+        case 21: 
+          { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG);
+          }
+        case 186: break;
+        case 22: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 187: break;
+        case 56: 
+          { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION);
+          }
+        case 188: break;
+        case 39: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 189: break;
+        case 1: 
+          { 
+          }
+        case 190: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 1461: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1462: break;
+            case JAVA_EXPRESSION: {
+              addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+            }
+            case 1463: break;
+            case HIDDEN_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken;
+            }
+            case 1464: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 1465: break;
+            case JAVA_DOCCOMMENT: {
+              yybegin(JAVA_EXPRESSION); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken;
+            }
+            case 1466: break;
+            case INTAG_SCRIPT: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 1467: break;
+            case JSP_DIRECTIVE: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_IN_JSP_DIRECTIVE); return firstToken;
+            }
+            case 1468: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 1469: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 1470: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); return firstToken;
+            }
+            case 1471: break;
+            case JAVASCRIPT: {
+              addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1472: break;
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 1473: break;
+            case INTAG_CHECK_TAG_NAME: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 1474: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+            }
+            case 1475: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1476: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 1477: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 1478: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 1479: break;
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 1480: break;
+            case JAVA_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken;
+            }
+            case 1481: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex	(revision 25584)
@@ -0,0 +1,535 @@
+/*
+ * 02/05/2012
+ *
+ * JavaScriptTokenMaker.java - Parses a document into JavaScript tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JavaScript files.  Its states could be simplified, but are
+ * kept the way they are to keep a degree of similarity (i.e. copy/paste)
+ * between it and HTML/JSP/PHPTokenMaker.  This should cause no difference in
+ * performance.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+%%
+
+%public
+%class JavaScriptTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaScriptTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Whitespace			= ([ \t\f]+)
+LineTerminator			= ([\n])
+
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin				= "/*"
+JS_MLCEnd					= "*/"
+JS_LineCommentBegin			= "//"
+JS_IntegerHelper1			= (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2			= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral			= ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral				= ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1			= ([fFdD]?)
+JS_FloatHelper2			= ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1			= ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2			= ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3			= ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral			= ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat		= (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator				= ([\(\)\{\}\[\]\]])
+JS_Separator2				= ([\;,.])
+JS_NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator		= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator				= ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier			= ({NonSeparator}+)
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({Letter}|"_"|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+
+	// ECMA keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+	"return"					{ addToken(Token.RESERVED_WORD_2); }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract"					{ addToken(Token.RESERVED_WORD); }
+	"boolean"						{ addToken(Token.DATA_TYPE); }
+	"byte"						{ addToken(Token.DATA_TYPE); }
+	"case"						{ addToken(Token.RESERVED_WORD); }
+	"catch"						{ addToken(Token.RESERVED_WORD); }
+	"char"						{ addToken(Token.DATA_TYPE); }
+	"class"						{ addToken(Token.RESERVED_WORD); }
+	"const"						{ addToken(Token.RESERVED_WORD); }
+	"debugger"					{ addToken(Token.RESERVED_WORD); }
+	"default"						{ addToken(Token.RESERVED_WORD); }
+	"do"							{ addToken(Token.RESERVED_WORD); }
+	"double"						{ addToken(Token.DATA_TYPE); }
+	"enum"						{ addToken(Token.RESERVED_WORD); }
+	"export"						{ addToken(Token.RESERVED_WORD); }
+	"extends"						{ addToken(Token.RESERVED_WORD); }
+	"final"						{ addToken(Token.RESERVED_WORD); }
+	"finally"						{ addToken(Token.RESERVED_WORD); }
+	"float"						{ addToken(Token.DATA_TYPE); }
+	"goto"						{ addToken(Token.RESERVED_WORD); }
+	"implements"					{ addToken(Token.RESERVED_WORD); }
+	"import"						{ addToken(Token.RESERVED_WORD); }
+	"instanceof"					{ addToken(Token.RESERVED_WORD); }
+	"int"						{ addToken(Token.DATA_TYPE); }
+	"interface"					{ addToken(Token.RESERVED_WORD); }
+	"long"						{ addToken(Token.DATA_TYPE); }
+	"native"						{ addToken(Token.RESERVED_WORD); }
+	"package"						{ addToken(Token.RESERVED_WORD); }
+	"private"						{ addToken(Token.RESERVED_WORD); }
+	"protected"					{ addToken(Token.RESERVED_WORD); }
+	"public"						{ addToken(Token.RESERVED_WORD); }
+	"short"						{ addToken(Token.DATA_TYPE); }
+	"static"						{ addToken(Token.RESERVED_WORD); }
+	"super"						{ addToken(Token.RESERVED_WORD); }
+	"switch"						{ addToken(Token.RESERVED_WORD); }
+	"synchronized"					{ addToken(Token.RESERVED_WORD); }
+	"throw"						{ addToken(Token.RESERVED_WORD); }
+	"throws"						{ addToken(Token.RESERVED_WORD); }
+	"transient"					{ addToken(Token.RESERVED_WORD); }
+	"try"						{ addToken(Token.RESERVED_WORD); }
+	"volatile"					{ addToken(Token.RESERVED_WORD); }
+	"null"						{ addToken(Token.RESERVED_WORD); }
+
+	// Literals.
+	"false" |
+	"true"						{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"						{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{JS_Identifier}					{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken; }
+}
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf\n\*]+			{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+	{JS_MLCEnd}				{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+<JS_EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java	(revision 25584)
@@ -0,0 +1,1440 @@
+/* The following code was generated by JFlex 1.4.1 on 3/1/12 7:38 PM */
+
+/*
+ * 02/05/2012
+ *
+ * JavaScriptTokenMaker.java - Parses a document into JavaScript tokens.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JavaScript files.  Its states could be simplified, but are
+ * kept the way they are to keep a degree of similarity (i.e. copy/paste)
+ * between it and HTML/JSP/PHPTokenMaker.  This should cause no difference in
+ * performance.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaScriptTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+
+public class JavaScriptTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int JS_STRING = 1;
+  public static final int JS_CHAR = 2;
+  public static final int JS_EOL_COMMENT = 4;
+  public static final int YYINITIAL = 0;
+  public static final int JS_MLC = 3;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\1\1\2\1\0\1\1\1\11\22\0\1\1\1\34\1\74"+
+    "\1\12\1\3\1\34\1\36\1\42\2\41\1\16\1\27\1\26\1\23"+
+    "\1\24\1\15\1\5\7\7\2\4\1\37\1\26\1\30\1\31\1\33"+
+    "\1\35\1\12\3\6\1\21\1\22\1\73\2\3\1\72\2\3\1\20"+
+    "\1\3\1\71\11\3\1\17\2\3\1\41\1\13\1\41\1\32\1\14"+
+    "\1\0\1\56\1\54\1\60\1\63\1\52\1\47\1\66\1\43\1\50"+
+    "\1\3\1\57\1\51\1\40\1\62\1\61\1\45\1\3\1\55\1\46"+
+    "\1\44\1\10\1\65\1\53\1\67\1\64\1\70\1\25\1\32\1\25"+
+    "\1\35\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\5\0\1\1\1\2\1\3\1\4\2\5\1\4\1\1"+
+    "\3\6\1\4\1\7\1\4\5\6\1\10\22\4\1\11"+
+    "\1\12\1\13\1\14\1\15\1\12\1\16\1\17\1\20"+
+    "\1\12\1\21\5\12\1\22\1\1\1\23\1\5\1\24"+
+    "\1\23\1\24\1\23\1\25\1\23\1\4\2\0\1\26"+
+    "\1\27\1\6\1\0\1\6\22\4\2\30\25\4\1\30"+
+    "\4\4\1\31\1\32\1\33\1\34\4\0\1\1\1\24"+
+    "\1\0\2\25\1\4\1\35\1\0\26\4\1\36\35\4"+
+    "\6\0\1\1\1\37\1\4\1\40\21\4\1\36\1\4"+
+    "\1\41\16\4\1\0\1\12\2\0\1\42\1\1\1\30"+
+    "\10\4\1\30\15\4\2\0\1\1\14\4\1\43\17\4";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[295];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\75\0\172\0\267\0\364\0\u0131\0\u016e\0\u01ab"+
+    "\0\u01e8\0\u0225\0\u0262\0\u029f\0\u01ab\0\u02dc\0\u0319\0\u0356"+
+    "\0\u0393\0\u01ab\0\u01ab\0\u03d0\0\u040d\0\u044a\0\u01ab\0\u0487"+
+    "\0\u01ab\0\u04c4\0\u0501\0\u053e\0\u057b\0\u05b8\0\u05f5\0\u0632"+
+    "\0\u066f\0\u06ac\0\u06e9\0\u0726\0\u0763\0\u07a0\0\u07dd\0\u081a"+
+    "\0\u0857\0\u0894\0\u08d1\0\u01ab\0\u090e\0\u01ab\0\u094b\0\u01ab"+
+    "\0\u0988\0\u01ab\0\u094b\0\u01ab\0\u09c5\0\u01ab\0\u0a02\0\u0a3f"+
+    "\0\u0a7c\0\u0ab9\0\u0af6\0\u01ab\0\u0b33\0\u0b70\0\u0b70\0\u0b70"+
+    "\0\u0bad\0\u0bea\0\u0c27\0\u0c64\0\u0ca1\0\u0cde\0\u0d1b\0\u0d58"+
+    "\0\u01ab\0\u0d95\0\u0d1b\0\u0319\0\u0dd2\0\u0e0f\0\u0e4c\0\u0e89"+
+    "\0\u0ec6\0\u0f03\0\u0f40\0\u0f7d\0\u0fba\0\u0ff7\0\u1034\0\u1071"+
+    "\0\u10ae\0\u10eb\0\u1128\0\u1165\0\u11a2\0\u11df\0\u121c\0\u01e8"+
+    "\0\u1259\0\u1296\0\u12d3\0\u1310\0\u134d\0\u138a\0\u13c7\0\u1404"+
+    "\0\u1441\0\u147e\0\u14bb\0\u14f8\0\u1535\0\u1572\0\u15af\0\u15ec"+
+    "\0\u1629\0\u1666\0\u16a3\0\u16e0\0\u171d\0\u175a\0\u1797\0\u17d4"+
+    "\0\u1811\0\u184e\0\u188b\0\u01ab\0\u18c8\0\u1905\0\u01ab\0\u1942"+
+    "\0\u197f\0\u19bc\0\u19f9\0\u1a36\0\u1a73\0\u1ab0\0\u0b70\0\u1aed"+
+    "\0\u1b2a\0\u1b67\0\u1ba4\0\u1be1\0\u1c1e\0\u1c5b\0\u1c98\0\u1cd5"+
+    "\0\u1d12\0\u1d4f\0\u1d8c\0\u1dc9\0\u1e06\0\u1e43\0\u1e80\0\u1ebd"+
+    "\0\u1efa\0\u1f37\0\u1f74\0\u1fb1\0\u1fee\0\u202b\0\u2068\0\u20a5"+
+    "\0\u20e2\0\u211f\0\u215c\0\u2199\0\u21d6\0\u2213\0\u2250\0\u228d"+
+    "\0\u22ca\0\u2307\0\u2344\0\u2381\0\u23be\0\u23fb\0\u2438\0\u2475"+
+    "\0\u24b2\0\u24ef\0\u252c\0\u2569\0\u25a6\0\u25e3\0\u2620\0\u265d"+
+    "\0\u269a\0\u26d7\0\u2714\0\u2751\0\u278e\0\u27cb\0\u2808\0\u2845"+
+    "\0\u2882\0\u28bf\0\u28fc\0\u2939\0\u2976\0\u29b3\0\u01ab\0\u29f0"+
+    "\0\u01e8\0\u2a2d\0\u2a6a\0\u2aa7\0\u2ae4\0\u2b21\0\u2b5e\0\u2b9b"+
+    "\0\u2bd8\0\u2c15\0\u2c52\0\u2c8f\0\u2ccc\0\u2d09\0\u2d46\0\u2d83"+
+    "\0\u2dc0\0\u2dfd\0\u01e8\0\u2e3a\0\u01e8\0\u2e77\0\u2eb4\0\u2ef1"+
+    "\0\u2f2e\0\u2f6b\0\u2fa8\0\u2fe5\0\u3022\0\u305f\0\u309c\0\u30d9"+
+    "\0\u3116\0\u3153\0\u3190\0\u1905\0\u01ab\0\u31cd\0\u320a\0\u3247"+
+    "\0\u3284\0\u1be1\0\u32c1\0\u32fe\0\u333b\0\u3378\0\u33b5\0\u33f2"+
+    "\0\u342f\0\u346c\0\u34a9\0\u34e6\0\u3523\0\u3560\0\u359d\0\u35da"+
+    "\0\u3617\0\u3654\0\u3691\0\u36ce\0\u370b\0\u3748\0\u3785\0\u37c2"+
+    "\0\u37ff\0\u3247\0\u383c\0\u3879\0\u38b6\0\u38f3\0\u3930\0\u396d"+
+    "\0\u39aa\0\u39e7\0\u3a24\0\u3a61\0\u3a9e\0\u3adb\0\u3b18\0\u01e8"+
+    "\0\u3b55\0\u3b92\0\u3bcf\0\u3c0c\0\u3c49\0\u3c86\0\u3cc3\0\u3d00"+
+    "\0\u3d3d\0\u3d7a\0\u3db7\0\u3df4\0\u3e31\0\u3e6e\0\u3eab";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[295];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\6\1\7\1\10\1\11\1\12\1\13\1\11\1\12"+
+    "\1\14\1\15\2\6\1\11\1\16\1\17\4\11\1\20"+
+    "\1\21\1\22\1\23\1\24\1\25\2\17\1\26\1\17"+
+    "\1\27\1\30\1\27\1\11\1\22\1\31\1\11\1\32"+
+    "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\11\1\45\1\11\1\46\1\47\1\11"+
+    "\1\50\1\51\2\11\1\52\1\53\1\11\1\54\2\55"+
+    "\1\56\10\55\1\57\60\55\1\60\2\61\1\62\10\61"+
+    "\1\63\26\61\1\64\32\61\2\65\1\66\13\65\1\67"+
+    "\24\65\1\70\3\65\1\71\3\65\1\72\21\65\2\73"+
+    "\1\74\40\73\1\70\3\73\1\71\3\73\1\72\21\73"+
+    "\1\6\2\0\6\6\1\0\3\6\2\0\4\6\15\0"+
+    "\1\6\2\0\31\6\2\0\1\7\170\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\31\11\1\0\1\76\2\0\1\76\2\12"+
+    "\1\76\1\12\1\76\1\0\3\76\2\0\1\76\1\77"+
+    "\1\100\1\101\1\0\1\102\13\0\1\76\2\0\4\76"+
+    "\1\100\1\76\1\77\1\101\10\76\1\100\7\76\1\100"+
+    "\1\0\1\76\2\0\1\76\1\103\1\104\1\76\1\104"+
+    "\1\76\1\0\3\76\2\0\1\105\1\77\1\100\1\101"+
+    "\1\0\1\102\13\0\1\76\2\0\4\76\1\100\1\76"+
+    "\1\77\1\101\10\76\1\100\3\76\1\105\3\76\1\100"+
+    "\1\0\1\6\2\0\6\11\1\0\1\6\1\75\1\11"+
+    "\2\0\4\11\15\0\1\11\2\0\17\11\1\106\11\11"+
+    "\1\0\13\107\1\110\1\107\1\111\1\112\12\107\1\113"+
+    "\43\107\31\0\1\27\66\0\1\27\5\0\1\27\47\0"+
+    "\2\102\1\0\1\102\114\0\1\27\1\0\1\27\73\0"+
+    "\1\114\1\27\74\0\1\27\1\0\1\115\72\0\1\27"+
+    "\4\0\1\27\36\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\116"+
+    "\11\11\1\117\6\11\1\120\7\11\1\0\1\6\2\0"+
+    "\5\11\1\121\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\12\11\1\122\1\123\15\11\1\0"+
+    "\1\6\2\0\5\11\1\124\1\0\1\6\1\75\1\11"+
+    "\2\0\4\11\15\0\1\11\2\0\1\125\1\126\6\11"+
+    "\1\127\10\11\1\130\7\11\1\0\1\6\2\0\5\11"+
+    "\1\131\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\5\11\1\132\1\133\4\11\1\134\2\11"+
+    "\1\135\12\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\136\2\0\3\11"+
+    "\1\137\1\140\12\11\1\141\11\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\16\11\1\142\12\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\3\11\1\143\2\11\1\144\10\11\1\145"+
+    "\2\11\1\146\1\11\1\147\4\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\1\150\4\11\1\151\23\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\12\11\1\152\3\11\1\153\2\11"+
+    "\1\154\7\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\7\11"+
+    "\1\155\21\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\11\11"+
+    "\1\156\17\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\157"+
+    "\5\11\1\160\4\11\1\161\2\11\1\162\12\11\1\0"+
+    "\1\6\2\0\5\11\1\163\1\0\1\6\1\75\1\11"+
+    "\2\0\4\11\15\0\1\11\2\0\7\11\1\164\3\11"+
+    "\1\165\15\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\7\11"+
+    "\1\166\6\11\1\167\12\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\135\2\11\1\170\12\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\16\11\1\171\12\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\13\11\1\172\15\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\17\11\1\173\11\11\1\0\2\55"+
+    "\1\0\10\55\1\0\60\55\1\0\2\174\1\0\5\174"+
+    "\1\175\56\174\1\176\5\174\2\61\1\0\10\61\1\0"+
+    "\26\61\1\0\32\61\2\65\1\0\13\65\1\0\24\65"+
+    "\1\0\3\65\1\0\3\65\1\0\21\65\15\0\1\177"+
+    "\123\0\1\200\74\0\1\201\3\0\1\202\77\0\1\203"+
+    "\21\0\2\73\1\0\40\73\1\0\3\73\1\0\3\73"+
+    "\1\0\21\73\1\6\2\0\5\6\1\204\1\0\3\6"+
+    "\2\0\4\6\15\0\1\6\2\0\31\6\1\0\1\76"+
+    "\2\0\6\76\1\0\3\76\2\0\4\76\15\0\1\76"+
+    "\2\0\31\76\1\0\1\76\2\0\1\76\2\205\1\76"+
+    "\1\205\1\76\1\0\3\76\2\0\4\76\1\206\3\0"+
+    "\1\206\10\0\1\76\2\0\31\76\1\0\1\76\2\0"+
+    "\1\76\2\102\1\76\1\102\1\76\1\0\3\76\2\0"+
+    "\2\76\1\100\1\101\15\0\1\76\2\0\4\76\1\100"+
+    "\2\76\1\101\10\76\1\100\7\76\1\100\1\0\1\76"+
+    "\2\0\1\76\2\103\1\76\1\103\1\76\1\0\3\76"+
+    "\2\0\2\76\1\100\1\101\1\0\1\102\13\0\1\76"+
+    "\2\0\4\76\1\100\2\76\1\101\10\76\1\100\7\76"+
+    "\1\100\1\0\1\76\2\0\1\76\1\103\1\104\1\76"+
+    "\1\104\1\76\1\0\3\76\2\0\1\76\1\207\1\100"+
+    "\1\101\1\0\1\102\13\0\1\76\2\0\4\76\1\100"+
+    "\1\76\1\207\1\101\10\76\1\100\7\76\1\100\1\0"+
+    "\1\76\2\0\1\76\4\210\1\76\1\0\3\76\2\0"+
+    "\2\76\2\210\15\0\1\76\2\0\4\76\1\210\2\76"+
+    "\1\210\1\76\1\210\1\76\1\210\1\76\1\210\2\76"+
+    "\1\210\7\76\1\210\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\7\11\1\211\21\11\1\0\13\107\1\110\1\107\1\212"+
+    "\61\107\1\0\72\107\16\0\1\213\107\0\1\27\1\0"+
+    "\1\17\41\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\5\11\1\214"+
+    "\4\11\1\215\16\11\1\0\1\6\2\0\5\11\1\216"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\217\5\11\1\140\7\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\2\11\1\220\26\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\11\11\1\221\17\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\5\11\1\222\10\11\1\223\12\11"+
+    "\1\0\1\6\2\0\6\11\1\0\1\6\1\75\1\11"+
+    "\2\0\4\11\15\0\1\11\2\0\12\11\1\224\2\11"+
+    "\1\225\13\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\2\11"+
+    "\1\226\26\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\16\11"+
+    "\1\227\12\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\13\11"+
+    "\1\230\15\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\5\11"+
+    "\1\231\23\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\17\11"+
+    "\1\232\11\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\17\11"+
+    "\1\233\11\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\17\11"+
+    "\1\234\11\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\16\11"+
+    "\1\235\12\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\6\11"+
+    "\1\236\22\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\12\11"+
+    "\1\140\16\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\2\11"+
+    "\1\237\26\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\26\11"+
+    "\1\240\1\11\1\241\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\1\11\1\242\1\11\1\243\25\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\17\11\1\244\11\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\15\11\1\245\13\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\3\11\1\246\25\11\1\0\1\6\2\0"+
+    "\5\11\1\247\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\31\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\250\15\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\1\11\1\251\1\252\26\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\5\11\1\253\23\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\1\11\1\254\27\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\7\11\1\255\21\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\16\11\1\256\12\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\1\11\1\257\27\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\1\11\1\260\27\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\3\11\1\261\25\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\13\11\1\262\15\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\13\11\1\263\15\11\1\0\1\6\2\0"+
+    "\6\11\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\1\11\1\264\1\11\1\246\25\11\1\0"+
+    "\1\6\2\0\6\11\1\0\1\6\1\75\1\11\2\0"+
+    "\4\11\15\0\1\11\2\0\17\11\1\265\11\11\1\0"+
+    "\1\6\2\0\6\11\1\0\1\6\1\75\1\11\2\0"+
+    "\4\11\15\0\1\11\2\0\6\11\1\266\22\11\1\0"+
+    "\1\6\2\0\6\11\1\0\1\6\1\75\1\11\2\0"+
+    "\4\11\15\0\1\11\2\0\10\11\1\140\20\11\1\0"+
+    "\1\6\2\0\6\11\1\0\1\6\1\75\1\11\2\0"+
+    "\4\11\15\0\1\11\2\0\1\11\1\267\27\11\1\0"+
+    "\1\6\2\0\6\11\1\0\1\6\1\75\1\11\2\0"+
+    "\4\11\15\0\1\11\2\0\4\11\1\270\1\11\1\271"+
+    "\2\11\1\272\17\11\1\0\1\6\2\0\5\11\1\273"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\31\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\5\11"+
+    "\1\274\1\275\22\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\1\11\1\276\27\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\26\11\1\140\2\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\4\11\1\277\24\11\5\0\4\300\11\0\2\300\24\0"+
+    "\1\300\2\0\1\300\1\0\1\300\1\0\1\300\1\0"+
+    "\1\300\2\0\1\300\7\0\1\300\5\0\4\301\11\0"+
+    "\2\301\24\0\1\301\2\0\1\301\1\0\1\301\1\0"+
+    "\1\301\1\0\1\301\2\0\1\301\7\0\1\301\45\0"+
+    "\1\302\75\0\1\303\100\0\1\304\76\0\1\305\21\0"+
+    "\1\6\2\0\1\6\4\306\1\6\1\0\3\6\2\0"+
+    "\2\6\2\306\15\0\1\6\2\0\4\6\1\306\2\6"+
+    "\1\306\1\6\1\306\1\6\1\306\1\6\1\306\2\6"+
+    "\1\306\7\6\1\306\1\0\1\76\2\0\1\76\2\205"+
+    "\1\76\1\205\1\76\1\0\3\76\2\0\2\76\1\100"+
+    "\1\76\15\0\1\76\2\0\4\76\1\100\13\76\1\100"+
+    "\7\76\1\100\5\0\2\205\1\0\1\205\65\0\1\76"+
+    "\2\0\1\76\4\210\1\76\1\0\3\76\2\0\1\76"+
+    "\1\207\2\210\15\0\1\76\2\0\4\76\1\210\1\76"+
+    "\1\207\1\210\1\76\1\210\1\76\1\210\1\76\1\210"+
+    "\2\76\1\210\7\76\1\210\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\3\11\1\143\25\11\41\0\1\212\7\0\1\212"+
+    "\15\0\1\212\23\0\1\307\57\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\3\11\1\140\25\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\16\11\1\310\12\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\7\11\1\311\21\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\17\11\1\312\11\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\7\11\1\313\21\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\6\11\1\314\22\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\22\11\1\315\6\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\1\11\1\316\27\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\3\11\1\317\25\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\14\11\1\320\14\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\7\11\1\135\21\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\12\11\1\321\16\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\1\11\1\314\27\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\1\11\1\264\27\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\15\11\1\322\13\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\15\11\1\323\13\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\324\15\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\321\15\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\3\11\1\216\25\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\6\11\1\325\7\11\1\326\12\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\13\11\1\327\15\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\5\11\1\330\23\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\7\11\1\331\21\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\1\11\1\332\27\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\23\11\1\333\5\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\13\11\1\334\15\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\7\11\1\140\21\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\140\2\0\31\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\6\11\1\335\22\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\7\11\1\336\21\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\16\11\1\326\12\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\6\11\1\246\22\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\1\140\30\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\13\11\1\337\15\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\6\11\1\340\22\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\7\11\1\333\21\11\1\0\1\6\2\0\5\11\1\341"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\31\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\11"+
+    "\1\342\27\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\12\11"+
+    "\1\333\16\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\3\11"+
+    "\1\214\25\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\15\11"+
+    "\1\254\13\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\11"+
+    "\1\343\1\11\1\344\25\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\6\11\1\140\22\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\5\11\1\345\23\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\346\15\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\7\11\1\347\21\11\1\0\1\6\2\0\5\11"+
+    "\1\350\1\0\1\6\1\75\1\11\2\0\4\11\15\0"+
+    "\1\11\2\0\31\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\11\11\1\351\17\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\20\11\1\140\10\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\13\11\1\352\15\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\16\11\1\140\12\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\5\11\1\353\23\11\5\0\4\354\11\0\2\354\24\0"+
+    "\1\354\2\0\1\354\1\0\1\354\1\0\1\354\1\0"+
+    "\1\354\2\0\1\354\7\0\1\354\5\0\4\355\11\0"+
+    "\2\355\24\0\1\355\2\0\1\355\1\0\1\355\1\0"+
+    "\1\355\1\0\1\355\2\0\1\355\7\0\1\355\46\0"+
+    "\1\356\66\0\1\357\107\0\1\303\46\0\1\360\50\0"+
+    "\1\6\2\0\1\6\4\361\1\6\1\0\3\6\2\0"+
+    "\2\6\2\361\15\0\1\6\2\0\4\6\1\361\2\6"+
+    "\1\361\1\6\1\361\1\6\1\361\1\6\1\361\2\6"+
+    "\1\361\7\6\1\361\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\10\11\1\362\20\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\3\11\1\363\25\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\16\11\1\364\12\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\5\11\1\365\23\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\13\11\1\347\15\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\7\11\1\366\21\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\7\11\1\367\21\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\13\11\1\370\15\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\1\11\1\333\27\11\1\0\1\6\2\0\6\11\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\1\371\30\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\11"+
+    "\1\372\27\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\6\11"+
+    "\1\373\22\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\7\11"+
+    "\1\374\21\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\12\11"+
+    "\1\344\16\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\26\11"+
+    "\1\335\2\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\17\11"+
+    "\1\375\11\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\12\11"+
+    "\1\376\16\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\13\11"+
+    "\1\377\15\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\2\11"+
+    "\1\u0100\26\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\17\11"+
+    "\1\u0101\11\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\14\11"+
+    "\1\140\14\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\7\11"+
+    "\1\u0102\21\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\12\11"+
+    "\1\u0103\16\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\12\11"+
+    "\1\u0104\16\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\5\11"+
+    "\1\u0105\23\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\11"+
+    "\1\140\27\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\22\11"+
+    "\1\246\6\11\1\0\1\6\2\0\5\11\1\u0106\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\31\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\1\11\1\246"+
+    "\27\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\23\11\1\u0107"+
+    "\5\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\6\11\1\257"+
+    "\22\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\1\11\1\150"+
+    "\27\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\17\11\1\u0108"+
+    "\11\11\40\0\1\357\6\0\1\303\43\0\1\u0109\62\0"+
+    "\6\360\1\0\1\u010a\1\0\1\u010a\1\360\1\u010a\4\360"+
+    "\2\u010a\1\0\2\u010a\1\0\1\u010a\2\0\4\u010a\1\360"+
+    "\2\u010a\31\360\1\0\1\6\2\0\1\6\4\u010b\1\6"+
+    "\1\0\3\6\2\0\2\6\2\u010b\15\0\1\6\2\0"+
+    "\4\6\1\u010b\2\6\1\u010b\1\6\1\u010b\1\6\1\u010b"+
+    "\1\6\1\u010b\2\6\1\u010b\7\6\1\u010b\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\5\11\1\u010c\23\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\4\11\1\140\24\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\15\11\1\140\13\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\15\11\1\u010d\13\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\27\11\1\u010e\1\u010f\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\23\11\1\246\5\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\12\11\1\u0110\16\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\5\11\1\u0111\23\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\11\2\0\6\11\1\u0112\22\11\1\0\1\6"+
+    "\2\0\6\11\1\0\1\6\1\75\1\11\2\0\4\11"+
+    "\15\0\1\u0113\2\0\31\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\5\11\1\u0114\23\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\4\11\1\u0115\24\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\17\11\1\u0116\11\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\7\11\1\335\21\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\20\11\1\214\10\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\u0117\15\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\17\11\1\u0118\11\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\13\11\1\u0119\15\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\17\11\1\u011a\11\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\6\11\1\344\22\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\23\11\1\226\5\11\1\0\1\6\2\0\6\11"+
+    "\1\0\1\6\1\75\1\11\2\0\4\11\15\0\1\11"+
+    "\2\0\5\11\1\u011b\23\11\16\0\1\360\57\0\1\6"+
+    "\2\0\1\6\4\11\1\6\1\0\3\6\2\0\2\6"+
+    "\2\11\15\0\1\6\2\0\4\6\1\11\2\6\1\11"+
+    "\1\6\1\11\1\6\1\11\1\6\1\11\2\6\1\11"+
+    "\7\6\1\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\7\11"+
+    "\1\u011c\21\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\11"+
+    "\1\u011d\27\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\17\11"+
+    "\1\u011e\11\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\6\11"+
+    "\1\u011f\22\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\16\11"+
+    "\1\u0120\12\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\16\11"+
+    "\1\u0121\12\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\21\11"+
+    "\1\140\7\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\7\11"+
+    "\1\u0122\21\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\1\11"+
+    "\1\u0100\27\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\13\11"+
+    "\1\u0123\15\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\15\11"+
+    "\1\220\13\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\17\11"+
+    "\1\333\11\11\1\0\1\6\2\0\6\11\1\0\1\6"+
+    "\1\75\1\11\2\0\4\11\15\0\1\11\2\0\15\11"+
+    "\1\344\13\11\1\0\1\6\2\0\5\11\1\246\1\0"+
+    "\1\6\1\75\1\11\2\0\4\11\15\0\1\11\2\0"+
+    "\31\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\1\11\1\u0112"+
+    "\27\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\17\11\1\344"+
+    "\11\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\7\11\1\274"+
+    "\21\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\1\11\1\335"+
+    "\27\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\16\11\1\u0124"+
+    "\12\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\17\11\1\u0125"+
+    "\11\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\17\11\1\140"+
+    "\11\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\17\11\1\u0126"+
+    "\11\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\15\11\1\246"+
+    "\13\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\13\11\1\u011e"+
+    "\15\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\5\11\1\u0127"+
+    "\23\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\1\11\1\214"+
+    "\27\11\1\0\1\6\2\0\6\11\1\0\1\6\1\75"+
+    "\1\11\2\0\4\11\15\0\1\11\2\0\25\11\1\u011d"+
+    "\3\11\1\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[16104];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\5\0\2\1\1\11\4\1\1\11\4\1\2\11\3\1"+
+    "\1\11\1\1\1\11\22\1\1\11\1\1\1\11\1\1"+
+    "\1\11\1\1\1\11\1\1\1\11\1\1\1\11\5\1"+
+    "\1\11\12\1\2\0\1\11\2\1\1\0\57\1\1\11"+
+    "\2\1\1\11\4\0\2\1\1\0\4\1\1\0\64\1"+
+    "\6\0\1\1\1\11\44\1\1\0\1\11\2\0\31\1"+
+    "\2\0\35\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[295];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaScriptTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public JavaScriptTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public JavaScriptTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 164) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 27: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 36: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 37: break;
+        case 8: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 38: break;
+        case 28: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 39: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 40: break;
+        case 23: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 41: break;
+        case 31: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 42: break;
+        case 26: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 43: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 44: break;
+        case 21: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 45: break;
+        case 12: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 46: break;
+        case 9: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 47: break;
+        case 20: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 48: break;
+        case 24: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 49: break;
+        case 7: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 50: break;
+        case 4: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 51: break;
+        case 18: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 52: break;
+        case 16: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL);
+          }
+        case 53: break;
+        case 33: 
+          { addToken(Token.FUNCTION);
+          }
+        case 54: break;
+        case 30: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 55: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 56: break;
+        case 13: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL);
+          }
+        case 57: break;
+        case 32: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 58: break;
+        case 15: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 59: break;
+        case 25: 
+          { /* Skip all escaped chars. */
+          }
+        case 60: break;
+        case 29: 
+          { boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+          }
+        case 61: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 62: break;
+        case 35: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 63: break;
+        case 19: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 64: break;
+        case 5: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 65: break;
+        case 6: 
+          { addToken(Token.OPERATOR);
+          }
+        case 66: break;
+        case 22: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 67: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 68: break;
+        case 10: 
+          { 
+          }
+        case 69: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 70: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+            }
+            case 296: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken;
+            }
+            case 297: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 298: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 299: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 300: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex	(revision 25584)
@@ -0,0 +1,754 @@
+/*
+ * 11/13/2004
+ *
+ * JavaTokenMaker.java - Scanner for the Java programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Java programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class JavaTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= ([A-Za-z])
+LetterOrUnderscore				= ({Letter}|"_")
+Underscores						= ([_]+)
+NonzeroDigit						= ([1-9])
+BinaryDigit						= ([0-1])
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+AnyCharacterButApostropheOrBackSlash	= ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash	= ([^\\\"\n])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape							= ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+CharLiteral				= ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+UnclosedCharLiteral			= ([\'][^\'\n]*)
+ErrorCharLiteral			= ({UnclosedCharLiteral}[\'])
+StringLiteral				= ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral			= ({UnclosedStringLiteral}[\"])
+
+MLCBegin					= "/*"
+MLCEnd					= "*/"
+DocCommentBegin			= "/**"
+LineCommentBegin			= "//"
+
+DigitOrUnderscore			= ({Digit}|[_])
+DigitsAndUnderscoresEnd		= ({DigitOrUnderscore}*{Digit})
+IntegerHelper				= (({NonzeroDigit}{DigitsAndUnderscoresEnd}?)|"0")
+IntegerLiteral				= ({IntegerHelper}[lL]?)
+
+BinaryDigitOrUnderscore		= ({BinaryDigit}|[_])
+BinaryDigitsAndUnderscores	= ({BinaryDigit}({BinaryDigitOrUnderscore}*{BinaryDigit})?)
+BinaryLiteral				= ("0"[bB]{BinaryDigitsAndUnderscores})
+
+HexDigitOrUnderscore		= ({HexDigit}|[_])
+HexDigitsAndUnderscores		= ({HexDigit}({HexDigitOrUnderscore}*{HexDigit})?)
+OctalDigitOrUnderscore		= ({OctalDigit}|[_])
+OctalDigitsAndUnderscoresEnd= ({OctalDigitOrUnderscore}*{OctalDigit})
+HexHelper					= ("0"(([xX]{HexDigitsAndUnderscores})|({OctalDigitsAndUnderscoresEnd})))
+HexLiteral					= ({HexHelper}[lL]?)
+
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral				= ("true"|"false")
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+CurrentBlockTag				= ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+ProposedBlockTag			= ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
+BlockTag					= ({CurrentBlockTag}|{ProposedBlockTag})
+InlineTag					= ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+Annotation				= ("@"{Identifier}?)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state DOCCOMMENT
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract"|
+	"assert" |
+	"break"	 |
+	"case"	 |
+	"catch"	 |
+	"class"	 |
+	"const"	 |
+	"continue" |
+	"default" |
+	"do"	 |
+	"else"	 |
+	"enum"	 |
+	"extends" |
+	"final"	 |
+	"finally" |
+	"for"	 |
+	"goto"	 |
+	"if"	 |
+	"implements" |
+	"import" |
+	"instanceof" |
+	"interface" |
+	"native" |
+	"new"	 |
+	"null"	 |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"static" |
+	"strictfp" |
+	"super"	 |
+	"switch" |
+	"synchronized" |
+	"this"	 |
+	"throw"	 |
+	"throws" |
+	"transient" |
+	"try"	 |
+	"void"	 |
+	"volatile" |
+	"while"					{ addToken(Token.RESERVED_WORD); }
+	"return"				{ addToken(Token.RESERVED_WORD_2); }
+
+	/* Data types. */
+	"boolean" |
+	"byte" |
+	"char" |
+	"double" |
+	"float" |
+	"int" |
+	"long" |
+	"short"					{ addToken(Token.DATA_TYPE); }
+
+	/* Booleans. */
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	/* java.lang classes */
+	"Appendable" |
+	"AutoCloseable" |
+	"CharSequence" |
+	"Cloneable" |
+	"Comparable" |
+	"Iterable" |
+	"Readable" |
+	"Runnable" |
+	"Thread.UncaughtExceptionHandler" |
+	"Boolean" |
+	"Byte" |
+	"Character" |
+	"Character.Subset" | 
+	"Character.UnicodeBlock" | 
+	"Class" |
+	"ClassLoader" |
+	"Compiler" |
+	"Double" |
+	"Enum" |
+	"Float" |
+	"InheritableThreadLocal" |
+	"Integer" |
+	"Long" |
+	"Math" |
+	"Number" |
+	"Object" |
+	"Package" |
+	"Process" |
+	"ProcessBuilder" |
+	"ProcessBuilder.Redirect" |
+	"Runtime" |
+	"RuntimePermission" |
+	"SecurityManager" |
+	"Short" |
+	"StackTraceElement" |
+	"StrictMath" |
+	"String" |
+	"StringBuffer" |
+	"StringBuilder" |
+	"System" |
+	"Thread" |
+	"ThreadGroup" |
+	"ThreadLocal" |
+	"Throwable" |
+	"Void" |
+	"Character.UnicodeScript" |
+	"ProcessBuilder.Redirect.Type" |
+	"Thread.State" |
+	"ArithmeticException" |
+	"ArrayIndexOutOfBoundsException" |
+	"ArrayStoreException" |
+	"ClassCastException" |
+	"ClassNotFoundException" |
+	"CloneNotSupportedException" |
+	"EnumConstantNotPresentException" |
+	"Exception" |
+	"IllegalAccessException" |
+	"IllegalArgumentException" |
+	"IllegalMonitorStateException" |
+	"IllegalStateException" |
+	"IllegalThreadStateException" |
+	"IndexOutOfBoundsException" |
+	"InstantiationException" |
+	"InterruptedException" |
+	"NegativeArraySizeException" |
+	"NoSuchFieldException" |
+	"NoSuchMethodException" |
+	"NullPointerException" |
+	"NumberFormatException" |
+	"RuntimeException" |
+	"SecurityException" |
+	"StringIndexOutOfBoundsException" |
+	"TypeNotPresentException" |
+	"UnsupportedOperationException" |
+	"AbstractMethodError" |
+	"AssertionError" |
+	"ClassCircularityError" |
+	"ClassFormatError" |
+	"Error" |
+	"ExceptionInInitializerError" |
+	"IllegalAccessError" |
+	"IncompatibleClassChangeError" |
+	"InstantiationError" |
+	"InternalError" |
+	"LinkageError" |
+	"NoClassDefFoundError" |
+	"NoSuchFieldError" |
+	"NoSuchMethodError" |
+	"OutOfMemoryError" |
+	"StackOverflowError" |
+	"ThreadDeath" |
+	"UnknownError" |
+	"UnsatisfiedLinkError" |
+	"UnsupportedClassVersionError" |
+	"VerifyError" |
+	"VirtualMachineError" |
+
+	/* java.io classes*/
+    "Closeable" |
+    "DataInput" |
+    "DataOutput" |
+    "Externalizable" |
+    "FileFilter" |
+    "FilenameFilter" |
+    "Flushable" |
+    "ObjectInput" |
+    "ObjectInputValidation" |
+    "ObjectOutput" |
+    "ObjectStreamConstants" |
+    "Serializable" |
+
+    "BufferedInputStream" |
+    "BufferedOutputStream" |
+    "BufferedReader" |
+    "BufferedWriter" |
+    "ByteArrayInputStream" |
+    "ByteArrayOutputStream" |
+    "CharArrayReader" |
+    "CharArrayWriter" |
+    "Console" |
+    "DataInputStream" |
+    "DataOutputStream" |
+    "File" |
+    "FileDescriptor" |
+    "FileInputStream" |
+    "FileOutputStream" |
+    "FilePermission" |
+    "FileReader" |
+    "FileWriter" |
+    "FilterInputStream" |
+    "FilterOutputStream" |
+    "FilterReader" |
+    "FilterWriter" |
+    "InputStream" |
+    "InputStreamReader" |
+    "LineNumberInputStream" |
+    "LineNumberReader" |
+    "ObjectInputStream" |
+    "ObjectInputStream.GetField" |
+    "ObjectOutputStream" |
+    "ObjectOutputStream.PutField" |
+    "ObjectStreamClass" |
+    "ObjectStreamField" |
+    "OutputStream" |
+    "OutputStreamWriter" |
+    "PipedInputStream" |
+    "PipedOutputStream" |
+    "PipedReader" |
+    "PipedWriter" |
+    "PrintStream" |
+    "PrintWriter" |
+    "PushbackInputStream" |
+    "PushbackReader" |
+    "RandomAccessFile" |
+    "Reader" |
+    "SequenceInputStream" |
+    "SerializablePermission" |
+    "StreamTokenizer" |
+    "StringBufferInputStream" |
+    "StringReader" |
+    "StringWriter" |
+    "Writer" |
+
+    "CharConversionException" |
+    "EOFException" |
+    "FileNotFoundException" |
+    "InterruptedIOException" |
+    "InvalidClassException" |
+    "InvalidObjectException" |
+    "IOException" |
+    "NotActiveException" |
+    "NotSerializableException" |
+    "ObjectStreamException" |
+    "OptionalDataException" |
+    "StreamCorruptedException" |
+    "SyncFailedException" |
+    "UnsupportedEncodingException" |
+    "UTFDataFormatException" |
+    "WriteAbortedException" |
+
+    "IOError" |
+
+	/* java.util classes */
+    "Collection" |
+    "Comparator" |
+    "Deque" |
+    "Enumeration" |
+    "EventListener" |
+    "Formattable" |
+    "Iterator" |
+    "List" |
+    "ListIterator" |
+    "Map" |
+    "Map.Entry" |
+    "NavigableMap" |
+    "NavigableSet" |
+    "Observer" |
+    "Queue" |
+    "RandomAccess" |
+    "Set" |
+    "SortedMap" |
+    "SortedSet" |
+
+    "AbstractCollection" |
+    "AbstractList" |
+    "AbstractMap" |
+    "AbstractMap.SimpleEntry" |
+    "AbstractMap.SimpleImmutableEntry" |
+    "AbstractQueue" |
+    "AbstractSequentialList" |
+    "AbstractSet" |
+    "ArrayDeque" |
+    "ArrayList" |
+    "Arrays" |
+    "BitSet" |
+    "Calendar" |
+    "Collections" |
+    "Currency" |
+    "Date" |
+    "Dictionary" |
+    "EnumMap" |
+    "EnumSet" |
+    "EventListenerProxy" |
+    "EventObject" |
+    "FormattableFlags" |
+    "Formatter" |
+    "GregorianCalendar" |
+    "HashMap" |
+    "HashSet" |
+    "Hashtable" |
+    "IdentityHashMap" |
+    "LinkedHashMap" |
+    "LinkedHashSet" |
+    "LinkedList" |
+    "ListResourceBundle" |
+    "Locale" |
+    "Locale.Builder" |
+    "Objects" |
+    "Observable" |
+    "PriorityQueue" |
+    "Properties" |
+    "PropertyPermission" |
+    "PropertyResourceBundle" |
+    "Random" |
+    "ResourceBundle" |
+    "ResourceBundle.Control" |
+    "Scanner" |
+    "ServiceLoader" |
+    "SimpleTimeZone" |
+    "Stack" |
+    "StringTokenizer" |
+    "Timer" |
+    "TimerTask" |
+    "TimeZone" |
+    "TreeMap" |
+    "TreeSet" |
+    "UUID" |
+    "Vector" |
+    "WeakHashMap" |
+
+    "Formatter.BigDecimalLayoutForm" |
+    "Locale.Category" |
+
+    "ConcurrentModificationException" |
+    "DuplicateFormatFlagsException" |
+    "EmptyStackException" |
+    "FormatFlagsConversionMismatchException" |
+    "FormatterClosedException" |
+    "IllegalFormatCodePointException" |
+    "IllegalFormatConversionException" |
+    "IllegalFormatException" |
+    "IllegalFormatFlagsException" |
+    "IllegalFormatPrecisionException" |
+    "IllegalFormatWidthException" |
+    "IllformedLocaleException" |
+    "InputMismatchException" |
+    "InvalidPropertiesFormatException" |
+    "MissingFormatArgumentException" |
+    "MissingFormatWidthException" |
+    "MissingResourceException" |
+    "NoSuchElementException" |
+    "TooManyListenersException" |
+    "UnknownFormatConversionException" |
+    "UnknownFormatFlagsException" |
+
+    "ServiceConfigurationError" 		{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{DocCommentBegin}				{ start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
+	{LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	/* Annotations. */
+	{Annotation}					{ addToken(Token.ANNOTATION); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{BinaryLiteral}					{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as identifiers. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCCOMMENT> {
+
+	[^hwf\@\{\n\<\*]+			{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+	[hwf]						{}
+
+	"@"{BlockTag}				{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"@"							{}
+	"{@"{InlineTag}[^\}]*"}"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+	"{"							{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+	"<"[/]?({Letter}[^\>]*)?">"	{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+	\<							{}
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+	\*							{}
+	<<EOF>>						{ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java	(revision 25584)
@@ -0,0 +1,4966 @@
+/* The following code was generated by JFlex 1.4.1 on 12/10/11 12:57 AM */
+
+/*
+ * 11/13/2004
+ *
+ * JavaTokenMaker.java - Scanner for the Java programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Java programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated JavaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class JavaTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 3;
+  public static final int DOCCOMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\23\1\11\1\0\1\23\1\20\22\0\1\23\1\53\1\16"+
+    "\1\21\1\22\1\53\1\55\1\10\2\77\1\25\1\46\1\45\1\34"+
+    "\1\35\1\24\1\4\1\5\2\17\4\7\2\3\1\56\1\45\1\47"+
+    "\1\50\1\52\1\54\1\76\1\101\1\27\1\6\1\67\1\33\1\32"+
+    "\1\115\1\107\1\104\2\1\1\26\1\110\1\111\1\112\1\114\1\120"+
+    "\1\74\1\102\1\105\1\106\1\116\1\117\1\31\1\1\1\121\1\77"+
+    "\1\12\1\77\1\51\1\2\1\0\1\41\1\30\1\63\1\61\1\40"+
+    "\1\15\1\72\1\57\1\65\1\113\1\75\1\42\1\66\1\14\1\60"+
+    "\1\62\1\103\1\37\1\43\1\36\1\13\1\71\1\70\1\64\1\73"+
+    "\1\100\1\122\1\51\1\44\1\54\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\4\0\1\1\1\2\2\3\1\2\1\4\1\5\2\2"+
+    "\1\6\1\1\1\7\2\10\5\2\1\10\7\2\1\11"+
+    "\1\2\5\10\11\2\1\12\16\2\1\13\1\14\5\13"+
+    "\1\15\10\13\1\16\3\13\1\1\2\17\1\20\1\3"+
+    "\1\17\1\20\2\17\1\21\2\17\5\2\1\4\1\22"+
+    "\1\0\1\4\7\2\2\6\1\23\1\24\1\25\40\2"+
+    "\1\0\1\10\1\2\1\26\10\2\1\26\14\2\1\12"+
+    "\56\2\2\0\1\27\4\0\1\30\2\0\1\31\22\0"+
+    "\1\1\1\3\1\20\1\0\2\21\1\3\1\21\10\2"+
+    "\1\4\1\32\2\4\1\22\1\4\5\2\1\6\1\33"+
+    "\1\6\1\34\61\2\1\35\17\2\1\1\10\2\1\36"+
+    "\37\2\1\36\30\2\37\0\1\1\2\17\12\2\1\4"+
+    "\3\2\1\6\1\37\3\2\1\36\3\2\1\36\2\2"+
+    "\1\35\4\2\2\36\6\2\1\40\37\2\1\1\51\2"+
+    "\1\0\32\2\2\0\1\41\2\0\1\42\10\0\1\43"+
+    "\17\0\1\44\1\1\2\2\1\36\10\2\1\4\1\26"+
+    "\1\6\35\2\1\26\25\2\1\1\11\2\1\36\27\2"+
+    "\1\36\6\2\1\0\32\2\35\0\1\1\14\2\1\4"+
+    "\1\2\1\6\1\36\33\2\1\45\16\2\1\36\1\1"+
+    "\11\2\1\36\26\2\1\36\10\2\1\0\2\2\1\36"+
+    "\10\2\1\36\13\2\22\0\13\2\1\0\37\2\1\36"+
+    "\2\2\1\1\40\2\1\0\11\2\1\0\23\2\1\36"+
+    "\7\2\2\0\1\43\6\0\12\2\2\0\75\2\2\0"+
+    "\7\2\1\0\33\2\11\0\4\2\1\36\4\2\2\0"+
+    "\5\2\1\36\10\2\1\36\6\2\1\36\43\2\2\0"+
+    "\6\2\1\36\26\2\5\0\4\2\1\0\2\2\1\36"+
+    "\2\0\3\2\1\0\51\2\2\0\27\2\5\0\3\2"+
+    "\2\0\1\2\2\0\3\2\1\0\1\36\11\2\1\36"+
+    "\14\2\1\36\12\2\2\0\14\2\1\36\4\2\2\0"+
+    "\2\2\2\0\1\2\2\0\3\2\1\0\5\2\1\36"+
+    "\3\2\1\0\1\2\1\36\2\2\1\36\16\2\1\0"+
+    "\13\2\1\36\3\2\1\36\4\2\2\0\1\2\1\0"+
+    "\2\2\1\0\2\2\1\36\6\2\1\0\12\2\1\0"+
+    "\21\2\2\0\3\2\1\0\4\2\1\36\1\2\1\0"+
+    "\12\2\1\0\15\2\1\36\2\0\3\2\1\0\3\2"+
+    "\1\0\1\2\1\0\11\2\1\0\12\2\2\0\2\2"+
+    "\1\0\2\2\1\0\1\2\1\0\7\2\1\0\6\2"+
+    "\2\0\1\2\1\0\1\2\1\0\1\2\1\0\4\2"+
+    "\1\0\3\2\1\36\1\2\3\0\1\2\1\0\1\2"+
+    "\1\0\1\2\1\0\2\2\1\0\3\2\1\0\1\36"+
+    "\3\0\1\2\1\0\1\2\2\0\2\2\1\0\2\2"+
+    "\5\0\1\2\1\0\1\2\2\0\1\2\6\0\1\2"+
+    "\1\0\1\2\16\0\1\36\23\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[1725];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+    "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u033e\0\u048a"+
+    "\0\u04dd\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722"+
+    "\0\u0775\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u0914\0\u0967\0\u033e"+
+    "\0\u033e\0\u09ba\0\u0a0d\0\u0a60\0\u033e\0\u0ab3\0\u0b06\0\u0b59"+
+    "\0\u0bac\0\u0bff\0\u0c52\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e\0\u0df1"+
+    "\0\u0e44\0\u0e97\0\u0eea\0\u0f3d\0\u0f90\0\u0fe3\0\u1036\0\u1089"+
+    "\0\u10dc\0\u112f\0\u1182\0\u11d5\0\u1228\0\u127b\0\u12ce\0\u033e"+
+    "\0\u1321\0\u1374\0\u13c7\0\u141a\0\u146d\0\u033e\0\u14c0\0\u1513"+
+    "\0\u1566\0\u15b9\0\u160c\0\u165f\0\u16b2\0\u1705\0\u033e\0\u1758"+
+    "\0\u17ab\0\u17fe\0\u1851\0\u18a4\0\u18f7\0\u18a4\0\u18a4\0\u194a"+
+    "\0\u199d\0\u19f0\0\u1a43\0\u1a96\0\u1ae9\0\u1b3c\0\u1b8f\0\u1be2"+
+    "\0\u1c35\0\u1c88\0\u1cdb\0\u1d2e\0\u033e\0\u1d81\0\u1dd4\0\u1e27"+
+    "\0\u1e7a\0\u1ecd\0\u1f20\0\u1f73\0\u1fc6\0\u2019\0\u206c\0\u20bf"+
+    "\0\u033e\0\u033e\0\u2112\0\u2165\0\u21b8\0\u220b\0\u225e\0\u22b1"+
+    "\0\u2304\0\u2357\0\u23aa\0\u23fd\0\u2450\0\u24a3\0\u24f6\0\u2549"+
+    "\0\u259c\0\u25ef\0\u2642\0\u2695\0\u26e8\0\u273b\0\u278e\0\u27e1"+
+    "\0\u2834\0\u2887\0\u28da\0\u292d\0\u2980\0\u29d3\0\u2a26\0\u2a79"+
+    "\0\u2acc\0\u2b1f\0\u2b72\0\u0530\0\u2bc5\0\u2c18\0\u2c6b\0\u2cbe"+
+    "\0\u2d11\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0\0\u2f03\0\u019f"+
+    "\0\u2f56\0\u2fa9\0\u2ffc\0\u304f\0\u30a2\0\u30f5\0\u3148\0\u319b"+
+    "\0\u31ee\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d\0\u33e0\0\u3433"+
+    "\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625\0\u3678\0\u36cb"+
+    "\0\u371e\0\u3771\0\u37c4\0\u3817\0\u386a\0\u38bd\0\u3910\0\u3963"+
+    "\0\u39b6\0\u3a09\0\u3a5c\0\u3aaf\0\u3b02\0\u3b55\0\u3ba8\0\u3bfb"+
+    "\0\u3c4e\0\u3ca1\0\u3cf4\0\u3d47\0\u3d9a\0\u3ded\0\u3e40\0\u3e93"+
+    "\0\u3ee6\0\u3f39\0\u3f8c\0\u3fdf\0\u4032\0\u4085\0\u40d8\0\u412b"+
+    "\0\u417e\0\u41d1\0\u4224\0\u4277\0\u42ca\0\u033e\0\u431d\0\u4370"+
+    "\0\u43c3\0\u4416\0\u033e\0\u4469\0\u44bc\0\u033e\0\u450f\0\u4562"+
+    "\0\u45b5\0\u4608\0\u465b\0\u46ae\0\u4701\0\u4754\0\u47a7\0\u47fa"+
+    "\0\u484d\0\u48a0\0\u48f3\0\u4946\0\u4999\0\u49ec\0\u4a3f\0\u4a92"+
+    "\0\u4ae5\0\u4b38\0\u4b8b\0\u4bde\0\u4c31\0\u18a4\0\u4c84\0\u4cd7"+
+    "\0\u4d2a\0\u4d7d\0\u4dd0\0\u4e23\0\u4e76\0\u4ec9\0\u4f1c\0\u4f6f"+
+    "\0\u4fc2\0\u033e\0\u5015\0\u5068\0\u1d81\0\u50bb\0\u510e\0\u5161"+
+    "\0\u51b4\0\u5207\0\u525a\0\u52ad\0\u033e\0\u5300\0\u5353\0\u53a6"+
+    "\0\u53f9\0\u544c\0\u549f\0\u54f2\0\u5545\0\u5598\0\u55eb\0\u563e"+
+    "\0\u5691\0\u56e4\0\u5737\0\u578a\0\u57dd\0\u5830\0\u5883\0\u58d6"+
+    "\0\u5929\0\u597c\0\u59cf\0\u5a22\0\u5a75\0\u5ac8\0\u5b1b\0\u5b6e"+
+    "\0\u5bc1\0\u5c14\0\u5c67\0\u5cba\0\u5d0d\0\u5d60\0\u5db3\0\u5e06"+
+    "\0\u5e59\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u5ff8\0\u604b\0\u609e"+
+    "\0\u60f1\0\u6144\0\u6197\0\u61ea\0\u623d\0\u6290\0\u62e3\0\u6336"+
+    "\0\u6389\0\u63dc\0\u642f\0\u6482\0\u64d5\0\u6528\0\u657b\0\u65ce"+
+    "\0\u6621\0\u6674\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866"+
+    "\0\u68b9\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u6a58\0\u6aab\0\u6afe"+
+    "\0\u6b51\0\u019f\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u6d43"+
+    "\0\u6d96\0\u6de9\0\u6e3c\0\u6e8f\0\u6ee2\0\u6f35\0\u6f88\0\u6fdb"+
+    "\0\u702e\0\u7081\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273"+
+    "\0\u72c6\0\u7319\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b"+
+    "\0\u755e\0\u75b1\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3"+
+    "\0\u77f6\0\u7849\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u7a3b"+
+    "\0\u7a8e\0\u7ae1\0\u7b34\0\u7b87\0\u7bda\0\u7c2d\0\u7c80\0\u7cd3"+
+    "\0\u7d26\0\u7d79\0\u7dcc\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b"+
+    "\0\u7fbe\0\u8011\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203"+
+    "\0\u8256\0\u82a9\0\u82fc\0\u834f\0\u83a2\0\u83f5\0\u8448\0\u849b"+
+    "\0\u84ee\0\u8541\0\u8594\0\u85e7\0\u863a\0\u868d\0\u86e0\0\u8733"+
+    "\0\u8786\0\u87d9\0\u4c84\0\u882c\0\u887f\0\u88d2\0\u8925\0\u8978"+
+    "\0\u89cb\0\u8a1e\0\u8a71\0\u8ac4\0\u8b17\0\u8b6a\0\u8bbd\0\u8c10"+
+    "\0\u8c63\0\u8cb6\0\u8d09\0\u033e\0\u8d5c\0\u8daf\0\u8e02\0\u8e55"+
+    "\0\u8ea8\0\u8efb\0\u8f4e\0\u8fa1\0\u8ff4\0\u9047\0\u019f\0\u909a"+
+    "\0\u90ed\0\u9140\0\u9193\0\u91e6\0\u9239\0\u928c\0\u92df\0\u9332"+
+    "\0\u9385\0\u93d8\0\u942b\0\u019f\0\u947e\0\u94d1\0\u9524\0\u9577"+
+    "\0\u95ca\0\u961d\0\u9670\0\u96c3\0\u9716\0\u9769\0\u97bc\0\u980f"+
+    "\0\u9862\0\u98b5\0\u9908\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7"+
+    "\0\u9afa\0\u9b4d\0\u9ba0\0\u9bf3\0\u9c46\0\u9c99\0\u9cec\0\u9d3f"+
+    "\0\u9d92\0\u9de5\0\u9e38\0\u9e8b\0\u9ede\0\u9f31\0\u9f84\0\u9fd7"+
+    "\0\ua02a\0\ua07d\0\ua0d0\0\ua123\0\ua176\0\ua1c9\0\ua21c\0\ua26f"+
+    "\0\ua2c2\0\ua315\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507"+
+    "\0\ua55a\0\ua5ad\0\ua600\0\ua653\0\ua6a6\0\ua6f9\0\ua74c\0\ua79f"+
+    "\0\ua7f2\0\ua845\0\ua898\0\ua8eb\0\ua93e\0\ua991\0\ua9e4\0\uaa37"+
+    "\0\uaa8a\0\uaadd\0\uab30\0\uab83\0\uabd6\0\uac29\0\uac7c\0\uaccf"+
+    "\0\uad22\0\uad75\0\uadc8\0\uae1b\0\uae6e\0\uaec1\0\uaf14\0\uaf67"+
+    "\0\uafba\0\ub00d\0\ub060\0\ub0b3\0\ub106\0\ub159\0\ub1ac\0\ub1ff"+
+    "\0\ub252\0\ub2a5\0\ub2f8\0\ub34b\0\ub39e\0\ub3f1\0\ub444\0\ub497"+
+    "\0\ub4ea\0\ub53d\0\ub590\0\ub5e3\0\ub636\0\ub689\0\ub6dc\0\ub72f"+
+    "\0\ub782\0\ub7d5\0\ub828\0\ub87b\0\ub8ce\0\ub921\0\u033e\0\ub974"+
+    "\0\ub9c7\0\uba1a\0\uba6d\0\ubac0\0\ubb13\0\ubb66\0\ubbb9\0\ubc0c"+
+    "\0\ubc5f\0\ubcb2\0\ubd05\0\ubd58\0\ubdab\0\ubdfe\0\ube51\0\ubea4"+
+    "\0\ubef7\0\ubf4a\0\ubf9d\0\ubff0\0\uc043\0\uc096\0\uc0e9\0\uc13c"+
+    "\0\uc18f\0\uc1e2\0\uc235\0\uc288\0\uc2db\0\uc32e\0\uc381\0\uc3d4"+
+    "\0\uc427\0\uc47a\0\uc4cd\0\uc520\0\uc573\0\uc5c6\0\uc619\0\uc66c"+
+    "\0\uc6bf\0\uc712\0\uc765\0\uc7b8\0\uc80b\0\uc85e\0\uc8b1\0\uc904"+
+    "\0\uc957\0\uc9aa\0\uc9fd\0\uca50\0\ucaa3\0\ucaf6\0\ucb49\0\ucb9c"+
+    "\0\ucbef\0\ucc42\0\ucc95\0\u5bc1\0\ucce8\0\ucd3b\0\ucd8e\0\ucde1"+
+    "\0\uce34\0\uce87\0\uceda\0\ucf2d\0\ucf80\0\ucfd3\0\ud026\0\ud079"+
+    "\0\ud0cc\0\ud11f\0\ud172\0\ud1c5\0\ud218\0\ud26b\0\ud2be\0\ud311"+
+    "\0\ud364\0\ud3b7\0\ud40a\0\ud45d\0\ud4b0\0\ud503\0\ud556\0\ud5a9"+
+    "\0\ud5fc\0\ud64f\0\ud6a2\0\ud6f5\0\ud748\0\ud79b\0\ud7ee\0\ud841"+
+    "\0\ud894\0\ud8e7\0\ud93a\0\ud98d\0\ud9e0\0\uda33\0\uda86\0\udad9"+
+    "\0\udb2c\0\udb7f\0\udbd2\0\udc25\0\udc78\0\udccb\0\udd1e\0\udd71"+
+    "\0\uddc4\0\ude17\0\ude6a\0\udebd\0\udf10\0\udf63\0\udfb6\0\ue009"+
+    "\0\ue05c\0\ue0af\0\ue102\0\ue155\0\ue1a8\0\ue1fb\0\ue24e\0\ue2a1"+
+    "\0\ue2f4\0\ue347\0\ue39a\0\ue3ed\0\ue440\0\ue493\0\ue4e6\0\ue539"+
+    "\0\ue58c\0\ue5df\0\ue632\0\ue685\0\ue6d8\0\ue72b\0\ue77e\0\ue7d1"+
+    "\0\ue824\0\ue877\0\ue8ca\0\ue91d\0\ue970\0\ue9c3\0\ub590\0\uea16"+
+    "\0\ub689\0\uea69\0\ueabc\0\ueb0f\0\ueb62\0\uebb5\0\uec08\0\uec5b"+
+    "\0\uecae\0\ued01\0\ued54\0\ueda7\0\uedfa\0\uee4d\0\ueea0\0\ueef3"+
+    "\0\uef46\0\uef99\0\uefec\0\uf03f\0\uf092\0\uf0e5\0\uf138\0\uf18b"+
+    "\0\uf1de\0\ube51\0\uf231\0\uf284\0\uf2d7\0\uf32a\0\uf37d\0\uf3d0"+
+    "\0\uf423\0\uf476\0\uf4c9\0\uf51c\0\uf56f\0\uf5c2\0\uf615\0\uf668"+
+    "\0\uf6bb\0\uf70e\0\uf761\0\uf7b4\0\uf807\0\uf85a\0\uf8ad\0\uf900"+
+    "\0\uf953\0\uf9a6\0\uf9f9\0\ufa4c\0\ufa9f\0\ufaf2\0\ufb45\0\ufb98"+
+    "\0\ufbeb\0\ufc3e\0\ufc91\0\ufce4\0\ufd37\0\ufd8a\0\ufddd\0\ufe30"+
+    "\0\ufe83\0\ufed6\0\uff29\0\uff7c\0\uffcf\1\42\0\u019f\1\165"+
+    "\1\310\1\u011b\1\u016e\1\u01c1\1\u0214\1\u0267\1\u02ba\1\u030d"+
+    "\1\u0360\1\u03b3\1\u0406\1\u0459\1\u04ac\1\u04ff\1\u0552\1\u05a5"+
+    "\1\u05f8\1\u064b\1\u069e\1\u06f1\1\u0744\1\u0797\1\u07ea\1\u083d"+
+    "\1\u0890\1\u08e3\1\u0936\1\u0989\1\u09dc\1\u0a2f\1\u0a82\1\u0ad5"+
+    "\1\u0b28\1\u0b7b\1\u0bce\1\u0c21\1\u0c74\1\u0cc7\1\u0d1a\1\u0d6d"+
+    "\1\u0dc0\1\u0e13\1\u0e66\1\u0eb9\1\u0f0c\1\u0f5f\1\u0fb2\1\u1005"+
+    "\1\u1058\1\u10ab\1\u10fe\1\u1151\1\u11a4\1\u11f7\1\u124a\1\u129d"+
+    "\1\u12f0\1\u1343\1\u1396\1\u13e9\1\u143c\1\u148f\1\u14e2\1\u1535"+
+    "\1\u1588\1\u15db\1\u162e\1\u1681\1\u16d4\1\u1727\1\u177a\1\u17cd"+
+    "\1\u1820\1\u1873\1\u18c6\1\u1919\1\u196c\1\u19bf\1\u1a12\1\u1a65"+
+    "\1\u1ab8\1\u1b0b\1\u1b5e\1\u1bb1\1\u1c04\1\u1c57\1\u1caa\1\u1cfd"+
+    "\1\u1d50\1\u1da3\1\u1df6\1\u1e49\1\u1e9c\1\u1eef\1\u1f42\1\u1f95"+
+    "\1\u1fe8\1\u203b\1\u208e\1\u20e1\1\u2134\1\u2187\1\u21da\1\u222d"+
+    "\1\u2280\1\u22d3\1\u2326\1\u2379\1\u23cc\1\u241f\1\u2472\1\u24c5"+
+    "\1\u2518\1\u256b\1\u25be\1\u2611\1\u2664\1\u26b7\1\u270a\1\u275d"+
+    "\1\u27b0\1\u2803\1\u2856\1\u28a9\1\u28fc\1\u294f\1\u29a2\1\u29f5"+
+    "\1\u2a48\1\u2a9b\1\u2aee\1\u2b41\1\u2b94\1\u2be7\1\u2c3a\1\u2c8d"+
+    "\1\u2ce0\1\u2d33\1\u2d86\1\u2dd9\1\u2e2c\1\u2e7f\1\u2ed2\1\u2f25"+
+    "\1\u2f78\1\u2fcb\1\u301e\1\u3071\1\u30c4\1\u3117\1\u316a\1\u31bd"+
+    "\1\u3210\1\u3263\1\u32b6\1\u3309\1\u335c\1\u33af\1\u3402\1\u3455"+
+    "\1\u34a8\1\u34fb\1\u354e\1\u35a1\1\u35f4\1\u3647\1\u369a\1\u36ed"+
+    "\1\u3740\1\u3793\1\u37e6\1\u3839\1\u388c\1\u38df\1\u3932\1\u3985"+
+    "\1\u39d8\1\u3a2b\1\u3a7e\1\u3ad1\1\u3b24\1\u3b77\1\u3bca\1\u3c1d"+
+    "\1\u3c70\1\u3cc3\1\u13e9\1\u3d16\1\u3d69\1\u3dbc\1\u3e0f\1\u3e62"+
+    "\1\u3eb5\1\u3f08\1\u3f5b\1\u3fae\1\u4001\1\u4054\1\u40a7\1\u40fa"+
+    "\1\u414d\1\u41a0\1\u41f3\1\u4246\1\u4299\1\u42ec\1\u433f\1\u4392"+
+    "\1\u43e5\1\u4438\1\u448b\1\u44de\1\u4531\1\u4584\1\u45d7\1\u462a"+
+    "\1\u467d\1\u46d0\1\u4723\1\u4776\1\u47c9\1\u481c\1\u486f\1\u48c2"+
+    "\1\u4915\1\u4968\1\u49bb\1\u4a0e\1\u4a61\1\u4ab4\1\u4b07\1\u4b5a"+
+    "\1\u4bad\1\u4c00\1\u4c53\1\u4ca6\1\u4cf9\1\u4d4c\1\u4d9f\1\u4df2"+
+    "\1\u4e45\1\u4e98\1\u4eeb\1\u4f3e\1\u4f91\1\u4fe4\1\u5037\1\u508a"+
+    "\1\u50dd\1\u5130\1\u5183\1\u51d6\1\u5229\1\u527c\1\u52cf\1\u5322"+
+    "\1\u5375\1\u53c8\1\u541b\1\u546e\1\u54c1\1\u5514\1\u5567\1\u55ba"+
+    "\1\u560d\1\u5660\1\u56b3\1\u5706\1\u5759\1\u57ac\1\u57ff\1\u5852"+
+    "\1\u58a5\1\u58f8\1\u594b\1\u599e\1\u59f1\1\u5a44\1\u5a97\1\u5aea"+
+    "\1\u5b3d\1\u5b90\1\u5be3\1\u5c36\1\u5c89\1\u5cdc\1\u5d2f\1\u5d82"+
+    "\1\u5dd5\1\u5e28\1\u5e7b\1\u5ece\1\u5f21\1\u5f74\1\u5fc7\1\u601a"+
+    "\1\u606d\1\u60c0\1\u6113\1\u6166\1\u61b9\1\u620c\1\u625f\1\u62b2"+
+    "\1\u6305\1\u6358\1\u63ab\1\u63fe\1\u6451\1\u64a4\1\u64f7\1\u654a"+
+    "\1\u659d\1\u65f0\1\u6643\1\u6696\1\u66e9\1\u673c\1\u678f\1\u67e2"+
+    "\1\u6835\1\u6888\1\u68db\1\u692e\1\u6981\1\u69d4\1\u6a27\1\u6a7a"+
+    "\1\u6acd\1\u6b20\1\u6b73\1\u6bc6\1\u6c19\1\u6c6c\1\u6cbf\1\u6d12"+
+    "\1\u6d65\1\u6db8\1\u6e0b\1\u6e5e\1\u6eb1\1\u6f04\1\u6f57\1\u6faa"+
+    "\1\u6ffd\1\u7050\1\u70a3\1\u70f6\1\u7149\1\u719c\1\u71ef\1\u7242"+
+    "\1\u7295\1\u72e8\1\u733b\1\u738e\1\u73e1\1\u7434\1\u7487\1\u74da"+
+    "\1\u752d\1\u7580\1\u75d3\1\u7626\1\u7679\1\u76cc\1\u771f\1\u7772"+
+    "\1\u77c5\1\u7818\1\u786b\1\u78be\1\u7911\1\u7964\1\u79b7\1\u75d3"+
+    "\1\u7a0a\1\u7a5d\1\u7ab0\1\u7b03\1\u7b56\1\u7ba9\1\u7bfc\1\u7c4f"+
+    "\1\u7ca2\1\u7cf5\1\u7d48\1\u7d9b\1\u7dee\1\u7e41\1\u7e94\1\u7ee7"+
+    "\1\u7f3a\1\u7f8d\1\u7fe0\1\u8033\1\u8086\1\u80d9\1\u812c\1\u817f"+
+    "\1\u81d2\1\u8225\1\u8278\1\u82cb\1\u831e\1\u8371\1\u83c4\1\u8417"+
+    "\1\u846a\1\u84bd\1\u8510\1\u8563\1\u85b6\1\u8609\1\u865c\1\u86af"+
+    "\1\u8702\1\u8755\1\u87a8\0\u033e\1\u87fb\1\u884e\1\u88a1\1\u88f4"+
+    "\1\u8947\1\u899a\1\u89ed\1\u8a40\1\u8a93\1\u8ae6\1\u8b39\1\u8b8c"+
+    "\1\u8bdf\1\u8c32\1\u8c85\1\u8cd8\1\u8d2b\1\u8d7e\1\u8dd1\1\u8e24"+
+    "\1\u8e77\1\u8eca\1\u8f1d\1\u8f70\1\u8fc3\1\u9016\1\u9069\1\u90bc"+
+    "\1\u910f\1\u9162\1\u91b5\1\u9208\1\u925b\1\u92ae\1\u8d2b\1\u9301"+
+    "\1\u9354\1\u93a7\1\u93fa\1\u944d\1\u94a0\1\u94f3\1\u9546\1\u9599"+
+    "\1\u95ec\1\u963f\1\u9692\1\u96e5\1\u9738\1\u978b\1\u97de\1\u9831"+
+    "\1\u9884\1\u98d7\1\u992a\1\u997d\1\u99d0\1\u9a23\1\u9a76\1\u9ac9"+
+    "\1\u9b1c\1\u9b6f\1\u9bc2\1\u9c15\1\u9c68\1\u9cbb\1\u9d0e\1\u9d61"+
+    "\1\u9db4\1\u9e07\1\u9e5a\1\u9ead\1\u9f00\1\u9f53\1\u9fa6\1\u9ff9"+
+    "\1\ua04c\1\ua09f\1\ua0f2\1\ua145\1\ua198\1\ua1eb\1\ua23e\1\ua291"+
+    "\1\ua2e4\1\ua337\1\ua38a\1\ua3dd\1\ua430\1\ua483\1\ua4d6\1\ua529"+
+    "\1\ua57c\1\ua5cf\1\ua622\1\ua675\1\ua6c8\1\ua71b\1\ua76e\1\ua7c1"+
+    "\1\ua814\1\ua867\1\ua8ba\1\ua90d\1\ua960\1\ua9b3\1\uaa06\1\uaa59"+
+    "\1\uaaac\1\uaaff\1\uab52\1\uaba5\1\uabf8\1\uac4b\1\uac9e\1\uacf1"+
+    "\1\uad44\1\uad97\1\uadea\1\uae3d\1\uae90\1\uaee3\1\uaf36\1\uaf89"+
+    "\1\uafdc\1\ub02f\1\ub082\1\ub0d5\1\ub128\1\ub17b\1\ub1ce\1\ub221"+
+    "\1\ub274\1\ub2c7\1\ub31a\1\ub36d\1\ub3c0\1\ub413\1\ub466\1\ub4b9"+
+    "\1\ub50c\1\ub55f\1\ub5b2\1\ub605\1\ub658\1\ub6ab\1\ub6fe\1\ub751"+
+    "\1\ub7a4\1\ub7f7\1\ub84a\1\ub89d\1\ub8f0\1\ub943\1\ub996\1\ub9e9"+
+    "\1\uba3c\1\uba8f\1\ubae2\1\ubb35\1\ubb88\1\ubbdb\1\ubc2e\1\ubc81"+
+    "\1\ubcd4\1\ubd27\1\ubd7a\1\ubdcd\1\ube20\1\ube73\1\ubec6\1\ubf19"+
+    "\1\ubf6c\1\ubfbf\1\uc012\1\uc065\1\uc0b8\1\uc10b\1\uc15e\1\uc1b1"+
+    "\1\uc204\1\uc257\1\uc2aa\1\uc2fd\1\uc350\1\uc3a3\1\uc3f6\1\uc449"+
+    "\1\uc49c\1\uc4ef\1\uc542\1\uc595\1\uc5e8\1\uc63b\1\uc68e\1\uc6e1"+
+    "\1\uc734\1\uc787\1\uc7da\1\uc82d\1\uc880\1\u5a44\1\uc8d3\1\uc926"+
+    "\1\uc979\1\uc9cc\1\uca1f\1\uca72\1\ucac5\1\ucb18\1\ucb6b\1\ucbbe"+
+    "\1\ucc11\1\ucc64\1\uccb7\1\ucd0a\1\ucd5d\1\ucdb0\1\uce03\1\uce56"+
+    "\1\ucea9\1\ucefc\1\ucf4f\1\ucfa2\1\ucff5\1\ud048\1\ud09b\1\ud0ee"+
+    "\1\ud141\1\ud194\1\ud1e7\1\ud23a\1\ud28d\1\ud2e0\1\ud333\1\ud386"+
+    "\1\ud3d9\1\ud42c\1\ud47f\1\ud4d2\1\ud525\1\ud578\1\ud5cb\1\ud61e"+
+    "\1\ud671\1\ud6c4\1\ud717\1\ud76a\1\ud7bd\1\ud810\1\ud863\1\ud8b6"+
+    "\1\ud909\1\ud95c\1\ud9af\1\uda02\1\uda55\1\udaa8\1\udafb\1\udb4e"+
+    "\1\udba1\1\udbf4\1\udc47\1\udc9a\1\udced\1\udd40\1\udd93\1\udde6"+
+    "\1\ude39\1\ude8c\1\udedf\1\udf32\1\udf85\1\udfd8\1\ue02b\1\ue07e"+
+    "\1\ue0d1\1\ue124\1\ue177\1\ue1ca\1\ue21d\1\ue270\1\ue2c3\1\ue316"+
+    "\1\ue369\1\ue3bc\1\ue40f\1\ue462\1\ue4b5\1\ue508\1\ue55b\1\ue5ae"+
+    "\1\ue601\1\ue654\1\ue6a7\1\ue6fa\1\ue74d\1\ue7a0\1\ue7f3\1\ue846"+
+    "\1\ue899\1\ue8ec\1\ue93f\1\ue992\1\ue9e5\1\uea38\1\uea8b\1\ueade"+
+    "\1\ueb31\1\ueb84\1\uebd7\1\uec2a\1\uec7d\1\uecd0\1\ued23\1\ued76"+
+    "\1\uedc9\1\uee1c\1\uee6f\1\ueec2\1\uef15\1\uef68\1\uefbb\1\uf00e"+
+    "\1\uf061\1\uf0b4\1\uf107\1\uf15a\1\uf1ad\1\uf200\1\uf253\1\uf2a6"+
+    "\1\uf2f9\1\uf34c\1\uf39f\1\uf3f2\1\uf445\1\uf498\1\uf4eb\1\uf53e"+
+    "\1\uf591\1\uf5e4\1\uf637\1\uf68a\1\uf6dd\1\uf730\1\uf783\1\uf7d6"+
+    "\1\uf829\1\uf87c\1\uf8cf\1\uf922\1\uf975\1\uf9c8\1\ufa1b\1\ufa6e"+
+    "\1\ufac1\1\ufb14\1\ufb67\1\ufbba\1\ufc0d\1\ufc60\1\ufcb3\1\ufd06"+
+    "\1\ufd59\1\ufdac\1\ufdff\1\ufe52\1\ufea5\1\ufef8\1\uff4b\1\uff9e"+
+    "\1\ufff1\2\104\2\227\2\352\2\u013d\2\u0190\2\u01e3\2\u0236"+
+    "\2\u0289\2\u02dc\2\u032f\2\u0382\2\u03d5\2\u0428\2\u047b\2\u04ce"+
+    "\2\u0521\2\u0574\2\u05c7\2\u061a\2\u066d\2\u06c0\2\u0713\2\u0766"+
+    "\2\u07b9\2\u080c\2\u085f\2\u08b2\2\u0905\2\u0958\2\u09ab\2\u09fe"+
+    "\2\u0a51\2\u0aa4\2\u0af7\2\u0b4a\2\u0b9d\2\u0bf0\2\u0c43\2\u0c96"+
+    "\2\u0ce9\2\u0d3c\2\u0d8f\2\u0de2\2\u0e35\2\u0e88\2\u0edb\2\u0f2e"+
+    "\2\u0f81\2\u0fd4\2\u1027\2\u107a\2\u10cd\2\u1120\2\u1173\2\u11c6"+
+    "\2\u1219\2\u126c\2\u12bf\2\u1312\2\u1365\2\u13b8\2\u140b\2\u145e"+
+    "\2\u14b1\2\u1504\2\u1557\2\u15aa\2\u15fd\2\u1650\2\u16a3\2\u16f6"+
+    "\2\u1749\2\u179c\2\u17ef\2\u1842\2\u1895\2\u18e8\2\u193b\2\u198e"+
+    "\2\u19e1\2\u1a34\2\u1a87\2\u1ada\2\u1b2d\2\u1b80\2\u1bd3\2\u1c26"+
+    "\2\u1c79\2\u1ccc\2\u1d1f\2\u1d72\2\u1dc5\2\u1e18\2\u1e6b\2\u1ebe"+
+    "\2\u1f11\2\u1f64\2\u1fb7\2\u200a\2\u205d\2\u20b0\2\u2103\2\u2156"+
+    "\2\u21a9\2\u21fc\2\u224f\2\u22a2\2\u22f5";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[1725];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\5\2\6\1\7\1\10\1\7\1\11\1\7\1\12"+
+    "\1\13\1\5\1\6\1\14\1\15\1\16\1\7\1\17"+
+    "\1\5\1\6\1\20\1\21\1\22\1\23\1\24\1\25"+
+    "\1\6\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
+    "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\2\22"+
+    "\1\44\1\22\1\45\1\46\1\45\2\6\1\47\1\50"+
+    "\1\51\1\6\1\52\1\6\1\53\1\54\1\55\1\56"+
+    "\1\6\1\57\1\6\1\60\1\40\1\6\1\61\1\62"+
+    "\1\6\1\63\1\64\1\65\1\66\1\67\1\70\1\71"+
+    "\1\6\1\72\1\73\1\74\1\75\1\76\1\6\1\40"+
+    "\11\77\1\100\3\77\1\101\7\77\1\102\31\77\1\103"+
+    "\10\77\1\104\32\77\11\105\1\106\3\105\1\107\7\105"+
+    "\1\110\21\105\1\111\7\105\1\112\10\105\1\113\5\105"+
+    "\1\114\23\105\1\115\11\116\1\117\3\116\1\120\41\116"+
+    "\1\121\10\116\1\122\32\116\10\5\2\0\4\5\1\0"+
+    "\1\5\1\0\2\5\3\0\6\5\2\0\6\5\13\0"+
+    "\20\5\1\0\22\5\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\2\124\1\125\3\7\1\124\1\7\2\0\3\124\1\126"+
+    "\1\0\1\7\1\0\2\124\3\0\1\127\3\124\1\126"+
+    "\1\130\1\0\1\131\2\124\1\130\1\124\1\127\1\124"+
+    "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+    "\1\0\2\124\1\132\1\133\2\134\1\124\1\134\2\0"+
+    "\3\124\1\126\1\0\1\134\1\0\2\124\3\0\1\127"+
+    "\2\135\1\136\1\126\1\130\1\0\1\131\2\124\1\130"+
+    "\1\124\1\127\1\124\13\0\2\124\1\126\2\124\1\136"+
+    "\2\124\1\126\7\124\1\0\22\124\1\0\1\5\7\6"+
+    "\2\0\1\123\1\137\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\140\1\141\1\6"+
+    "\13\0\1\142\1\143\15\6\1\5\1\0\22\6\1\0"+
+    "\10\144\1\145\1\146\1\147\110\144\123\0\1\5\7\6"+
+    "\2\0\1\123\1\150\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\151\1\152\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\153\1\154\1\6\13\0"+
+    "\1\6\1\155\4\6\1\156\10\6\1\5\1\0\22\6"+
+    "\1\0\11\16\1\157\1\160\3\16\1\161\104\16\23\0"+
+    "\1\20\123\0\1\162\1\163\22\0\1\45\122\0\1\45"+
+    "\52\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\164\4\6\1\165\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\166\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\167\4\6\1\170\5\6\1\171\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\172\4\6\13\0\1\6\1\173\12\6"+
+    "\1\174\2\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\175\1\6\13\0\1\6"+
+    "\1\176\4\6\1\177\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\200\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\201\4\6\13\0\5\6\1\202\1\6\1\203\2\6"+
+    "\1\204\4\6\1\5\1\0\12\6\1\205\7\6\35\0"+
+    "\1\45\13\0\1\45\55\0\3\131\1\0\1\131\7\0"+
+    "\1\131\103\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\206\4\6\13\0\1\207\16\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\210"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\211\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\212"+
+    "\1\6\13\0\5\6\1\213\11\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\2\6\1\214\3\6\2\0"+
+    "\5\6\1\215\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\216\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\217\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\220\5\6\13\0\1\221"+
+    "\10\6\1\222\2\6\1\223\2\6\1\5\1\0\22\6"+
+    "\47\0\1\45\1\0\1\45\121\0\1\224\1\45\122\0"+
+    "\1\45\1\0\1\225\120\0\1\45\4\0\1\45\45\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\226\3\6"+
+    "\13\0\1\6\1\227\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\230\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\231"+
+    "\1\6\1\232\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\233"+
+    "\1\234\1\6\13\0\1\235\1\236\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\237"+
+    "\1\240\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\7\6\1\241\7\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\242\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\243\1\244\2\6\13\0\1\6\1\245\4\6"+
+    "\1\246\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\247\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\250\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\251\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\252\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\253\1\254"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\2\255\3\5\1\255\1\5\2\0\1\5\3\255\1\0"+
+    "\1\5\1\0\1\5\1\255\3\0\6\255\2\0\6\255"+
+    "\13\0\17\255\1\5\1\0\22\255\1\0\1\5\7\6"+
+    "\2\0\1\123\1\256\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\2\6\1\257\3\6\2\0\1\6\1\260"+
+    "\3\6\1\261\13\0\3\6\1\262\13\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\263"+
+    "\1\6\1\264\3\6\13\0\1\265\1\266\2\6\1\267"+
+    "\1\6\1\270\5\6\1\271\2\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\272\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\273\3\6\1\274\1\6\13\0\2\6\1\275\14\6"+
+    "\1\5\1\0\12\6\1\276\7\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\277\4\6\13\0\1\300"+
+    "\1\301\4\6\1\302\5\6\1\303\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\304"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\5\6\1\305"+
+    "\1\306\13\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\307\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\310"+
+    "\2\6\13\0\6\6\1\311\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\312\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\313\1\314\2\6\13\0\1\6\1\315\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\316"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+    "\1\317\3\6\2\0\6\6\13\0\3\6\1\320\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\321\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\322\1\6\1\323\2\6\13\0"+
+    "\6\6\1\324\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\325\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\326\3\6\13\0\1\6\1\327"+
+    "\4\6\1\330\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\331\1\332\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\333\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\11\77\1\0\3\77\1\0\7\77"+
+    "\1\0\31\77\1\0\10\77\1\0\32\77\36\0\1\334"+
+    "\26\0\1\335\61\0\1\336\134\0\1\337\154\0\1\340"+
+    "\32\0\11\105\1\0\3\105\1\0\7\105\1\0\21\105"+
+    "\1\0\7\105\1\0\10\105\1\0\5\105\1\0\23\105"+
+    "\37\0\1\341\26\0\1\342\61\0\1\343\77\0\1\344"+
+    "\4\0\1\344\4\0\3\344\6\0\1\345\1\0\6\344"+
+    "\2\0\6\344\6\0\1\346\4\0\17\344\2\0\22\344"+
+    "\37\0\1\347\154\0\1\350\70\0\1\351\1\352\1\353"+
+    "\1\354\1\0\1\355\14\0\1\356\1\357\1\360\1\361"+
+    "\1\0\1\362\3\0\1\363\127\0\1\364\24\0\11\116"+
+    "\1\0\3\116\1\0\41\116\1\0\10\116\1\0\32\116"+
+    "\36\0\1\365\26\0\1\366\73\0\1\367\154\0\1\370"+
+    "\32\0\10\5\2\0\1\5\1\371\2\5\1\0\1\5"+
+    "\1\0\2\5\3\0\6\5\2\0\6\5\13\0\20\5"+
+    "\1\0\22\5\1\0\10\124\2\0\4\124\1\0\1\124"+
+    "\1\0\2\124\3\0\6\124\2\0\6\124\13\0\20\124"+
+    "\1\0\22\124\1\0\2\124\1\125\3\372\1\124\1\372"+
+    "\2\0\4\124\1\0\1\372\1\0\2\124\3\0\6\124"+
+    "\2\0\6\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+    "\3\373\1\124\1\373\2\0\4\124\1\0\1\373\1\0"+
+    "\2\124\3\0\6\124\1\374\1\0\6\124\2\0\1\374"+
+    "\10\0\20\124\1\0\22\124\1\0\3\124\3\131\1\124"+
+    "\1\131\2\0\3\124\1\126\1\0\1\131\1\0\2\124"+
+    "\3\0\4\124\1\126\1\130\2\0\2\124\1\130\3\124"+
+    "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+    "\1\0\2\124\1\132\1\124\2\375\1\124\1\375\2\0"+
+    "\4\124\1\0\1\375\1\0\2\124\3\0\6\124\2\0"+
+    "\6\124\13\0\20\124\1\0\22\124\1\0\3\124\3\133"+
+    "\1\124\1\133\2\0\3\124\1\126\1\0\1\133\1\0"+
+    "\2\124\3\0\4\124\1\126\1\130\1\0\1\131\2\124"+
+    "\1\130\3\124\13\0\2\124\1\126\5\124\1\126\7\124"+
+    "\1\0\22\124\1\0\2\124\1\132\1\133\2\134\1\124"+
+    "\1\134\2\0\3\124\1\126\1\0\1\134\1\0\2\124"+
+    "\3\0\1\376\3\124\1\126\1\130\1\0\1\131\2\124"+
+    "\1\130\1\124\1\376\1\124\13\0\2\124\1\126\5\124"+
+    "\1\126\7\124\1\0\22\124\1\0\4\124\2\377\2\124"+
+    "\2\0\4\124\1\0\1\124\1\0\2\124\3\0\6\124"+
+    "\2\0\6\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+    "\5\u0100\2\0\3\124\1\u0100\1\0\1\u0100\1\0\2\124"+
+    "\3\0\1\124\2\u0100\1\124\2\u0100\2\0\2\124\2\u0100"+
+    "\2\124\13\0\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100"+
+    "\7\124\1\0\1\124\1\u0100\20\124\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0101\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0102\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0103\2\6\13\0\1\6\1\u0104\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0105\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0106\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0107\1\6\13\0\7\6\1\u0108\7\6\1\5\1\0"+
+    "\22\6\1\0\10\u0109\1\u010a\1\0\111\u0109\10\0\1\u010a"+
+    "\112\0\4\u0109\2\u010b\1\u0109\1\u010c\1\u010d\1\0\1\144"+
+    "\1\u010e\3\144\1\u010b\10\u0109\1\144\5\u0109\2\144\63\u0109"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u010f\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\11\6\1\240\5\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0110\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0111"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0112"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\240\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0113\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\12\157\1\u0114\3\157\1\u0115\110\157\2\16\1\157"+
+    "\2\16\1\0\1\16\1\u0116\4\16\10\157\1\16\5\157"+
+    "\2\16\63\157\25\0\1\u0117\75\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0118\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0119"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u011a\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u011b\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\2\6\1\u011c\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u011d\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u011e\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u011f\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0120"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0121"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0122\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u0123\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0124\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0125"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0126\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u0127\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0128\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0129\5\6\13\0"+
+    "\4\6\1\u012a\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\3\6\1\u012b"+
+    "\13\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u012c\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u012d"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u012e\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u012f\2\6\13\0\14\6\1\240\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0130\4\6\13\0\6\6\1\u0131\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0132"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u0133\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0134\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0135\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u0136\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u0137\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0138\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0139\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u013a\1\6\1\u013b\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u013c\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u013d\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u013e\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\51\0\1\45\1\0"+
+    "\1\22\50\0\1\5\7\6\2\0\1\123\2\6\1\u013f"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u0140\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+    "\1\u0141\3\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u0142\4\6\1\u0143\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0144\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0145\4\6\1\u0134"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0146\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0147\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0148"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0149\4\6\1\u014a"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u014b\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\3\6\1\u014c\13\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\3\6\1\u014d\16\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u014e\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u014f\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0150\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0151\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0152\1\6\13\0\6\6"+
+    "\1\u0153\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0154\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0155\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0156"+
+    "\1\6\1\u0157\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0158\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\255"+
+    "\2\0\1\u0159\3\255\1\0\1\255\1\0\1\5\1\255"+
+    "\3\0\6\255\2\0\6\255\13\0\17\255\1\5\1\0"+
+    "\22\255\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u015a"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u015b\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u015c\4\6\13\0\6\6\1\u015d\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u015e\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u015f\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0160\1\6\1\u0161"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0162\1\u0163\4\6\13\0"+
+    "\4\6\1\u0164\12\6\1\5\1\0\3\6\1\u0165\16\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u0166\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0167\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0168\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u0169\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u016a\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u016b\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u016c\4\6\1\u016d"+
+    "\13\0\1\u016e\1\6\1\u016f\1\u0170\1\u0171\5\6\1\u0172"+
+    "\4\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0173\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u0174\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0175"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\5\6\1\u0176\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0177\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0178\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0179\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u017a\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\3\6\1\u017b\13\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u017c\13\0\16\6\1\u017d\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\4\6\1\u017e\1\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\4\6\1\u017f\15\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0180\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0181\5\6"+
+    "\13\0\3\6\1\u0182\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0183\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0184\1\6\13\0\7\6\1\u0185"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u0186\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\12\6\1\u0187\4\6\1\5\1\0\22\6"+
+    "\1\0\1\5\5\6\1\u0188\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u0189\5\6\13\0\17\6\1\5\1\0\2\6\1\u018a"+
+    "\17\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u018b"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u018c\13\0\17\6"+
+    "\1\5\1\0\13\6\1\u018d\6\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u018e\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u018f\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0190\4\6\1\u0191\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0192\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0193\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0194\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0195\4\6\13\0\4\6\1\u0196\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u0197\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0198\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0199\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u019a\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u014d\3\6\13\0\17\6\1\5\1\0\22\6\63\0"+
+    "\1\u019b\102\0\1\u019c\116\0\1\u019d\154\0\1\u019e\114\0"+
+    "\1\u019f\102\0\1\u01a0\60\0\52\344\1\346\50\344\1\0"+
+    "\1\344\4\0\1\344\4\0\3\344\10\0\6\344\2\0"+
+    "\6\344\6\0\1\346\4\0\17\344\2\0\22\344\37\0"+
+    "\1\u01a1\154\0\1\u01a2\45\0\1\u01a3\43\0\1\u01a4\1\u01a5"+
+    "\102\0\1\u01a6\146\0\1\u01a7\51\0\1\u01a8\147\0\1\u01a9"+
+    "\24\0\1\u01aa\65\0\1\u01ab\132\0\1\u01ac\123\0\1\u01ad"+
+    "\122\0\1\u01ae\75\0\1\u01af\146\0\1\u01b0\124\0\1\u01b1"+
+    "\16\0\1\u01b2\1\0\1\u01b3\1\0\1\u01b4\3\0\1\u01b5"+
+    "\113\0\1\u01b6\102\0\1\u01b7\116\0\1\u01b8\154\0\1\u01b9"+
+    "\32\0\3\5\5\u01ba\2\0\3\5\1\u01ba\1\0\1\u01ba"+
+    "\1\0\2\5\3\0\1\5\2\u01ba\1\5\2\u01ba\2\0"+
+    "\2\5\2\u01ba\2\5\13\0\2\5\1\u01ba\1\5\1\u01ba"+
+    "\3\5\1\u01ba\7\5\1\0\1\5\1\u01ba\20\5\1\0"+
+    "\2\124\1\125\3\372\1\124\1\372\2\0\4\124\1\0"+
+    "\1\372\1\0\2\124\3\0\1\127\5\124\2\0\4\124"+
+    "\1\127\1\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+    "\3\373\1\124\1\373\2\0\3\124\1\126\1\0\1\373"+
+    "\1\0\2\124\3\0\4\124\1\126\1\124\2\0\6\124"+
+    "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+    "\4\0\3\373\1\0\1\373\7\0\1\373\103\0\2\124"+
+    "\1\132\1\124\2\375\1\124\1\375\2\0\4\124\1\0"+
+    "\1\375\1\0\2\124\3\0\1\376\5\124\2\0\4\124"+
+    "\1\376\1\124\13\0\20\124\1\0\22\124\1\0\2\124"+
+    "\1\u01bb\1\124\2\377\2\124\2\0\4\124\1\0\1\124"+
+    "\1\0\2\124\3\0\6\124\2\0\6\124\13\0\20\124"+
+    "\1\0\22\124\1\0\2\124\1\u01bc\5\u0100\2\0\3\124"+
+    "\1\u0100\1\0\1\u0100\1\0\2\124\3\0\1\376\2\u0100"+
+    "\1\124\2\u0100\2\0\2\124\2\u0100\1\376\1\124\13\0"+
+    "\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100\7\124\1\0"+
+    "\1\124\1\u0100\20\124\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u01bd\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u01be\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u01bf\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u01c0\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u01c1\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u01c2\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u01c3\13\0\4\6\1\u01c4\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u01c5"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\3\6\1\u01c6"+
+    "\13\6\1\5\1\0\22\6\1\0\10\u0109\1\145\1\0"+
+    "\115\u0109\2\u010c\1\u0109\1\u010c\1\u010a\1\0\5\u0109\1\u010c"+
+    "\107\u0109\2\144\1\u0109\1\144\1\u010a\1\0\5\u0109\1\144"+
+    "\106\u0109\5\u01c7\1\145\1\0\3\u0109\1\u01c7\1\u0109\1\u01c7"+
+    "\7\u0109\2\u01c7\1\u0109\2\u01c7\4\u0109\2\u01c7\17\u0109\1\u01c7"+
+    "\1\u0109\1\u01c7\3\u0109\1\u01c7\11\u0109\1\u01c7\21\u0109\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\240\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u01c8\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u012e\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u01c9\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u01ca\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\11\157\1\0\114\157\5\u01cb"+
+    "\2\157\1\u0114\2\157\1\u01cb\1\u0115\1\u01cb\7\157\2\u01cb"+
+    "\1\157\2\u01cb\4\157\2\u01cb\17\157\1\u01cb\1\157\1\u01cb"+
+    "\3\157\1\u01cb\11\157\1\u01cb\21\157\24\0\1\u01cc\76\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\13\6"+
+    "\1\u0162\3\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u01cd\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01ce\3\6\13\0\16\6\1\u01cf\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u01d0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\2\6\1\u01d1\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u01d2\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u01d3\17\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01d4"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u01d5\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u01d6\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u01d7\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u01d8"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u01d9\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\7\6\1\u01da\7\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u01db"+
+    "\1\6\1\u01dc\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u01dd\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u01de"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u01df\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u01e0\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u01e1\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u01e2\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\5\6"+
+    "\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01e4"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u01e5\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u01e6\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\240\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u01e7\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\240\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\240\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01e8"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u01e9\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01ea\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\13\6\1\u01d7\3\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\155\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u01eb\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u01ec\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u01c9"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0145\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u01ed\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u01ee\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u01ef\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u01ec\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u01f0\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\12\6\1\u01f1\4\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\16\6\1\u01f2"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u01f3\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u0131\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u01d7\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u01f4\4\6\1\u01f5\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u01f6\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u01f7\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u01f8\1\6\13\0\1\6"+
+    "\1\u01ea\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u01f9\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u01fa\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0162"+
+    "\1\u01fb\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u01fc\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u01fd\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u0134\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u01fe"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\240"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\240\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u01ff\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0200\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u0201\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0202\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u0203\14\6"+
+    "\1\5\1\0\22\6\1\0\10\5\2\0\1\5\1\u0204"+
+    "\2\5\1\0\1\5\1\0\2\5\3\0\6\5\2\0"+
+    "\6\5\13\0\20\5\1\0\22\5\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0205\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0206\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0207"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0208\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0209\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u020a\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u020b\3\6"+
+    "\13\0\6\6\1\u020c\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u020d\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u020e\3\6"+
+    "\1\u020f\4\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\u0210\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0211"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u01d9\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0212\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0213\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u0214\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0215"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0216\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u0217\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0218\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0219\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u021a\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u021b\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u021c\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u021d\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u021e\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\2\6\1\u021f\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0220"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u0221\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\201\4\6\13\0\5\6\1\u0222"+
+    "\11\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0223\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0224\3\6\13\0\1\6\1\u0225\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\10\6\1\u0226\11\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0227"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0228\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u0229\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u022a\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u022b\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\10\6\1\u022c\6\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\10\6"+
+    "\1\u0162\6\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u022d\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\u0162\16\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\1\0\1\u022e\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u022f\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0230\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u0231\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0232\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u0233\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0234\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\1\6\1\u0235\1\u0236\17\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u0237\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\3\6\1\u0238\13\6\1\5\1\0"+
+    "\12\6\1\u0239\7\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u023a\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u023b\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u023c\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u023d\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\3\6\1\u023e\1\u023f\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0240"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0241\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\16\6\1\u0242\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0243\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u0244\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0245\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0128\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u0162\14\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0246\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0247\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\16\6\1\u0248\1\5"+
+    "\1\0\22\6\57\0\1\u0249\104\0\1\u019b\144\0\1\u024a"+
+    "\75\0\1\u024b\143\0\1\u024c\104\0\1\u019f\144\0\1\u024d"+
+    "\75\0\1\u024e\123\0\1\u024f\123\0\1\u0250\144\0\1\u0251"+
+    "\77\0\1\u0252\125\0\1\u0253\21\0\1\u0254\75\0\1\u0255"+
+    "\123\0\1\u0256\1\u0257\76\0\1\u0258\151\0\1\u0259\141\0"+
+    "\1\u025a\77\0\1\u025b\121\0\1\u025c\122\0\1\u025d\22\0"+
+    "\1\u025e\100\0\1\u025f\150\0\1\u0260\115\0\1\u0261\122\0"+
+    "\1\u0262\56\0\1\u0263\147\0\1\u0264\137\0\1\u0265\104\0"+
+    "\1\u01b6\144\0\1\u0266\75\0\1\u0267\65\0\3\5\5\u0268"+
+    "\2\0\3\5\1\u0268\1\0\1\u0268\1\0\2\5\3\0"+
+    "\1\5\2\u0268\1\5\2\u0268\2\0\2\5\2\u0268\2\5"+
+    "\13\0\2\5\1\u0268\1\5\1\u0268\3\5\1\u0268\7\5"+
+    "\1\0\1\5\1\u0268\20\5\1\0\2\124\1\u01bc\5\u0100"+
+    "\2\0\3\124\1\u0100\1\0\1\u0100\1\0\2\124\3\0"+
+    "\1\124\2\u0100\1\124\2\u0100\2\0\2\124\2\u0100\2\124"+
+    "\13\0\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100\7\124"+
+    "\1\0\1\124\1\u0100\20\124\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0269\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u026a\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u026b"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u026c\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01ff\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u026d\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u026e\2\6\13\0\17\6\1\5\1\0"+
+    "\1\6\1\u026f\1\u0270\17\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u01fc\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0271"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0272\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0173\2\6\13\0\6\6"+
+    "\1\u0273\10\6\1\5\1\0\22\6\1\0\3\u0109\5\u0274"+
+    "\1\145\1\0\3\u0109\1\u0274\1\u0109\1\u0274\7\u0109\2\u0274"+
+    "\1\u0109\2\u0274\4\u0109\2\u0274\17\u0109\1\u0274\1\u0109\1\u0274"+
+    "\3\u0109\1\u0274\11\u0109\1\u0274\21\u0109\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\12\6\1\u0134\4\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u01d7\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0275\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\3\157\5\u0276"+
+    "\2\157\1\u0114\2\157\1\u0276\1\u0115\1\u0276\7\157\2\u0276"+
+    "\1\157\2\u0276\4\157\2\u0276\17\157\1\u0276\1\157\1\u0276"+
+    "\3\157\1\u0276\11\157\1\u0276\21\157\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0277\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\11\6\1\u0278\10\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0279"+
+    "\1\u027a\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\15\6"+
+    "\1\u027b\1\6\1\5\1\0\4\6\1\u027c\15\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u027d\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u027e\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u01d9\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\1\6\1\u027f\20\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\16\6"+
+    "\1\240\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0280\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\u01ff\16\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0162\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0281\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0282\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0283\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u0284"+
+    "\1\6\2\0\6\6\13\0\10\6\1\u0285\4\6\1\u0286"+
+    "\1\6\1\5\1\0\4\6\1\u0287\4\6\1\u0288\1\u0289"+
+    "\1\6\1\u028a\2\6\1\u028b\2\6\1\0\1\5\5\6"+
+    "\1\u028c\1\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u028d\3\6"+
+    "\13\0\17\6\1\5\1\0\2\6\1\u01d3\5\6\1\u028e"+
+    "\11\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0162\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u028f\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0290\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\14\6\1\u0291\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0292"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\5\6\1\u0222"+
+    "\11\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0293\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\11\6\1\u0294\5\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0295\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u0296\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0297\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u01f5\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0298\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0299\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\u029a\16\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u029b\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0122\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u029c\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u029d\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u029e\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\240\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u029f\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\240\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u02a0\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u02a1\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u02a2\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u02a3\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0162\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\4\6\1\u02a4"+
+    "\5\6\1\u02a5\7\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u01fa\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u02a6\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\247\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u014f\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u02a7\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01de"+
+    "\1\u014f\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u02a8\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u02a9\15\6\1\5"+
+    "\1\0\22\6\1\0\3\5\5\u02aa\2\0\3\5\1\u02aa"+
+    "\1\0\1\u02aa\1\0\2\5\3\0\1\5\2\u02aa\1\5"+
+    "\2\u02aa\2\0\2\5\2\u02aa\2\5\13\0\2\5\1\u02aa"+
+    "\1\5\1\u02aa\3\5\1\u02aa\7\5\1\0\1\5\1\u02aa"+
+    "\20\5\1\0\1\5\5\6\1\u02ab\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u02ac\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u02ad\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\u02ae\16\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u02af"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u02b0\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u02b1\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u02b2\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\4\6\1\u02b3\12\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\16\6\1\u02b4\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u02b5\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u02b6\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u02b7\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u02b8\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02b9\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u02ba\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u02bb\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\4\6\1\u02bc\1\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02bd\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u02be\4\6\13\0\13\6"+
+    "\1\u02ba\3\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u02bf\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u02c0\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\5\6\1\u02c1\11\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u02c2\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u02c3\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u02c4\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u02c5"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u02c6"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u02c7\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u02c8\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u02c9\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\2\6\1\u01d3\5\6\1\u028e\11\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u02ca\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\11\6\1\u01ff\5\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u02cb\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u02cc\4\6"+
+    "\13\0\17\6\1\5\1\0\21\6\1\u02cd\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\11\6\1\u02ce\10\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u02cf\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u02d0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u02d1\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u02d2\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u01ff\5\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u01d3\5\6\1\u028e\11\6\34\0\1\u02d3\67\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u02d4"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\14\6"+
+    "\1\u02d5\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u02d6\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u02d7\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u02d8\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u02d9\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u02da\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02db\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\4\6\1\u02dc\12\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u02dd\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\2\6\1\u02de\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u02df\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u02e0\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u02e1\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u02e2\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u02e3\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u02e4\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02e5"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u02e6\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u02e7\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\2\6\1\u02e8\14\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u02e9\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\2\6\1\u02ea\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u02eb\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u02ec"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\7\6\1\u02ed\12\6\25\0\1\u02ee\141\0\1\u019b"+
+    "\12\0\1\u0249\45\0\1\u024b\1\u02ef\5\u024b\1\u02ef\2\0"+
+    "\3\u024b\1\0\1\u024b\1\0\1\u02ef\1\u024b\1\0\1\u024b"+
+    "\1\u02ef\6\u024b\2\u02ef\6\u024b\1\0\2\u02ef\1\0\1\u02ef"+
+    "\2\0\4\u02ef\17\u024b\2\u02ef\22\u024b\25\0\1\u02f0\141\0"+
+    "\1\u019f\12\0\1\u024c\45\0\1\u024e\1\u02f1\5\u024e\1\u02f1"+
+    "\2\0\3\u024e\1\0\1\u024e\1\0\1\u02f1\1\u024e\1\0"+
+    "\1\u024e\1\u02f1\6\u024e\2\u02f1\6\u024e\1\0\2\u02f1\1\0"+
+    "\1\u02f1\2\0\4\u02f1\17\u024e\2\u02f1\22\u024e\61\0\1\u02f2"+
+    "\102\0\1\u02f3\17\0\1\u02f4\122\0\1\u0257\55\0\1\u02f5"+
+    "\175\0\1\u02f6\74\0\1\u02f7\1\0\1\u02f8\137\0\1\u02f9"+
+    "\130\0\1\u02fa\120\0\1\u02fb\117\0\1\u02fc\101\0\1\u02fd"+
+    "\124\0\1\u02fe\121\0\1\u02ff\122\0\1\u0300\122\0\1\u0301"+
+    "\125\0\1\u0302\73\0\1\u0303\21\0\1\u0304\147\0\1\u0305"+
+    "\120\0\1\u0306\120\0\1\u0307\105\0\1\u0308\104\0\1\u0309"+
+    "\141\0\1\u01b6\12\0\1\u0265\45\0\1\u0267\1\u030a\5\u0267"+
+    "\1\u030a\2\0\3\u0267\1\0\1\u0267\1\0\1\u030a\1\u0267"+
+    "\1\0\1\u0267\1\u030a\6\u0267\2\u030a\6\u0267\1\0\2\u030a"+
+    "\1\0\1\u030a\2\0\4\u030a\17\u0267\2\u030a\22\u0267\1\0"+
+    "\3\5\5\u030b\2\0\3\5\1\u030b\1\0\1\u030b\1\0"+
+    "\2\5\3\0\1\5\2\u030b\1\5\2\u030b\2\0\2\5"+
+    "\2\u030b\2\5\13\0\2\5\1\u030b\1\5\1\u030b\3\5"+
+    "\1\u030b\7\5\1\0\1\5\1\u030b\20\5\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u030c\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\2\6\1\u030d\14\6\1\5"+
+    "\1\0\22\6\1\0\1\5\5\6\1\u030e\1\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\1\u030f\3\6\1\u0310\1\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\11\6\1\u0288\10\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u014f\2\6\13\0\17\6"+
+    "\1\5\1\0\11\6\1\u0311\10\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0312\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u0313\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0314\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0315\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0316\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u0317\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u02ba\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\3\u0109\5\u0318\1\145\1\0\3\u0109\1\u0318\1\u0109\1\u0318"+
+    "\7\u0109\2\u0318\1\u0109\2\u0318\4\u0109\2\u0318\17\u0109\1\u0318"+
+    "\1\u0109\1\u0318\3\u0109\1\u0318\11\u0109\1\u0318\21\u0109\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0319\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\3\157\5\u031a\2\157"+
+    "\1\u0114\2\157\1\u031a\1\u0115\1\u031a\7\157\2\u031a\1\157"+
+    "\2\u031a\4\157\2\u031a\17\157\1\u031a\1\157\1\u031a\3\157"+
+    "\1\u031a\11\157\1\u031a\21\157\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u031b\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u031c\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\u031d"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\13\6\1\u031e\3\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u031f\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0320\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0193\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0321\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0322\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u0323\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0324\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u02e8\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0325"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0326"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0327\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0328\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0329\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u032a"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u032b\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u032c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u032d\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u032e\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u032f\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0330\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0331\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0332\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0333\17\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\1\u0334\5\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\12\6\1\u0335\7\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0336\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u0337\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0131\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0338\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0339\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\4\6\1\240\12\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u033a\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u01f5"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u033b"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0134\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\13\6\1\u0134\3\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u033c\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\2\6\1\u033d\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u033e\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u033f\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0340"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0341\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0342"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0343\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0344\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0345\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\7\6\1\u0346\7\6\1\5\1\0\22\6\1\0"+
+    "\3\5\5\u0347\2\0\3\5\1\u0347\1\0\1\u0347\1\0"+
+    "\2\5\3\0\1\5\2\u0347\1\5\2\u0347\2\0\2\5"+
+    "\2\u0347\2\5\13\0\2\5\1\u0347\1\5\1\u0347\3\5"+
+    "\1\u0347\7\5\1\0\1\5\1\u0347\20\5\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0348\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0349\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\1\u034a\5\6"+
+    "\2\0\5\6\1\u0162\13\0\10\6\1\u034b\6\6\1\5"+
+    "\1\0\2\6\1\u034c\1\6\1\u034d\15\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u034e"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u034f\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u01ff\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\7\6"+
+    "\1\u0350\7\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u0351\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0352\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\5\6\1\u0353\4\6\1\u0354\7\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0355"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0356"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u0357\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0358\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\2\6\1\u0223\14\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u01de\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0359\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u035a\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u0162\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u035b\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u035c"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u035d\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u035e\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\12\6\1\u035f\7\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\2\6\1\u0360\5\6\1\u0361\11\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u0362\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0363"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\2\6\1\u01fc\3\6\2\0\1\u0128\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0364\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0365\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0366\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0367\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0368\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0369"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\5\6\1\u036a\14\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u036b\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u036c\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\3\6\1\u036d\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u036e\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\11\6\1\u036f\5\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0370\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\15\0\1\u0371\106\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0372\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u0373\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0374\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u0375\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0376\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0377"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0378\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0379\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u037a\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u037b\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\10\6\1\u037c\11\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\12\6\1\u0201\4\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u037d\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u037e\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u037f\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0380\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u0381\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0382\14\6"+
+    "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0383\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\13\6\1\u01fa\3\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\15\6\1\u0286"+
+    "\1\6\1\5\1\0\4\6\1\u0287\5\6\1\u0289\4\6"+
+    "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0384\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\14\6\1\u0385\2\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0386\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0162\4\6\13\0\17\6\1\5"+
+    "\1\0\1\6\1\u0387\20\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0388\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\25\0\1\u024b\122\0\1\u024e\135\0\1\u0389"+
+    "\124\0\1\u038a\151\0\1\u038b\71\0\1\u038c\145\0\1\u038d"+
+    "\122\0\1\u038e\53\0\1\u038f\167\0\1\u0390\103\0\1\u0391"+
+    "\121\0\1\u0257\124\0\1\u0392\120\0\1\u0393\150\0\1\u0257"+
+    "\126\0\1\u0394\67\0\1\u0395\147\0\1\u0257\123\0\1\u0396"+
+    "\132\0\1\u0397\65\0\1\u0398\156\0\1\u0399\66\0\1\u0397"+
+    "\122\0\1\u039a\75\0\1\u0306\133\0\1\u0267\76\0\3\5"+
+    "\5\6\2\0\3\5\1\6\1\0\1\6\1\0\2\5"+
+    "\3\0\1\5\2\6\1\5\2\6\2\0\2\5\2\6"+
+    "\2\5\13\0\2\5\1\6\1\5\1\6\3\5\1\6"+
+    "\7\5\1\0\1\5\1\6\20\5\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\4\6\1\u039b\12\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u01de\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u039c\2\6\13\0\6\6\1\u039d\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u0328\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u039e\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u039f\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u03a0\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u03a1"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u03a2\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\3\6"+
+    "\1\u03a3\16\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u03a4\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u03a5\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\3\u0109\5\144"+
+    "\1\145\1\0\3\u0109\1\144\1\u0109\1\144\7\u0109\2\144"+
+    "\1\u0109\2\144\4\u0109\2\144\17\u0109\1\144\1\u0109\1\144"+
+    "\3\u0109\1\144\11\u0109\1\144\21\u0109\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\14\6\1\240\2\6\1\5"+
+    "\1\0\22\6\1\0\3\157\5\16\2\157\1\u0114\2\157"+
+    "\1\16\1\u0115\1\16\7\157\2\16\1\157\2\16\4\157"+
+    "\2\16\17\157\1\16\1\157\1\16\3\157\1\16\11\157"+
+    "\1\16\21\157\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u03a6"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u03a7"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\1\u034a\5\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\7\6\1\u03a8\12\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0385\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u03a9\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u03aa\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0162\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u03ab\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u01d7\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\4\6\1\u03ac\1\6\2\0\1\u03ad\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u03ae\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u03af\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u03b0\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u03b1\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u03b2\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u03b3\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0329\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u03b4\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u03af\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u03b5\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u03b6\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u0162\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u03b7\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u03b8\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u03b9\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u03ba\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\2\6\1\u03bb\3\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u03bc\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\4\6\1\u01f5\12\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\2\6\1\u03bd\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u03be\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u03bf\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u0134\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u03c0"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u03c1"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u03c2\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u03c3\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\u03c4\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0341\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u03c5\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u03c6\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u03c7\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\1\6\1\u03c8\20\6\1\0\3\5\5\u03c9\2\0\3\5"+
+    "\1\u03c9\1\0\1\u03c9\1\0\2\5\3\0\1\5\2\u03c9"+
+    "\1\5\2\u03c9\2\0\2\5\2\u03c9\2\5\13\0\2\5"+
+    "\1\u03c9\1\5\1\u03c9\3\5\1\u03c9\7\5\1\0\1\5"+
+    "\1\u03c9\20\5\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u03ca\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\4\6\1\u03cb\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u03cc"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\243\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u03cd\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u03ce\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u03cf\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u03d0\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u03d1\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\5\6\1\u03d2"+
+    "\14\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\1\6\1\u03d3\4\6"+
+    "\2\0\6\6\13\0\15\6\1\u0286\1\6\1\5\1\0"+
+    "\4\6\1\u034d\1\u03d2\11\6\1\u028b\2\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\10\6\1\u03d4\11\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u03d5\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\12\6\1\u03d6\4\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u03d7\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u03d8\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u03d9\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u03da\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\5\6\1\u03db\14\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u03dc\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u03dd\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u03de\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u03df\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u03e0\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u03e1\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u03e2\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u03e3\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u03e4"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\u03e5"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u03e6\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u03e7\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u03e8\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u03b6\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u03e9"+
+    "\5\6\1\0\1\u03ea\6\6\13\0\10\6\1\u03eb\6\6"+
+    "\1\5\1\0\15\6\1\u03ec\4\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u03ed\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u03ee\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u01fa"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u03ef\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u03f0\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u03f1\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u03f2\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u03f3\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\37\0\1\u03f4\64\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u03f5\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u03f6\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\4\6\1\u03f7\1\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\12\6"+
+    "\1\u03f8\4\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\2\6\1\u03f9\3\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u03fa\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u03fb\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u03fc"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u03fd\1\u03fe\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\10\6\1\u03ff\11\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u0400\17\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0401\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0162"+
+    "\13\0\17\6\1\5\1\0\2\6\1\u0402\1\6\1\u0403"+
+    "\5\6\1\u0404\7\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0405\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0406\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0407\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0408\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0409"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u040a\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u040b\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\5\6\1\u040c\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u040d\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\2\6\1\u040e\3\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u040f\13\0\17\6\1\5\1\0\22\6\66\0"+
+    "\1\u0410\116\0\1\u0411\104\0\1\u0257\73\0\1\u0257\150\0"+
+    "\1\u02fb\116\0\1\u0302\145\0\1\u02fb\100\0\1\u0257\125\0"+
+    "\1\u0412\120\0\1\u0413\145\0\1\u0414\117\0\1\u0415\56\0"+
+    "\1\u0410\166\0\1\u038c\42\0\44\u0397\1\u0257\56\u0397\37\0"+
+    "\1\u0416\143\0\1\u0417\101\0\1\u0418\63\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u0162\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0419\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u041a"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u041b\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u041c\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\12\6\1\u041d\4\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u041e\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u041f\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u0420\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0421"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0422"+
+    "\10\6\1\5\1\0\22\6\7\0\1\u0423\20\0\1\u0424"+
+    "\73\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\2\6\1\u0425\3\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0426\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0427\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0428\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0429"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u042a\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u042b\1\u042c\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u042d\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02ba"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u042e"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\2\6\1\u02ba\14\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u042f"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\4\6\1\u0430\1\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0431\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0432\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0433\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0434\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0435\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0436\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0437\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\13\6"+
+    "\1\u0438\6\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u01f5\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\3\6\1\240\13\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u0439\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0153\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\4\6\1\u0134\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u043a"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u043b\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u043c\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u043d\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u043e\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\5\6\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\14\6\1\u028a\5\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u043f\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\4\6\1\u0440\12\6\1\5\1\0\22\6\1\0"+
+    "\3\5\5\255\2\0\3\5\1\255\1\0\1\255\1\0"+
+    "\2\5\3\0\1\5\2\255\1\5\2\255\2\0\2\5"+
+    "\2\255\2\5\13\0\2\5\1\255\1\5\1\255\3\5"+
+    "\1\255\7\5\1\0\1\5\1\255\20\5\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u01c1\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0441\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u01d9"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0442\15\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u016f\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0443"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0444"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0445\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0446\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u0447\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0448\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0449\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u044a\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\1\u044b\21\6\1\0\1\5\5\6\1\u044c"+
+    "\1\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\1\u030f\5\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\14\6\1\u044d\2\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u044e\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u044f\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0450\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0385\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\3\6\1\u0451\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0452\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0453\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0454\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0455"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0456\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0457\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\5\6\1\u0458\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\12\6\1\u0459\1\6"+
+    "\1\u045a\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u045b\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\4\6\1\u045c\1\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\1\6\1\u045d\1\u045e"+
+    "\2\6\1\u045f\2\6\1\u0460\11\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\14\6\1\u0248\2\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0461\15\6\1\5\1\0"+
+    "\22\6\103\0\1\u0462\3\0\1\u0463\14\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u03d4\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0464\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\1\u0465\5\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0466\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\14\6\1\u0467"+
+    "\5\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u0468\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\2\6\1\u0469\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u046a\1\u040c\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\40\0\1\u046b\63\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u046c\1\6\2\0\6\6\13\0\15\6\1\u046d"+
+    "\1\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u046e\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u046f\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0470"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u0177\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\10\6\1\u0471\6\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\12\6\1\u0472\4\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0473"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0474"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0475\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0476\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0477\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0478\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0479\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u047a\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\u047b\2\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u047c\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\16\6\1\u047d\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u047e"+
+    "\5\6\1\u047f\2\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\1\6\1\u0480\4\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0481\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\14\6\1\u0482\2\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0483"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\201\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\10\6"+
+    "\1\u0484\11\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0485\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u0486\16\6\1\5\1\0\22\6\42\0\1\u0487\124\0"+
+    "\1\u0488\111\0\1\u0489\34\0\1\u048a\71\0\1\u02fb\125\0"+
+    "\1\u048b\120\0\1\u048c\124\0\1\u048d\141\0\1\u048e\127\0"+
+    "\1\u048f\35\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u012d"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0490"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u0491\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0492\17\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0493"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0494\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\14\6\1\u0495\2\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0496\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0497\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0498"+
+    "\15\6\1\5\1\0\22\6\42\0\1\u0499\74\0\1\u049a"+
+    "\107\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u049b"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u049c\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u049d\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0196"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\14\6\1\u049e"+
+    "\2\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u049f\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u04a0\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\2\6\1\u04a1\3\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\4\6\1\u0284\1\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u04a2\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u04a3\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u04a4\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u04a5\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u04a6\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u04a7\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u04a8"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u04a9\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\4\6\1\u04aa\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04ab\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u04ac\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u04ad\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04ae\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u0131\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u04af\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u04b0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u039b\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\1\6\1\u04b1\4\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u04b2\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u04b3\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u034a"+
+    "\5\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u04b4\5\6\1\u04b5\7\6\1\76\1\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0472\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u04b6\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0385\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u04b7"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\16\6\1\u04b8"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\2\6\1\u04b9\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u04ba\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u0181\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u04bb\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u04bc\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u04bd\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04be\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\5\6\1\u01e3\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\10\6\1\u04bf\11\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\4\6\1\u0287\15\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\7\6\1\u04c0\7\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u04c1\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04c2\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u04c3\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+    "\1\u04c4\3\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\12\6\1\u04c5\7\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u04c6\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u04c7\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u04c8\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u04c9\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u04ca\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u04cb\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u04cc\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04cd\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04ce\4\6"+
+    "\13\0\4\6\1\u04cf\12\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u04d0\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\u04d1\16\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04d2\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u04d3\12\6\1\5\1\0\22\6\37\0\1\u04d4\100\0"+
+    "\1\u04d5\106\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04d6\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u04d7\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\16\6\1\u0162\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u04d8\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04d9\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u04da\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u04db\15\6\1\5\1\0"+
+    "\22\6\74\0\1\u04dc\27\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u04dd\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u04de\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u04df\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u04e0\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\1\6\1\u04e1\20\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u04e2"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u012d\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u04e3\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u04e4\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u04e5"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u04e6\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u04e7\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u04e8\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04e9\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u04ea\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u04eb\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\10\6\1\u04ec\6\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\15\6\1\u0286"+
+    "\1\6\1\5\1\0\4\6\1\u0287\15\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u04ed\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\15\6\1\u027b\1\6\1\5"+
+    "\1\0\14\6\1\u028a\5\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\u04ee\2\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u04ef\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\20\6\1\76\1\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u04f0\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u04f1\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u04f2\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\10\6\1\u028e\11\6\43\0\1\u0257\121\0"+
+    "\1\u04f3\146\0\1\u04f4\76\0\1\u04f5\117\0\1\u04f6\157\0"+
+    "\1\u0257\71\0\1\u0397\116\0\1\u0397\122\0\1\u04f7\64\0"+
+    "\1\5\7\6\2\0\1\123\1\u04f8\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u04f9\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u04fa"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04fb\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\1\0\1\u04fc\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\15\6\1\u0286\1\6\1\5\1\0\17\6"+
+    "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u04fd\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04fe\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u04ff\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\37\0\1\u0500\151\0\1\u0501\35\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u047d\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u0223\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u0502\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\4\6\1\u0287\5\6\1\u0289\7\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\13\6\1\u0503\3\6\1\5\1\0\22\6\1\0\1\5"+
+    "\5\6\1\u0504\1\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\1\0\1\u0505\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\4\6\1\u0506\1\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u0507\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\2\6\1\u0382\17\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u0508\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0509\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u050a\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0321\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\1\u01ff\21\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\4\6\1\u050b\15\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\16\6\1\u012d\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u050c\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u01d9\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\1\u03bf\21\6\1\0\1\5"+
+    "\7\6\2\0\1\123\2\6\1\240\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\4\6"+
+    "\1\u050d\1\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u050e\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u050f\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0510\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0511\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0512"+
+    "\1\u0513\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u012d\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0514\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0515\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\2\6\1\u0516"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\4\6\1\u03b1\1\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0517\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\2\6"+
+    "\1\u0518\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u0519\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u051a\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u051b\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u051c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u012d\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u051d\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u051e\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u051f"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\2\6\1\u0520\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u0521\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0522\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\2\6\1\u0523\3\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0524\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\13\6\1\u0525"+
+    "\6\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\1\6\1\u0526\15\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\1\u0527\5\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0528\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\13\6\1\u0529\3\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\4\6\1\u052a\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u052b\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u052c\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u052d\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u052e"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\42\0\1\u052f"+
+    "\144\0\1\u0530\37\0\1\5\7\6\2\0\1\123\1\u0330"+
+    "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0531\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0532\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0533\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0534"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0535\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u0536\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u0537\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0538\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0539\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u053a\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\2\6\1\u053b"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u053c"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u053d\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u053e\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u053f\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0540\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u02ea\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u0541\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u0542\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u0543\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0544\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0162"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0545\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u02bd\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u0546\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0547\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0450\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\16\0\1\u0548\145\0\1\u0549\120\0\1\u054a"+
+    "\124\0\1\u054b\151\0\1\u054c\33\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u054d\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u0385\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+    "\1\u054e\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u054f\13\0\17\6\1\5"+
+    "\1\0\22\6\103\0\1\u0550\3\0\1\u0551\14\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u01fa"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\10\6"+
+    "\1\u0552\11\6\41\0\1\u0553\124\0\1\u0554\60\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0555"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u0556\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0557\1\6\13\0\17\6\1\5\1\0\22\6\30\0"+
+    "\1\u0558\73\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u0559\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+    "\1\u0196\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\1\6\1\u04c1\1\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0433\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u055a\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u055b\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u055c\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u055d\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u055e\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u055f\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0560\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0162"+
+    "\5\6\13\0\17\6\1\5\1\0\3\6\1\u0561\16\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0562\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0563\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u0564\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0565\1\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0566\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\5\6\1\u0567\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0568\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0569\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\2\6\1\u056a\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u056b\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\21\6\1\u02cd\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u056c\14\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u056d\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u056e\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\1\6\1\u056f\4\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0570\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0571\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0572"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0573\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0574\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\3\6\1\u0575\13\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u0576\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0577\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u04e5\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0578"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0472\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0579\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\6\6\1\u057a\10\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0162\1\6"+
+    "\13\0\17\6\1\5\1\0\22\6\37\0\1\u057b\125\0"+
+    "\1\u057c\61\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u057d"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u053e\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u057e\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u057f\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\7\6"+
+    "\1\u0580\7\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0581\7\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0582\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u012d\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u0419\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0583\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\4\6"+
+    "\1\u0584\1\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\1\u0585\21\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\276"+
+    "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0586\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u053d\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0587"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0588\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u0589\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\u058a\2\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u058b\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u058c\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\140\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\u058d"+
+    "\16\6\1\5\1\0\22\6\41\0\1\u058e\124\0\1\u054b"+
+    "\121\0\1\u0257\142\0\1\u0257\121\0\1\u058f\42\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0590\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\3\6\1\u040e\13\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0591\10\6\1\5\1\0\22\6"+
+    "\14\0\1\u0592\123\0\1\u0593\106\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0594\15\6\1\5"+
+    "\1\0\22\6\73\0\1\u0595\111\0\1\u0596\41\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0597\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\5\6\1\u0598"+
+    "\1\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u0599\15\6\1\5\1\0\22\6"+
+    "\66\0\1\u059a\35\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u059b"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0228\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\4\6\1\u059c\15\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u059d\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u059e\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u059f\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u05a0\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\4\6\1\u05a1\1\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u05a2\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\u05a3\16\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\1\0"+
+    "\1\u05a4\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+    "\1\u04f2\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05a5\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u05a6\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u05a7\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u05a8\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u05a9\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u05aa\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u05ab\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\5\6\1\u01e3\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\4\6\1\u05ac\15\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u05ad"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\5\6"+
+    "\1\u05ae\14\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\6\1\u05af\15\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\15\6\1\u0286\1\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u05b0"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u05b1\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\5\6\1\u012d\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0419\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u05b2\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\4\6\1\u05b3\12\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u05b4\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\5\6\1\u05b5\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u05b6\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\u05b7\5\6\13\0\17\6\1\5\1\0\22\6\41\0"+
+    "\1\u04dc\75\0\1\u05b8\107\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u05b9\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u05ba\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\5\6"+
+    "\1\u05bb\2\0\6\6\13\0\17\6\1\5\1\0\12\6"+
+    "\1\u05bc\7\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\1\u05bd\5\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u05be\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u05bf\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\u05c0\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u05c1"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u05c2"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u05c3\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0419\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\7\6\1\u05c4\7\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u05c5"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+    "\1\u05c6\13\6\1\u05c7\3\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\u05c8\5\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u012d\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u05c9\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05ca\10\6"+
+    "\1\5\1\0\22\6\37\0\1\u048c\147\0\1\u0397\37\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u05cb\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u05cc\15\6"+
+    "\1\5\1\0\22\6\31\0\1\u05cd\157\0\1\u05ce\35\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u05cf\14\6\1\5\1\0\22\6\61\0\1\u03f4\102\0"+
+    "\1\u05d0\62\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\1\6\1\u05d1\4\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+    "\1\u05d2\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\5\6\1\u0450\13\0\17\6\1\5"+
+    "\1\0\22\6\73\0\1\u05d3\30\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u05d4\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u05d5\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u05d6"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u05d7"+
+    "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u05d8\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u05d9"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u05da"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u05db\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6";
+
+  private static final String ZZ_TRANS_PACKED_1 =
+    "\2\0\6\6\13\0\1\6\1\u05dc\15\6\1\5\1\0"+
+    "\22\6\103\0\1\u05dd\20\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\1\u02ba\21\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u05de"+
+    "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\11\6\1\u0385"+
+    "\5\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\14\6"+
+    "\1\u028a\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\13\6\1\u05df\3\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\13\6\1\u02ba\3\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\12\6\1\u012d\7\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\276\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\1\u05e0\16\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u05e1\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\u012d\16\6\1\5\1\0"+
+    "\22\6\1\0\1\5\5\6\1\u05e2\1\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u05e3\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u05e4\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u05e5\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\276"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\2\6\1\u05e6\14\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u05e7\15\6\1\5\1\0"+
+    "\22\6\73\0\1\u05e8\30\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u05e9\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u05ea\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u05eb\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\3\6\1\u05ec\13\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u05ed\10\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u05ee"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u05ef\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u05f0\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\14\6\1\u05f1\2\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\u05f2\2\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\2\6\1\u05e4\3\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\17\6\1\u028b\2\6"+
+    "\1\0\1\5\5\6\1\u05f3\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u05f4"+
+    "\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u05f5\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u05f6\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\2\6\1\u05f7"+
+    "\17\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u05f8\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u031e\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05f9\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u012d\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\44\0\1\u05fa\142\0\1\u05fb\37\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05fc\10\6"+
+    "\1\5\1\0\22\6\40\0\1\u04dc\63\0\1\5\7\6"+
+    "\2\0\1\123\1\u05fd\2\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u05fe\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\70\0\1\u05ff\33\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0600\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u0601\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\14\6\1\u0602\5\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\3\6\1\u0603\2\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\2\6\1\u0604\3\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\6\6\1\u01fc\10\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u03b6"+
+    "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0605\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\2\6\1\u0385\14\6\1\5\1\0\22\6"+
+    "\66\0\1\u0606\35\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u0607\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\1\u0608\2\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0609\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u060a\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u060b\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\u060c\5\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0472\1\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\5\6\1\u060d\1\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u060e\1\u01e3\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\14\6\1\u060f\2\6\1\u0610\2\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\2\6\1\u045e\17\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\1\6\1\u05e6\4\6\13\0\17\6\1\5"+
+    "\1\0\22\6\60\0\1\u0611\43\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0612\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\3\6\1\u0613\2\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\4\6\1\u0614\12\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0615\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\1\6\1\u0616\1\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\5\6\1\u026d\1\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\4\6\1\u060e\1\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\1\6\1\u0617\15\6"+
+    "\1\u0610\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\4\6\1\u0472\12\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\2\6\1\u0618\17\6\1\0\1\5"+
+    "\7\6\2\0\1\123\1\6\1\u05dc\1\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\4\6\1\u0619\1\6\13\0\1\6\1\u061a"+
+    "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u061b\10\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\1\6\1\u061c\4\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u061d"+
+    "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u061e\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u061f\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02ea"+
+    "\5\6\13\0\17\6\1\5\1\0\22\6\41\0\1\u0620"+
+    "\142\0\1\u0621\42\0\1\5\7\6\2\0\1\123\2\6"+
+    "\1\u0622\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0623\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\12\6\1\u0624\4\6"+
+    "\1\5\1\0\22\6\41\0\1\u0625\62\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\13\6\1\u04ed\3\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\u0626\5\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0627"+
+    "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\u0628\5\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\1\0\1\u0629\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u062a\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\67\0\1\u062b\34\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u062c\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u062d\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u062e\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u0573\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u062f\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0630\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\1\6\1\u0631\15\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+    "\1\u0632\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0633\4\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0634\10\6"+
+    "\1\5\1\0\22\6\37\0\1\u0635\64\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0573\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0636\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\6\1\u0637\15\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\1\6\1\u0638\4\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\16\6\1\u0385\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+    "\1\u04ce\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0639\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u063a\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\1\6\1\u063b\1\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u063c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u063d\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\6\6\1\u063e\10\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u063f\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u0640"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\37\0\1\u04dc"+
+    "\145\0\1\u0641\41\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0642\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\2\6\1\u01fc\14\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\2\6\1\u0643\3\6\13\0"+
+    "\17\6\1\5\1\0\22\6\64\0\1\u0644\37\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0645"+
+    "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u0646\15\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u060e"+
+    "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\7\0\1\u0647\114\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0648\10\6\1\5\1\0\22\6"+
+    "\63\0\1\u0649\40\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u01d9\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u02af"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u064a\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u064b\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+    "\1\u064c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u03a0\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\2\6\1\u064d\14\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\3\6\1\u064e\2\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u064f\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0650\14\6\1\5\1\0"+
+    "\22\6\34\0\1\u0651\67\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u0652\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\2\6\1\u0653\14\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\3\6\1\u0654\2\6\13\0"+
+    "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\1\u0472"+
+    "\21\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u04ed\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u0655\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0197\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+    "\1\u0656\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+    "\1\u032f\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\2\6\1\u0657\3\6\13\0\17\6"+
+    "\1\5\1\0\22\6\75\0\1\u0658\66\0\1\u0659\62\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0638\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u065a\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\66\0\1\u065b\35\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u065c\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\5\6\1\u039b\11\6\1\5\1\0"+
+    "\22\6\61\0\1\u065d\42\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\3\6\1\u065e\2\6\13\0\17\6\1\5\1\0"+
+    "\22\6\43\0\1\u065f\60\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\2\6\1\u0660\14\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+    "\1\u0661\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\5\6\1\u03f3\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\2\6\1\u0662\3\6\13\0\17\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\13\6\1\u0573\3\6\1\5\1\0\22\6\1\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+    "\1\u0663\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u05b0\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\65\0\1\u0664\36\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\16\6"+
+    "\1\u0665\3\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\6\6\1\u0666\10\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u054f\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\u0667\5\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\7\6\1\u0668\7\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0669"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\41\0\1\u066a"+
+    "\111\0\1\u066b\52\0\1\u066c\20\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\5\6\1\u066d\13\0\17\6\1\5\1\0"+
+    "\22\6\67\0\1\u066e\34\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u066f\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\15\0\1\u0670\106\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\4\6\1\u0671\1\6\13\0\17\6\1\5\1\0"+
+    "\22\6\41\0\1\u0672\62\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u03e9"+
+    "\5\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\5\6\1\u0673\1\6\2\0\1\123\3\6"+
+    "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+    "\1\0\14\6\1\u0674\5\6\1\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\6\6\1\u04fb\10\6\1\5"+
+    "\1\0\22\6\64\0\1\u0675\37\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\2\6\1\u0676\3\6\13\0\17\6\1\5"+
+    "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+    "\1\u0677\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0678"+
+    "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+    "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+    "\1\6\3\0\6\6\1\0\1\u0679\6\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\7\6\1\u067a\7\6\1\5\1\0"+
+    "\22\6\62\0\1\u067b\103\0\1\u067c\143\0\1\u067d\37\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u067e\10\6\1\5\1\0\22\6\42\0\1\u067f\61\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+    "\1\u0680\10\6\1\5\1\0\22\6\37\0\1\u0681\64\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\1\u034a\5\6\2\0\6\6\13\0"+
+    "\17\6\1\5\1\0\22\6\34\0\1\u02d3\50\0\1\u0682"+
+    "\16\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+    "\1\u0683\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0684\15\6"+
+    "\1\5\1\0\22\6\41\0\1\u0685\62\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\1\6\1\u0686\4\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\13\6\1\u012d\3\6\1\5\1\0"+
+    "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0687"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\116\0"+
+    "\1\u0688\5\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u0689"+
+    "\6\6\13\0\17\6\1\5\1\0\22\6\66\0\1\u068a"+
+    "\115\0\1\u068b\101\0\1\u068c\63\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\1\6\1\u068d\15\6\1\5"+
+    "\1\0\22\6\43\0\1\u068e\60\0\1\5\7\6\2\0"+
+    "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+    "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\1\u068f"+
+    "\21\6\40\0\1\u0690\151\0\1\u0691\34\0\1\5\7\6"+
+    "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+    "\3\0\6\6\2\0\3\6\1\u0692\2\6\13\0\17\6"+
+    "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\6\6\1\u0586\10\6\1\5\1\0"+
+    "\22\6\63\0\1\u0693\40\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\5\6\1\u034f\13\0\17\6\1\5\1\0\22\6"+
+    "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+    "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04ed\5\6"+
+    "\13\0\17\6\1\5\1\0\22\6\41\0\1\u0694\176\0"+
+    "\1\u0695\45\0\1\u0696\146\0\1\u0697\124\0\1\u0698\35\0"+
+    "\1\5\7\6\2\0\1\123\1\6\1\u0699\1\6\1\0"+
+    "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+    "\13\0\17\6\1\5\1\0\22\6\27\0\1\u069a\74\0"+
+    "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+    "\1\5\1\6\3\0\6\6\2\0\2\6\1\u069b\3\6"+
+    "\13\0\17\6\1\5\1\0\22\6\61\0\1\u069c\130\0"+
+    "\1\u069d\34\0\1\5\7\6\2\0\1\123\1\6\1\u027a"+
+    "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\37\0"+
+    "\1\u069e\122\0\1\u069f\77\0\1\u0694\147\0\1\u06a0\157\0"+
+    "\1\u04dc\107\0\1\u0620\40\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\6\6\13\0\17\6\1\5\1\0\10\6\1\u0361"+
+    "\11\6\42\0\1\u06a1\61\0\1\5\7\6\2\0\1\123"+
+    "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+    "\2\0\1\6\1\u0385\4\6\13\0\17\6\1\5\1\0"+
+    "\22\6\43\0\1\u04dc\73\0\1\u06a2\174\0\1\u06a3\67\0"+
+    "\1\u06a4\153\0\1\u06a5\132\0\1\u06a6\65\0\1\u06a7\144\0"+
+    "\1\u06a8\127\0\1\u06a9\73\0\1\u06aa\144\0\1\u06ab\103\0"+
+    "\1\u06ac\75\0\1\u06ad\146\0\1\u06ae\117\0\1\u06af\100\0"+
+    "\1\u06b0\137\0\1\u06b1\201\0\1\u06b2\55\0\1\u06b3\165\0"+
+    "\1\u06b4\53\0\1\u06b5\126\0\1\u06b6\121\0\1\u06b7\142\0"+
+    "\1\u04dc\134\0\1\u06b8\61\0\1\u06b9\130\0\1\u022e\76\0"+
+    "\1\u06ba\170\0\1\u057b\120\0\1\u06bb\123\0\1\u06bc\100\0"+
+    "\1\u06bd\125\0\1\u0596\146\0\1\u04dc\34\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[140104];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\4\0\6\1\1\11\3\1\1\11\20\1\2\11\3\1"+
+    "\1\11\32\1\1\11\5\1\1\11\10\1\1\11\25\1"+
+    "\1\11\1\0\12\1\2\11\41\1\1\0\107\1\2\0"+
+    "\1\11\4\0\1\11\2\0\1\11\22\0\3\1\1\0"+
+    "\15\1\1\11\12\1\1\11\205\1\37\0\22\1\1\11"+
+    "\141\1\1\0\32\1\2\0\1\1\2\0\1\1\10\0"+
+    "\1\11\17\0\154\1\1\0\32\1\35\0\146\1\1\0"+
+    "\27\1\22\0\13\1\1\0\103\1\1\0\11\1\1\0"+
+    "\33\1\2\0\1\1\6\0\12\1\2\0\75\1\2\0"+
+    "\7\1\1\0\33\1\11\0\11\1\2\0\71\1\2\0"+
+    "\6\1\1\11\26\1\5\0\4\1\1\0\3\1\2\0"+
+    "\3\1\1\0\51\1\2\0\27\1\5\0\3\1\2\0"+
+    "\1\1\2\0\3\1\1\0\42\1\2\0\21\1\2\0"+
+    "\2\1\2\0\1\1\2\0\3\1\1\0\11\1\1\0"+
+    "\23\1\1\0\24\1\2\0\1\1\1\0\2\1\1\0"+
+    "\11\1\1\0\12\1\1\0\21\1\2\0\3\1\1\0"+
+    "\6\1\1\0\12\1\1\0\16\1\2\0\3\1\1\0"+
+    "\3\1\1\0\1\1\1\0\11\1\1\0\12\1\2\0"+
+    "\2\1\1\0\2\1\1\0\1\1\1\0\7\1\1\0"+
+    "\6\1\2\0\1\1\1\0\1\1\1\0\1\1\1\0"+
+    "\4\1\1\0\5\1\3\0\1\1\1\0\1\1\1\0"+
+    "\1\1\1\0\2\1\1\0\3\1\1\0\1\1\3\0"+
+    "\1\1\1\0\1\1\2\0\2\1\1\0\2\1\5\0"+
+    "\1\1\1\0\1\1\2\0\1\1\6\0\1\1\1\0"+
+    "\1\1\16\0\1\1\23\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[1725];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public JavaTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public JavaTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public JavaTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 192) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 38: break;
+        case 32: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 39: break;
+        case 13: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+          }
+        case 40: break;
+        case 18: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 41: break;
+        case 15: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 42: break;
+        case 4: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 43: break;
+        case 19: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 44: break;
+        case 10: 
+          { addToken(Token.ANNOTATION);
+          }
+        case 45: break;
+        case 30: 
+          { addToken(Token.FUNCTION);
+          }
+        case 46: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 47: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 48: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+          }
+        case 49: break;
+        case 26: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 50: break;
+        case 17: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 51: break;
+        case 21: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 52: break;
+        case 7: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 53: break;
+        case 24: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+          }
+        case 54: break;
+        case 29: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 55: break;
+        case 23: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 56: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 57: break;
+        case 25: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+          }
+        case 58: break;
+        case 28: 
+          { start = zzMarkedPos-3; yybegin(DOCCOMMENT);
+          }
+        case 59: break;
+        case 35: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+          }
+        case 60: break;
+        case 22: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 61: break;
+        case 33: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 62: break;
+        case 37: 
+          { addToken(Token.RESERVED_WORD_2);
+          }
+        case 63: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 64: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 65: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 66: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 67: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 68: break;
+        case 16: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 69: break;
+        case 36: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 70: break;
+        case 20: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 71: break;
+        case 31: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 72: break;
+        case 11: 
+          { 
+          }
+        case 73: break;
+        case 27: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 74: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 1726: break;
+            case DOCCOMMENT: {
+              yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+            }
+            case 1727: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 1728: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 1729: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex	(revision 25584)
@@ -0,0 +1,268 @@
+/*
+ * 04/24/2012
+ *
+ * LatexTokenMaker.java - Scanner for LaTeX.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the LaTeX.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RSTA always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LatexTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class LatexTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LatexTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * ${inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "%", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter					= ([A-Za-z])
+Digit					= ([0-9])
+LetterOrUnderscore		= ({Letter}|[_])
+AnyChar					= ({LetterOrUnderscore}|{Digit}|[\-])
+Whitespace				= ([ \t\f])
+LineCommentBegin		= "%"
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	([\\]{AnyChar}+)			{ addToken(Token.FUNCTION); }
+	[\{\}]						{ addToken(Token.SEPARATOR); }
+	("\\begin{"{AnyChar}+"}")   { int temp = zzStartRead;
+							addToken(temp, temp+5, Token.RESERVED_WORD);
+							addToken(temp+6, temp+6, Token.SEPARATOR);
+							addToken(temp+7, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+								}
+	("\\end{"{AnyChar}+"}")		{ int temp = zzStartRead;
+							addToken(temp, temp+3, Token.RESERVED_WORD);
+							addToken(temp+4, temp+4, Token.SEPARATOR);
+							addToken(temp+5, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+								}
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+
+	{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+	"\n" |
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as identifiers. */
+	{AnyChar}+ |
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n |
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java	(revision 25584)
@@ -0,0 +1,716 @@
+/* The following code was generated by JFlex 1.4.1 on 4/28/12 4:57 PM */
+
+/*
+ * 04/24/2012
+ *
+ * LatexTokenMaker.java - Scanner for LaTeX.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the LaTeX.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RSTA always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LatexTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class LatexTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 1;
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\3\1\32\1\0\1\3\23\0\1\3\1\5\1\0\1\5"+
+    "\1\7\1\4\7\5\1\2\1\22\1\6\12\1\1\20\1\5\1\0"+
+    "\1\5\1\0\2\5\32\1\1\5\1\23\1\5\1\0\1\2\1\0"+
+    "\1\1\1\25\1\1\1\31\1\17\1\14\1\26\1\10\1\15\2\1"+
+    "\1\16\1\1\1\27\1\1\1\12\2\1\1\13\1\11\2\1\1\21"+
+    "\3\1\1\30\1\0\1\24\1\5\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\2\0\2\1\1\2\1\3\1\1\1\4\1\5\4\6"+
+    "\1\7\3\10\4\0\2\10\4\0\2\10\2\0\1\11"+
+    "\1\0\1\10\3\0\1\10\1\12\2\0\1\13";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[42];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\33\0\66\0\121\0\66\0\66\0\154\0\66"+
+    "\0\66\0\207\0\242\0\275\0\330\0\66\0\363\0\u010e"+
+    "\0\u0129\0\u0144\0\u015f\0\u017a\0\u0195\0\u01b0\0\u01cb\0\u01e6"+
+    "\0\u0201\0\u021c\0\u0237\0\u0252\0\u026d\0\u0288\0\u02a3\0\u02be"+
+    "\0\u02d9\0\u02f4\0\u030f\0\u02be\0\u032a\0\u0345\0\66\0\u0360"+
+    "\0\u037b\0\66";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[42];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\3\2\4\1\5\1\6\3\3\10\4\1\3\1\4"+
+    "\1\3\1\7\1\10\3\4\1\10\1\4\1\11\10\12"+
+    "\1\13\3\12\1\14\4\12\1\15\10\12\1\16\34\0"+
+    "\2\4\5\0\10\4\1\0\1\4\3\0\3\4\1\0"+
+    "\1\4\2\0\2\17\5\0\7\17\1\20\1\0\1\17"+
+    "\3\0\1\21\2\17\1\0\1\17\1\0\10\12\1\0"+
+    "\3\12\1\0\4\12\1\0\10\12\12\0\1\22\32\0"+
+    "\1\23\3\0\1\24\36\0\1\25\12\0\2\17\5\0"+
+    "\10\17\1\0\1\17\3\0\3\17\1\0\1\17\2\0"+
+    "\2\17\5\0\10\17\1\0\1\17\3\0\2\17\1\26"+
+    "\1\0\1\17\2\0\2\17\5\0\7\17\1\27\1\0"+
+    "\1\17\3\0\3\17\1\0\1\17\12\0\1\30\33\0"+
+    "\1\31\36\0\1\32\35\0\1\33\12\0\2\17\5\0"+
+    "\10\17\1\0\1\17\3\0\3\17\1\0\1\34\2\0"+
+    "\2\17\5\0\10\17\1\0\1\17\3\0\1\17\1\35"+
+    "\1\17\1\0\1\17\13\0\1\36\40\0\1\37\31\0"+
+    "\1\31\35\0\1\40\11\0\2\17\5\0\10\17\1\0"+
+    "\1\17\3\0\3\17\1\41\1\17\2\0\2\17\5\0"+
+    "\5\17\1\42\2\17\1\0\1\17\3\0\3\17\1\0"+
+    "\1\17\14\0\1\31\4\0\1\37\20\0\1\43\25\0"+
+    "\1\40\1\44\1\0\2\44\12\40\1\44\1\40\1\44"+
+    "\2\0\3\40\1\0\1\40\2\0\2\45\5\0\10\45"+
+    "\1\0\1\45\3\0\3\45\1\0\1\45\2\0\2\17"+
+    "\5\0\10\17\1\0\1\17\3\0\2\17\1\46\1\0"+
+    "\1\17\7\0\1\40\25\0\2\45\5\0\10\45\1\0"+
+    "\1\45\2\0\1\47\3\45\1\0\1\45\2\0\2\17"+
+    "\5\0\10\17\1\0\1\17\3\0\3\17\1\50\1\17"+
+    "\2\0\2\51\5\0\10\51\1\0\1\51\3\0\3\51"+
+    "\1\0\1\51\2\0\2\51\5\0\10\51\1\0\1\51"+
+    "\2\0\1\52\3\51\1\0\1\51\1\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[918];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\2\0\1\11\1\1\2\11\1\1\2\11\4\1\1\11"+
+    "\3\1\4\0\2\1\4\0\2\1\2\0\1\1\1\0"+
+    "\1\1\3\0\1\1\1\11\2\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[42];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LatexTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * ${inheritDoc}
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "%", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public LatexTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public LatexTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 112) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 12: break;
+        case 8: 
+          { addToken(Token.FUNCTION);
+          }
+        case 13: break;
+        case 2: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 14: break;
+        case 9: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 15: break;
+        case 3: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 16: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 17: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 18: break;
+        case 10: 
+          { int temp = zzStartRead;
+							addToken(temp, temp+3, Token.RESERVED_WORD);
+							addToken(temp+4, temp+4, Token.SEPARATOR);
+							addToken(temp+5, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+          }
+        case 19: break;
+        case 11: 
+          { int temp = zzStartRead;
+							addToken(temp, temp+5, Token.RESERVED_WORD);
+							addToken(temp+6, temp+6, Token.SEPARATOR);
+							addToken(temp+7, zzMarkedPos-2, Token.RESERVED_WORD);
+							addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+          }
+        case 20: break;
+        case 6: 
+          { 
+          }
+        case 21: break;
+        case 4: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 22: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 43: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 44: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex	(revision 25584)
@@ -0,0 +1,432 @@
+/*
+ * 11/13/2004
+ *
+ * LispTokenMaker.java - Scanner for the Lisp programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lisp programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LispTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class LispTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LispTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { ";", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= [A-Za-z]
+LetterOrUnderscore				= ({Letter}|"_")
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+MLCBegin					= "#|"
+MLCEnd					= "|#"
+LineCommentBegin			= ";"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+Separator					= ([\(\)])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	"defclass" |
+	"defconstant" |
+	"defgeneric" |
+	"define-compiler-macro" |
+	"define-condition" |
+	"define-method-combination" |
+	"define-modify-macro" |
+	"define-setf-expander" |
+	"define-symbol-macro" |
+	"defmacro" |
+	"defmethod" |
+	"defpackage" |
+	"defparameter" |
+	"defsetf" |
+	"defstruct" |
+	"deftype" |
+	"defun" |
+	"defvar"						{ addToken(Token.RESERVED_WORD); }
+
+	"abort" |
+	"assert" |
+	"block" |
+	"break" |
+	"case" |
+	"catch" |
+	"ccase" |
+	"cerror" |
+	"cond" |
+	"ctypecase" |
+	"declaim" |
+	"declare" |
+	"do" |
+	"do*" |
+	"do-all-symbols" |
+	"do-external-symbols" |
+	"do-symbols" |
+	"dolist" |
+	"dotimes" |
+	"ecase" |
+	"error" |
+	"etypecase" |
+	"eval-when" |
+	"flet" |
+	"handler-bind" |
+	"handler-case" |
+	"if" |
+	"ignore-errors" |
+	"in-package" |
+	"labels" |
+	"lambda" |
+	"let" |
+	"let*" |
+	"locally" |
+	"loop" |
+	"macrolet" |
+	"multiple-value-bind" |
+	"proclaim" |
+	"prog" |
+	"prog*" |
+	"prog1" |
+	"prog2" |
+	"progn" |
+	"progv" |
+	"provide" |
+	"require" |
+	"restart-bind" |
+	"restart-case" |
+	"restart-name" |
+	"return" |
+	"return-from" |
+	"signal" |
+	"symbol-macrolet" |
+	"tagbody" |
+	"the" |
+	"throw" |
+	"typecase" |
+	"unless" |
+	"unwind-protect" |
+	"when" |
+	"with-accessors" |
+	"with-compilation-unit" |
+	"with-condition-restarts" |
+	"with-hash-table-iterator" |
+	"with-input-from-string" |
+	"with-open-file" |
+	"with-open-stream" |
+	"with-output-to-string" |
+	"with-package-iterator" |
+	"with-simple-restart" |
+	"with-slots" |
+	"with-standard-io-syntax"		{ addToken(Token.RESERVED_WORD); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+	[\"]							{ start = zzMarkedPos-1; yybegin(STRING); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}			{ start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<STRING> {
+	[^\n\\\"]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<MLC> {
+
+	[^hwf\n\|]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\|						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java	(revision 25584)
@@ -0,0 +1,1308 @@
+/* The following code was generated by JFlex 1.4.1 on 6/11/09 9:34 AM */
+
+/*
+ * 11/13/2004
+ *
+ * LispTokenMaker.java - Scanner for the Lisp programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lisp programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated LispTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class LispTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+  private static final int ZZ_BUFFERSIZE = 16384;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 3;
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\14\1\13\1\0\1\14\1\10\22\0\1\14\1\34\1\73"+
+    "\1\11\1\1\1\34\1\37\1\42\2\25\1\32\1\26\1\42\1\23"+
+    "\1\24\1\35\1\4\1\71\1\71\5\6\2\3\1\40\1\16\1\27"+
+    "\1\30\1\33\1\36\1\41\3\5\1\21\1\22\1\21\5\1\1\20"+
+    "\13\1\1\17\2\1\1\42\1\12\1\42\1\31\1\2\1\0\1\56"+
+    "\1\64\1\55\1\54\1\52\1\47\1\61\1\43\1\50\1\1\1\67"+
+    "\1\51\1\63\1\60\1\57\1\45\1\72\1\62\1\46\1\44\1\7"+
+    "\1\70\1\53\1\66\1\65\1\1\1\10\1\15\1\10\1\36\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\4\0\1\1\1\2\2\3\1\2\2\1\1\4\1\5"+
+    "\1\6\1\7\1\6\1\1\1\10\5\6\17\2\1\11"+
+    "\1\12\1\13\1\14\1\15\1\12\1\16\5\12\1\17"+
+    "\3\12\1\1\1\20\1\3\1\21\1\20\1\21\1\20"+
+    "\1\22\1\20\1\2\1\23\1\0\1\6\10\2\1\24"+
+    "\14\2\1\24\12\2\1\13\1\25\10\0\1\1\1\21"+
+    "\1\0\2\22\12\2\1\0\1\2\1\24\13\2\1\0"+
+    "\1\24\16\2\10\0\1\1\7\2\1\24\3\2\1\0"+
+    "\20\2\3\0\11\2\2\0\1\26\2\0\1\27\1\1"+
+    "\10\2\1\0\3\2\2\0\13\2\3\0\5\2\4\0"+
+    "\1\1\5\2\1\0\1\2\10\0\12\2\3\0\1\24"+
+    "\2\2\1\0\1\2\16\0\3\2\1\0\4\2\4\0"+
+    "\2\2\21\0\2\2\3\0\2\2\4\0\1\2\21\0"+
+    "\1\2\5\0\2\2\23\0\1\2\201\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[512];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\74\0\170\0\264\0\360\0\u012c\0\u0168\0\u01a4"+
+    "\0\u01e0\0\u021c\0\u0258\0\u021c\0\u0294\0\u02d0\0\u021c\0\u030c"+
+    "\0\u0348\0\u021c\0\u0384\0\u03c0\0\u03fc\0\u021c\0\u0438\0\u0474"+
+    "\0\u04b0\0\u04ec\0\u0528\0\u0564\0\u05a0\0\u05dc\0\u0618\0\u0654"+
+    "\0\u0690\0\u06cc\0\u0708\0\u0744\0\u0780\0\u07bc\0\u021c\0\u07f8"+
+    "\0\u0834\0\u021c\0\u021c\0\u0870\0\u021c\0\u08ac\0\u08e8\0\u0924"+
+    "\0\u0960\0\u099c\0\u021c\0\u09d8\0\u0a14\0\u0a50\0\u0a8c\0\u0ac8"+
+    "\0\u0ac8\0\u0ac8\0\u0b04\0\u0b40\0\u0b7c\0\u0bb8\0\u0bf4\0\u0c30"+
+    "\0\u021c\0\u02d0\0\u0c6c\0\u0ca8\0\u0ce4\0\u0d20\0\u0d5c\0\u0d98"+
+    "\0\u0dd4\0\u0e10\0\u0e4c\0\u012c\0\u0e88\0\u0ec4\0\u0f00\0\u0f3c"+
+    "\0\u0f78\0\u0fb4\0\u0ff0\0\u102c\0\u1068\0\u10a4\0\u10e0\0\u111c"+
+    "\0\u1158\0\u1194\0\u11d0\0\u120c\0\u1248\0\u1284\0\u12c0\0\u12fc"+
+    "\0\u1338\0\u1374\0\u13b0\0\u021c\0\u021c\0\u13ec\0\u1428\0\u1464"+
+    "\0\u14a0\0\u14dc\0\u1518\0\u1554\0\u1590\0\u15cc\0\u1608\0\u1644"+
+    "\0\u0ac8\0\u1680\0\u16bc\0\u16f8\0\u1734\0\u1770\0\u17ac\0\u17e8"+
+    "\0\u1824\0\u1860\0\u189c\0\u18d8\0\u1914\0\u1950\0\u198c\0\u19c8"+
+    "\0\u1a04\0\u1a40\0\u1a7c\0\u1ab8\0\u1af4\0\u1b30\0\u1b6c\0\u1ba8"+
+    "\0\u1be4\0\u1c20\0\u1c5c\0\u021c\0\u1c98\0\u1cd4\0\u1d10\0\u1d4c"+
+    "\0\u1d88\0\u1dc4\0\u1e00\0\u1e3c\0\u1e78\0\u1eb4\0\u1ef0\0\u1f2c"+
+    "\0\u1f68\0\u1fa4\0\u1fe0\0\u201c\0\u2058\0\u2094\0\u20d0\0\u210c"+
+    "\0\u2148\0\u2184\0\u21c0\0\u21fc\0\u2238\0\u2274\0\u22b0\0\u22ec"+
+    "\0\u2328\0\u2364\0\u23a0\0\u23dc\0\u2418\0\u2454\0\u2490\0\u24cc"+
+    "\0\u2508\0\u2544\0\u2580\0\u25bc\0\u25f8\0\u2634\0\u2670\0\u26ac"+
+    "\0\u26e8\0\u2724\0\u2760\0\u279c\0\u27d8\0\u2814\0\u2850\0\u288c"+
+    "\0\u28c8\0\u2904\0\u2940\0\u297c\0\u29b8\0\u29f4\0\u2a30\0\u2a6c"+
+    "\0\u2aa8\0\u2ae4\0\u2b20\0\u2b5c\0\u2b98\0\u2bd4\0\u2c10\0\u2c4c"+
+    "\0\u2c88\0\u2cc4\0\u2d00\0\u2d3c\0\u2d78\0\u2db4\0\u2df0\0\u2e2c"+
+    "\0\u2e68\0\u2ea4\0\u2ee0\0\u2f1c\0\u2f58\0\u2f94\0\u2fd0\0\u300c"+
+    "\0\u3048\0\u3084\0\u30c0\0\u30fc\0\u3138\0\u3174\0\u31b0\0\u31ec"+
+    "\0\u3228\0\u3264\0\u32a0\0\u32dc\0\u3318\0\u3354\0\u3390\0\u33cc"+
+    "\0\u3408\0\u3444\0\u3480\0\u34bc\0\u2bd4\0\u34f8\0\u2c88\0\u3534"+
+    "\0\u3570\0\u35ac\0\u35e8\0\u3624\0\u3660\0\u369c\0\u36d8\0\u3714"+
+    "\0\u3750\0\u378c\0\u37c8\0\u3804\0\u3840\0\u387c\0\u38b8\0\u38f4"+
+    "\0\u3930\0\u396c\0\u39a8\0\u39e4\0\u3a20\0\u3a5c\0\u3a98\0\u3ad4"+
+    "\0\u3b10\0\u3b4c\0\u3b88\0\u3bc4\0\u3c00\0\u3c3c\0\u3c78\0\u3cb4"+
+    "\0\u3cf0\0\u3d2c\0\u3d68\0\u3da4\0\u3de0\0\u3e1c\0\u3e58\0\u3e94"+
+    "\0\u3ed0\0\u3f0c\0\u3f48\0\u3f84\0\u3fc0\0\u3ffc\0\u4038\0\u4074"+
+    "\0\u40b0\0\u40ec\0\u4128\0\u4164\0\u41a0\0\u41dc\0\u4218\0\u4254"+
+    "\0\u4290\0\u42cc\0\u4308\0\u4344\0\u4380\0\u43bc\0\u43f8\0\u4434"+
+    "\0\u4470\0\u44ac\0\u44e8\0\u4524\0\u4560\0\u459c\0\u45d8\0\u4614"+
+    "\0\u4650\0\u468c\0\u46c8\0\u4704\0\u4740\0\u477c\0\u47b8\0\u47f4"+
+    "\0\u4830\0\u486c\0\u48a8\0\u48e4\0\u4920\0\u495c\0\u4998\0\u49d4"+
+    "\0\u4a10\0\u4a4c\0\u4a88\0\u4ac4\0\u4b00\0\u4b3c\0\u4b78\0\u4bb4"+
+    "\0\u4bf0\0\u4c2c\0\u4c68\0\u4ca4\0\u4ce0\0\u4d1c\0\u4d58\0\u4d94"+
+    "\0\u4dd0\0\u4e0c\0\u4e48\0\u4e84\0\u4ec0\0\u4efc\0\u4f38\0\u4f74"+
+    "\0\u4fb0\0\u4fec\0\u5028\0\u5064\0\u50a0\0\u50dc\0\u5118\0\u5154"+
+    "\0\u5190\0\u51cc\0\u5208\0\u5244\0\u5280\0\u52bc\0\u52f8\0\u5334"+
+    "\0\u5370\0\u53ac\0\u53e8\0\u5424\0\u5460\0\u549c\0\u54d8\0\u5514"+
+    "\0\u5550\0\u558c\0\u55c8\0\u5604\0\u5640\0\u567c\0\u56b8\0\u56f4"+
+    "\0\u5730\0\u576c\0\u57a8\0\u57e4\0\u5820\0\u585c\0\u5898\0\u58d4"+
+    "\0\u5910\0\u594c\0\u5988\0\u59c4\0\u5a00\0\u5a3c\0\u5a78\0\u5ab4"+
+    "\0\u5af0\0\u5b2c\0\u5b68\0\u5ba4\0\u5be0\0\u5c1c\0\u5c58\0\u5c94"+
+    "\0\u5cd0\0\u5d0c\0\u5d48\0\u5d84\0\u5dc0\0\u5dfc\0\u5e38\0\u5e74"+
+    "\0\u5eb0\0\u5eec\0\u5f28\0\u5f64\0\u5fa0\0\u5fdc\0\u6018\0\u6054"+
+    "\0\u6090\0\u60cc\0\u6108\0\u6144\0\u6180\0\u61bc\0\u61f8\0\u6234"+
+    "\0\u6270\0\u62ac\0\u62e8\0\u6324\0\u6360\0\u639c\0\u63d8\0\u6414"+
+    "\0\u6450\0\u648c\0\u64c8\0\u6504\0\u6540\0\u657c\0\u65b8\0\u65f4"+
+    "\0\u6630\0\u666c\0\u66a8\0\u66e4\0\u6720\0\u675c\0\u6798\0\u67d4"+
+    "\0\u6810\0\u684c\0\u6888\0\u68c4\0\u6900\0\u693c\0\u6978\0\u69b4"+
+    "\0\u69f0\0\u6a2c\0\u6a68\0\u6aa4\0\u6ae0\0\u6b1c\0\u6b58\0\u6b94"+
+    "\0\u6bd0\0\u6c0c\0\u6c48\0\u6c84\0\u6cc0\0\u6cfc\0\u6d38\0\u6d74"+
+    "\0\u6db0\0\u6dec\0\u6e28\0\u6e64\0\u6ea0\0\u6edc\0\u6f18\0\u6f54"+
+    "\0\u6f90\0\u6fcc\0\u7008\0\u7044\0\u7080\0\u70bc\0\u70f8\0\u7134"+
+    "\0\u7170\0\u71ac\0\u71e8\0\u7224\0\u7260\0\u729c\0\u72d8\0\u7314";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[512];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\5\2\6\1\7\1\10\1\6\1\7\1\11\1\12"+
+    "\1\13\1\5\1\14\1\15\1\16\1\17\4\6\1\20"+
+    "\1\21\1\22\1\23\1\24\3\16\1\25\2\16\1\26"+
+    "\1\27\1\26\1\5\1\12\1\30\1\31\1\32\1\33"+
+    "\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43"+
+    "\3\6\1\44\1\45\1\46\4\6\1\7\1\6\1\47"+
+    "\12\50\1\51\1\52\57\50\1\53\13\54\1\55\1\54"+
+    "\1\56\25\54\1\57\3\54\1\60\3\54\1\61\20\54"+
+    "\13\62\1\63\27\62\1\64\3\62\1\65\3\62\1\66"+
+    "\20\62\10\5\1\0\2\5\4\0\4\5\16\0\1\5"+
+    "\1\0\30\5\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\30\6\1\0\3\70"+
+    "\2\7\1\70\1\7\1\70\1\0\2\70\4\0\1\70"+
+    "\1\71\1\72\1\73\1\0\1\74\14\0\1\70\1\0"+
+    "\4\70\1\72\1\70\1\71\1\73\1\70\1\72\14\70"+
+    "\1\7\1\70\1\0\3\70\1\75\1\76\1\70\1\76"+
+    "\1\70\1\0\2\70\4\0\1\77\1\71\1\72\1\73"+
+    "\1\0\1\74\14\0\1\70\1\0\4\70\1\72\1\70"+
+    "\1\71\1\73\1\70\1\72\11\70\1\77\2\70\1\76"+
+    "\1\70\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\100\12\6\75\0"+
+    "\10\5\1\0\2\5\2\0\1\101\1\0\4\5\16\0"+
+    "\1\5\1\0\30\5\15\0\1\15\107\0\1\26\66\0"+
+    "\1\26\4\0\1\26\46\0\2\74\1\0\1\74\62\0"+
+    "\1\74\30\0\1\26\1\0\1\26\72\0\1\102\1\26"+
+    "\73\0\1\26\2\0\1\103\70\0\1\26\6\0\1\26"+
+    "\34\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\13\6\1\104\14\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\105\12\6\1\106\6\6\1\107\5\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\17\6\1\110\10\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\5\6\1\111\14\6\1\112\5\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\113\21\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\4\6\1\114"+
+    "\10\6\1\115\1\116\11\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\117\3\6\1\120\1\121\13\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\1\6\1\122\10\6\1\123\4\6\1\124\5\6\1\125"+
+    "\2\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\126\4\6\1\127\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\130\4\6\1\131\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\1\6\1\122\5\6\1\132\2\6"+
+    "\1\123\1\133\1\134\13\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\3\6"+
+    "\1\135\15\6\1\136\6\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\137\20\6\1\0\1\5\6\6\1\140\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\141"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\6\6\1\142\10\6\1\143"+
+    "\10\6\1\0\12\50\2\0\57\50\1\0\13\144\1\0"+
+    "\60\144\13\54\1\0\1\54\1\0\25\54\1\0\3\54"+
+    "\1\0\3\54\1\0\20\54\11\0\1\145\126\0\1\146"+
+    "\73\0\1\147\3\0\1\150\76\0\1\151\20\0\13\62"+
+    "\1\0\27\62\1\0\3\62\1\0\3\62\1\0\20\62"+
+    "\44\0\1\152\73\0\1\153\3\0\1\154\76\0\1\155"+
+    "\20\0\7\5\1\156\1\0\2\5\4\0\4\5\16\0"+
+    "\1\5\1\0\30\5\1\0\10\70\1\0\2\70\4\0"+
+    "\4\70\16\0\1\70\1\0\30\70\1\0\3\70\2\157"+
+    "\1\70\1\157\1\70\1\0\2\70\4\0\4\70\1\160"+
+    "\2\0\1\160\12\0\1\70\1\0\26\70\1\157\1\70"+
+    "\1\0\3\70\2\74\1\70\1\74\1\70\1\0\2\70"+
+    "\4\0\2\70\1\72\1\73\16\0\1\70\1\0\4\70"+
+    "\1\72\2\70\1\73\1\70\1\72\14\70\1\74\1\70"+
+    "\1\0\3\70\2\75\1\70\1\75\1\70\1\0\2\70"+
+    "\4\0\2\70\1\72\1\73\1\0\1\74\14\0\1\70"+
+    "\1\0\4\70\1\72\2\70\1\73\1\70\1\72\14\70"+
+    "\1\75\1\70\1\0\3\70\1\75\1\76\1\70\1\76"+
+    "\1\70\1\0\2\70\4\0\1\70\1\161\1\72\1\73"+
+    "\1\0\1\74\14\0\1\70\1\0\4\70\1\72\1\70"+
+    "\1\161\1\73\1\70\1\72\14\70\1\76\1\70\1\0"+
+    "\3\70\4\162\1\70\1\0\2\70\4\0\2\70\2\162"+
+    "\16\0\1\70\1\0\4\70\1\162\2\70\1\162\1\70"+
+    "\3\162\5\70\1\162\4\70\1\162\1\70\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\6\6\1\163\1\6\1\164\17\6\31\0\1\26"+
+    "\2\0\1\16\40\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\15\6\1\165\12\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\114\7\6\1\166\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\16\6\1\167\11\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\2\6\1\170\25\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\14\6"+
+    "\1\171\13\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\16\6\1\172\11\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\20\6\1\173\7\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\174\20\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\1\175\15\0\1\5\1\0"+
+    "\30\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\176\12\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\1\6\1\177\26\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\20\6\1\200\1\201\6\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+    "\1\202\1\6\1\203\13\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\22\6"+
+    "\1\107\5\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\13\6\1\204\14\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\17\6\1\205\10\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\13\6\1\206\14\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\207\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\1\6\1\210\26\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\4\6\1\211\5\6\1\212\15\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\213\6\0\1\214\6\0\1\5\1\0\1\6\1\215"+
+    "\4\6\1\216\21\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\124"+
+    "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\6\1\217\1\6\1\220"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\221\12\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\3\6\1\222\24\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\14\6\1\223\13\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\1\6\1\224"+
+    "\1\6\1\225\23\6\1\226\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\6\6"+
+    "\1\227\21\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\230\15\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\14\6\1\231\13\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\232\20\6\45\0\1\233\74\0\1\234"+
+    "\77\0\1\235\75\0\1\236\64\0\1\237\74\0\1\240"+
+    "\77\0\1\241\75\0\1\242\20\0\3\5\4\243\1\5"+
+    "\1\0\2\5\4\0\2\5\2\243\16\0\1\5\1\0"+
+    "\4\5\1\243\2\5\1\243\1\5\3\243\5\5\1\243"+
+    "\4\5\1\243\1\5\1\0\3\70\2\157\1\70\1\157"+
+    "\1\70\1\0\2\70\4\0\2\70\1\72\1\70\16\0"+
+    "\1\70\1\0\4\70\1\72\4\70\1\72\14\70\1\157"+
+    "\1\70\4\0\2\157\1\0\1\157\62\0\1\157\2\0"+
+    "\3\70\4\162\1\70\1\0\2\70\4\0\1\70\1\161"+
+    "\2\162\16\0\1\70\1\0\4\70\1\162\1\70\1\161"+
+    "\1\162\1\70\3\162\5\70\1\162\4\70\1\162\1\70"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\244\20\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\5\6\1\245\22\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\11\6"+
+    "\1\246\16\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\14\6\1\247\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\21\6\1\250\6\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\251\20\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+    "\1\252\3\6\1\253\6\6\1\254\2\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\15\6\1\255\12\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\21\6"+
+    "\1\256\6\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\1\6\1\114\26\6"+
+    "\46\0\1\257\26\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\14\6\1\260\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\7\0\1\214\6\0\1\5\1\0\30\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\21\6\1\261\6\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\262\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\13\6\1\263\14\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\2\6\1\114\25\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\3\6\1\220\24\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\14\6"+
+    "\1\264\13\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\6\6\1\265\21\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\15\6\1\114\12\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\266\27\6\1\0\1\5\6\6\1\207\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\1\6"+
+    "\1\267\1\270\1\271\1\6\1\272\4\6\1\273\3\6"+
+    "\1\274\1\6\1\275\4\6\1\276\2\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\6\6\1\277\21\6\47\0\1\300\3\0\1\301"+
+    "\3\0\1\302\15\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\303\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\5\6\1\304\22\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\12\6\1\305\15\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+    "\1\114\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\11\6\1\114\16\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\223\20\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\174\10\6\1\0\1\5\6\6\1\306"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\30\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\6\1\307\26\6\1\0"+
+    "\1\5\6\6\1\310\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\30\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\1\6"+
+    "\1\311\26\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\17\6\1\312\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\12\6\1\313\15\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\13\6\1\313\14\6\46\0\1\314\66\0\1\315"+
+    "\105\0\1\234\45\0\1\316\114\0\1\317\66\0\1\320"+
+    "\105\0\1\240\45\0\1\321\47\0\3\5\4\322\1\5"+
+    "\1\0\2\5\4\0\2\5\2\322\16\0\1\5\1\0"+
+    "\4\5\1\322\2\5\1\322\1\5\3\322\5\5\1\322"+
+    "\4\5\1\322\1\5\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\323"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\15\6\1\324\12\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\325\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\10\6\1\114\17\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\14\6\1\326"+
+    "\13\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\12\6\1\123\15\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\327\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\7\0\1\214\6\0"+
+    "\1\5\1\0\15\6\1\114\7\6\2\114\1\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\5\6\1\330\22\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\13\6\1\331\14\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\14\6\1\332"+
+    "\13\6\57\0\1\333\15\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\334"+
+    "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\11\6\1\335\16\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\323\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\336\21\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\114"+
+    "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\1\337\15\0\1\5\1\0\30\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\1\340\15\0"+
+    "\1\5\1\0\30\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\22\6\1\341"+
+    "\5\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\13\6\1\342\14\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\1\6\1\343\5\6\1\344\20\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\15\6\1\345\12\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\346\5\6\1\347\13\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\7\6\1\350\20\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\351"+
+    "\3\6\1\352\14\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\264"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\13\6\1\353\14\6\66\0"+
+    "\1\354\74\0\1\355\56\0\1\356\22\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\20\6\1\357\7\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\174"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\114\27\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\360\10\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\13\6"+
+    "\1\361\14\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\362\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\5\6\1\363\22\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\14\6\1\34\13\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\24\6"+
+    "\1\114\3\6\41\0\1\315\5\0\1\234\62\0\1\364"+
+    "\37\0\1\316\1\365\5\316\1\0\1\365\4\0\1\365"+
+    "\4\316\4\365\1\0\1\365\1\0\1\365\1\0\1\365"+
+    "\1\316\5\365\30\316\41\0\1\320\5\0\1\240\62\0"+
+    "\1\366\37\0\1\321\1\367\5\321\1\0\1\367\4\0"+
+    "\1\367\4\321\4\367\1\0\1\367\1\0\1\367\1\0"+
+    "\1\367\1\321\5\367\30\321\1\0\3\5\4\370\1\5"+
+    "\1\0\2\5\4\0\2\5\2\370\16\0\1\5\1\0"+
+    "\4\5\1\370\2\5\1\370\1\5\3\370\5\5\1\370"+
+    "\4\5\1\370\1\5\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\114"+
+    "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\11\6\1\371\16\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\7\6\1\372\20\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\11\6\1\373\16\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\374"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\11\6\1\220\16\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\6\6\1\114\21\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\6\6\1\375\21\6\56\0\1\376\16\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\7\6\1\377\20\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\114"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\6\6\1\373\21\6\54\0"+
+    "\1\u0100\63\0\1\u0101\1\0\1\u0102\1\u0103\1\0\1\u0104"+
+    "\4\0\1\u0105\1\u0106\1\u0107\14\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\2\6"+
+    "\1\220\25\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\u0108\4\6"+
+    "\1\u0109\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\17\6\1\u010a\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\1\6\1\u010b\26\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\7\6\1\u010c\20\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\13\6"+
+    "\1\244\14\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\15\6\1\u010d\12\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\15\6\1\u010e\12\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\6\1\u010f\26\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+    "\1\u0110\15\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\u0111\11\6"+
+    "\1\220\10\6\64\0\1\u0112\54\0\1\u0113\100\0\1\u0114"+
+    "\22\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\7\6\1\323\20\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\15\6\1\u0115\12\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\17\6"+
+    "\1\u0116\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\17\6\1\220\10\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\2\6\1\u0117\25\6\36\0\1\316"+
+    "\73\0\1\321\36\0\3\5\4\6\1\5\1\0\2\5"+
+    "\4\0\2\5\2\6\16\0\1\5\1\0\4\5\1\6"+
+    "\2\5\1\6\1\5\3\6\5\5\1\6\4\5\1\6"+
+    "\1\5\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\1\u0118\15\0\1\5\1\0\30\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\u0119\10\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\22\6"+
+    "\1\114\5\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\5\6\1\u0111\22\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\u011a\15\0\1\5\1\0\30\6\70\0\1\u011b\4\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\1\u011c"+
+    "\15\0\1\5\1\0\30\6\44\0\1\u011d\106\0\1\u011e"+
+    "\73\0\1\u011f\61\0\1\u0120\3\0\1\u0121\1\u0122\102\0"+
+    "\1\u0123\72\0\1\u0124\71\0\1\u0125\25\0\1\u0126\35\0"+
+    "\1\u0127\26\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\24\6\1\u0128\3\6\1\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\13\6\1\u0129\14\6\1\0\1\5\6\6"+
+    "\1\u012a\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\30\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\4\6\1\114\23\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\u012b\15\0\1\5\1\0\30\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\3\6\1\u012c\24\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u012d"+
+    "\20\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\1\u012e\27\6\1\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\17\6\1\u012f\10\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\20\6"+
+    "\1\114\7\6\65\0\1\u0130\61\0\1\u0131\44\0\1\u0132"+
+    "\50\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\1\u0133\15\0\1\5\1\0\30\6\1\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\1\6\1\u0134\26\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\6\6\1\u0135"+
+    "\21\6\46\0\1\u0136\26\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\1\u0137\15\0\1\5\1\0\30\6"+
+    "\64\0\1\u0138\66\0\1\u0139\67\0\1\u013a\73\0\1\u013b"+
+    "\67\0\1\u013c\102\0\1\u013d\74\0\1\u013e\100\0\1\u013f"+
+    "\67\0\1\u0140\61\0\1\u0141\106\0\1\u0142\2\0\1\u0143"+
+    "\65\0\1\u0144\62\0\1\u0145\101\0\1\u0146\21\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\13\6\1\u0147\14\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\20\6"+
+    "\1\u0148\7\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\174\15\6"+
+    "\47\0\1\u0149\6\0\1\u014a\5\0\1\u014b\10\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+    "\1\0\1\6\1\u014c\26\6\1\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\17\6"+
+    "\1\u014d\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\14\6\1\221\13\6"+
+    "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+    "\16\0\1\5\1\0\14\6\1\114\13\6\60\0\1\u014e"+
+    "\76\0\1\u014f\57\0\1\300\74\0\1\u0150\24\0\1\5"+
+    "\7\6\1\0\1\5\1\67\4\0\4\6\1\u0151\15\0"+
+    "\1\5\1\0\30\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u0152"+
+    "\20\6\63\0\1\u0153\66\0\1\u0154\6\0\1\u0155\65\0"+
+    "\1\u0156\76\0\1\u0157\74\0\1\u0158\71\0\1\214\56\0"+
+    "\1\u0159\117\0\1\u015a\64\0\1\u015b\60\0\1\u015c\72\0"+
+    "\1\u015d\36\0\1\u015e\140\0\1\u015f\64\0\1\u0160\100\0"+
+    "\1\u0161\66\0\1\u0162\106\0\1\u0163\13\0\1\5\7\6"+
+    "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+    "\16\6\1\220\11\6\1\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u0164"+
+    "\20\6\53\0\1\u0165\12\0\1\u0166\65\0\1\u0167\66\0"+
+    "\1\u0168\4\0\1\u0169\14\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\u016a"+
+    "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+    "\4\6\16\0\1\5\1\0\5\6\1\u016b\22\6\52\0"+
+    "\1\u015d\102\0\1\u016c\75\0\1\u016d\66\0\1\u0154\2\0"+
+    "\1\u016e\3\0\1\u0155\7\0\1\5\7\6\1\0\1\5"+
+    "\1\67\4\0\4\6\1\u016f\15\0\1\5\1\0\30\6"+
+    "\60\0\1\u0170\72\0\1\u0171\65\0\1\u0172\100\0\1\u0173"+
+    "\70\0\1\214\103\0\1\u0174\34\0\1\u0175\126\0\1\u0176"+
+    "\71\0\1\u0177\70\0\1\u0178\70\0\1\214\71\0\1\u0179"+
+    "\77\0\1\u017a\73\0\1\u017b\71\0\1\u017c\34\0\1\u017d"+
+    "\107\0\1\u017e\50\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\1\6\1\u017f\26\6"+
+    "\45\0\1\u0180\112\0\1\u0181\70\0\1\u0182\2\0\1\u0183"+
+    "\54\0\1\u0184\103\0\1\u0185\17\0\1\5\7\6\1\0"+
+    "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\15\6"+
+    "\1\174\12\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+    "\4\0\4\6\16\0\1\5\1\0\12\6\1\114\15\6"+
+    "\57\0\1\356\74\0\1\u0186\72\0\1\u0187\105\0\1\u0188"+
+    "\47\0\1\u0189\75\0\1\u0157\105\0\1\u018a\75\0\1\u018b"+
+    "\70\0\1\u018c\60\0\1\u018d\110\0\1\u018e\70\0\1\u018f"+
+    "\67\0\1\u0190\44\0\1\u0191\114\0\1\u0192\100\0\1\u0193"+
+    "\70\0\1\u0174\71\0\1\u0194\75\0\1\u0195\1\u0196\24\0"+
+    "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+    "\1\5\1\0\7\6\1\264\20\6\50\0\1\u0197\110\0"+
+    "\1\u0198\63\0\1\u0199\64\0\1\u019a\71\0\1\u019b\100\0"+
+    "\1\u019c\106\0\1\214\73\0\1\u0157\66\0\1\u019d\67\0"+
+    "\1\u019e\75\0\1\214\76\0\1\u019f\76\0\1\u015d\67\0"+
+    "\1\u01a0\67\0\1\u01a1\103\0\1\u01a2\34\0\1\u01a3\117\0"+
+    "\1\u01a4\74\0\1\u01a5\101\0\1\u01a6\40\0\1\u01a7\114\0"+
+    "\1\u01a8\77\0\1\u01a9\46\0\1\u01aa\127\0\1\u01ab\64\0"+
+    "\1\u01ac\73\0\1\u01ad\102\0\1\u01ae\63\0\1\u01af\75\0"+
+    "\1\u01b0\77\0\1\u01b1\67\0\1\u01b2\106\0\1\u01b3\32\0"+
+    "\1\u01b4\124\0\1\u01b5\101\0\1\u01b6\73\0\1\u01b7\70\0"+
+    "\1\u01b8\60\0\1\u01b9\73\0\1\u01ba\111\0\1\u01bb\62\0"+
+    "\1\u0157\74\0\1\u01bc\72\0\1\u01bd\66\0\1\u01be\100\0"+
+    "\1\u01bf\76\0\1\u01c0\104\0\1\u01bd\15\0\1\u01c1\130\0"+
+    "\1\214\101\0\1\u01b1\72\0\1\u018e\72\0\1\u01c2\46\0"+
+    "\1\u01c3\122\0\1\u01c4\100\0\1\u01c5\74\0\1\u01c6\63\0"+
+    "\1\u01c7\102\0\1\u01c8\66\0\1\u01c9\107\0\1\u01ca\30\0"+
+    "\1\u01cb\120\0\1\u01cc\75\0\1\u01cd\44\0\1\u01ce\122\0"+
+    "\1\u01cf\65\0\1\u01d0\77\0\1\u01d1\71\0\1\u01d2\110\0"+
+    "\1\u01c8\33\0\1\u01d3\127\0\1\u01d4\37\0\1\u01d5\126\0"+
+    "\1\u0186\62\0\1\u01d6\111\0\1\u01d7\67\0\1\u013b\76\0"+
+    "\1\u01bd\66\0\1\u01d8\41\0\1\u01d9\122\0\1\u01da\100\0"+
+    "\1\u01db\60\0\1\u01dc\111\0\1\u01dd\71\0\1\u01de\61\0"+
+    "\1\u01df\103\0\1\u01e0\73\0\1\u01e1\74\0\1\u01e2\100\0"+
+    "\1\u0155\71\0\1\u01e3\34\0\1\u01e4\126\0\1\u01e5\67\0"+
+    "\1\u01e6\44\0\1\u01e7\114\0\1\u01e8\107\0\1\u01e9\70\0"+
+    "\1\u01ea\101\0\1\u01eb\66\0\1\u01ec\63\0\1\u01ed\107\0"+
+    "\1\u01b1\57\0\1\u01ee\34\0\1\u01ef\146\0\1\u01f0\65\0"+
+    "\1\u01f1\101\0\1\u01f2\75\0\1\u01f3\53\0\1\u01f4\114\0"+
+    "\1\u01f5\52\0\1\u01f6\107\0\1\u01f7\63\0\1\u01f8\75\0"+
+    "\1\u01f9\100\0\1\214\64\0\1\u01fa\102\0\1\u01f9\74\0"+
+    "\1\u01fb\71\0\1\u01fc\65\0\1\u01b1\103\0\1\u01fd\75\0"+
+    "\1\214\71\0\1\u01fe\57\0\1\u01ff\111\0\1\u0140\72\0"+
+    "\1\214\70\0\1\u01ac\73\0\1\u0200\103\0\1\214\5\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[29520];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\4\0\5\1\1\11\1\1\1\11\2\1\1\11\2\1"+
+    "\1\11\3\1\1\11\20\1\1\11\2\1\2\11\1\1"+
+    "\1\11\5\1\1\11\15\1\1\11\1\0\41\1\2\11"+
+    "\10\0\2\1\1\0\14\1\1\0\15\1\1\0\1\11"+
+    "\16\1\10\0\14\1\1\0\20\1\3\0\11\1\2\0"+
+    "\1\1\2\0\12\1\1\0\3\1\2\0\13\1\3\0"+
+    "\5\1\4\0\6\1\1\0\1\1\10\0\12\1\3\0"+
+    "\3\1\1\0\1\1\16\0\3\1\1\0\4\1\4\0"+
+    "\2\1\21\0\2\1\3\0\2\1\4\0\1\1\21\0"+
+    "\1\1\5\0\2\1\23\0\1\1\201\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[512];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LispTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { ";", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public LispTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public LispTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 160) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 4: 
+          { addNullToken(); return firstToken;
+          }
+        case 24: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 25: break;
+        case 19: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 26: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 27: break;
+        case 18: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 28: break;
+        case 17: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 29: break;
+        case 20: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 30: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 31: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 32: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 33: break;
+        case 11: 
+          { /* Skip escaped chars. */
+          }
+        case 34: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 35: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 36: break;
+        case 23: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 37: break;
+        case 22: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 38: break;
+        case 16: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 39: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 40: break;
+        case 7: 
+          { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+          }
+        case 41: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 42: break;
+        case 6: 
+          { addToken(Token.OPERATOR);
+          }
+        case 43: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 44: break;
+        case 10: 
+          { 
+          }
+        case 45: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 46: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 513: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 514: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 515: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 516: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex	(revision 25584)
@@ -0,0 +1,373 @@
+/*
+ * 07/14/2006
+ *
+ * LuaTokenMaker.java - Scanner for the Lua programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lua programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>LuaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class LuaTokenMaker
+%extends AbstractJFlexTokenMaker
+%implements TokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LuaTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "--", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONGSTRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter					= [A-Za-z_]
+Digit					= [0-9]
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedCharLiteral			= ([\']([^\'\n]|"\\'")*)
+CharLiteral				= ({UnclosedCharLiteral}"'")
+UnclosedStringLiteral		= ([\"]([^\"\n]|"\\\"")*)
+StringLiteral				= ({UnclosedStringLiteral}[\"])
+LongStringBegin			= ("[[")
+LongStringEnd				= ("]]")
+
+LineCommentBegin			= ("--")
+MLCBegin					= ({LineCommentBegin}{LongStringBegin})
+
+Number					= ( "."? {Digit} ({Digit}|".")* ([eE][+-]?)? ({Letter}|{Digit})* )
+BooleanLiteral				= ("true"|"false")
+
+Separator					= ([\(\)\{\}\[\]\]])
+Separator2				= ([\;:,.])
+
+ArithmeticOperator			= ("+"|"-"|"*"|"/"|"^"|"%")
+RelationalOperator			= ("<"|">"|"<="|">="|"=="|"~=")
+LogicalOperator			= ("and"|"or"|"not"|"#")
+ConcatenationOperator		= ("..")
+Elipsis					= ({ConcatenationOperator}".")
+Operator					= ({ArithmeticOperator}|{RelationalOperator}|{LogicalOperator}|{ConcatenationOperator}|{Elipsis})
+
+Identifier				= ({Letter}({Letter}|{Digit})*)
+
+
+%state MLC
+%state LONGSTRING
+%state LINECOMMENT
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "break"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "do"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elseif"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "end"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "function"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "local"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "nil"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "repeat"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "then"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "until"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while"					{ addToken(Token.RESERVED_WORD); }
+
+/* Data types. */
+<YYINITIAL> "<number>"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<name>"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<string>"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<eof>"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "NULL"					{ addToken(Token.DATA_TYPE); }
+
+/* Functions. */
+<YYINITIAL> "_G"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "_VERSION"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "assert"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "collectgarbage"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "dofile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "error"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "getfenv"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "getmetatable"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "ipairs"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "load"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "loadfile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "loadstring"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "module"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "next"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "pairs"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "pcall"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "print"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "rawequal"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "rawget"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "rawset"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "require"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "select"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "setfenv"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "setmetatable"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "tonumber"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "tostring"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "type"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "unpack"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "xpcall"				{ addToken(Token.FUNCTION); }
+
+/* Booleans. */
+<YYINITIAL> {BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{LongStringBegin}				{ start = zzMarkedPos-2; yybegin(LONGSTRING); }
+
+	/* Comment literals. */
+	{MLCBegin}					{ start = zzMarkedPos-4; yybegin(MLC); }
+	{LineCommentBegin}				{ start = zzMarkedPos-2; yybegin(LINECOMMENT); }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Identifiers - Comes after Operators for "and", "not" and "or". */
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	/* Numbers */
+	{Number}						{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<MLC> {
+	[^\n\]]+					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{LongStringEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\]						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+
+<LONGSTRING> {
+	[^\n\]]+					{}
+	\n						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	{LongStringEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\]						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<LINECOMMENT> {
+	[^\n]+					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java	(revision 25584)
@@ -0,0 +1,967 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 07/14/2006
+ *
+ * LuaTokenMaker.java - Scanner for the Lua programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lua programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>LuaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class LuaTokenMaker extends AbstractJFlexTokenMaker implements TokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+  public static final int LONGSTRING = 2;
+  public static final int LINECOMMENT = 3;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\3\1\0\1\4\23\0\1\4\1\0\1\7\1\27"+
+    "\1\0\1\27\1\0\1\5\2\26\1\27\1\15\1\0\1\12\1\13"+
+    "\1\27\12\2\2\0\1\30\1\32\1\31\2\0\4\1\1\14\1\1"+
+    "\1\54\1\1\1\60\2\1\1\52\1\1\1\50\1\61\2\1\1\56"+
+    "\1\57\1\1\1\51\1\55\4\1\1\10\1\6\1\11\1\27\1\53"+
+    "\1\0\1\23\1\37\1\42\1\35\1\21\1\22\1\47\1\44\1\41"+
+    "\1\1\1\40\1\24\1\46\1\34\1\36\1\43\1\64\1\17\1\25"+
+    "\1\16\1\20\1\62\1\45\1\63\1\65\1\1\1\26\1\0\1\26"+
+    "\1\33\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\4\0\2\1\1\2\1\3\1\4\1\5\1\6\2\7"+
+    "\1\10\1\1\1\10\10\1\2\10\16\1\1\11\1\12"+
+    "\1\11\1\13\2\11\1\14\2\2\1\15\1\5\1\6"+
+    "\1\16\1\17\1\20\1\10\21\1\3\0\3\1\1\21"+
+    "\1\10\1\1\1\21\11\1\1\22\2\1\1\23\1\24"+
+    "\1\15\1\16\1\0\24\1\4\0\13\1\1\25\1\26"+
+    "\11\1\1\21\2\1\1\22\3\1\4\0\6\1\1\27"+
+    "\13\1\1\27\2\0\10\1\2\0\15\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[201];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\66\0\154\0\242\0\330\0\u010e\0\u0144\0\330"+
+    "\0\u017a\0\u01b0\0\u01e6\0\u021c\0\330\0\u0252\0\u0288\0\330"+
+    "\0\u02be\0\u02f4\0\u032a\0\u0360\0\u0396\0\u03cc\0\u0402\0\u0438"+
+    "\0\u046e\0\u04a4\0\u04a4\0\u04da\0\u0510\0\u0546\0\u057c\0\u05b2"+
+    "\0\u05e8\0\u061e\0\u0654\0\u068a\0\u06c0\0\u06f6\0\u072c\0\u0762"+
+    "\0\u0798\0\330\0\u07ce\0\330\0\u0804\0\u083a\0\330\0\u0870"+
+    "\0\u08a6\0\330\0\u08dc\0\u0912\0\330\0\330\0\u0948\0\u097e"+
+    "\0\u09b4\0\u09ea\0\u0a20\0\u0a56\0\u0a8c\0\u0ac2\0\u0af8\0\u0b2e"+
+    "\0\u0b64\0\u0b9a\0\u0bd0\0\u0c06\0\u0c3c\0\u0c72\0\u0ca8\0\u0cde"+
+    "\0\u0d14\0\u0d4a\0\u0d80\0\u0db6\0\u0dec\0\u0e22\0\u0e58\0\u0e8e"+
+    "\0\u010e\0\u0ec4\0\u010e\0\u0efa\0\u0f30\0\u0f66\0\u0f9c\0\u0fd2"+
+    "\0\u1008\0\u103e\0\u1074\0\u10aa\0\u010e\0\u10e0\0\u1116\0\330"+
+    "\0\330\0\u01b0\0\u01e6\0\u114c\0\u1182\0\u11b8\0\u11ee\0\u1224"+
+    "\0\u125a\0\u1290\0\u12c6\0\u12fc\0\u1332\0\u1368\0\u139e\0\u13d4"+
+    "\0\u140a\0\u1440\0\u1476\0\u14ac\0\u14e2\0\u1518\0\u154e\0\u1584"+
+    "\0\u15ba\0\u15f0\0\u1626\0\u165c\0\u1692\0\u16c8\0\u16fe\0\u1734"+
+    "\0\u176a\0\u17a0\0\u17d6\0\u180c\0\u1842\0\u1878\0\u18ae\0\330"+
+    "\0\u010e\0\u18e4\0\u191a\0\u1950\0\u1986\0\u19bc\0\u19f2\0\u1a28"+
+    "\0\u1a5e\0\u1a94\0\u1aca\0\u1b00\0\u1b36\0\u1b6c\0\u1ba2\0\u1bd8"+
+    "\0\u1c0e\0\u1c44\0\u1c7a\0\u1cb0\0\u1ce6\0\u1d1c\0\u1d52\0\u1d88"+
+    "\0\u1dbe\0\u1df4\0\u1e2a\0\u010e\0\u1e60\0\u1e96\0\u1ecc\0\u1f02"+
+    "\0\u1f38\0\u1f6e\0\u1fa4\0\u1fda\0\u2010\0\u2046\0\u207c\0\330"+
+    "\0\u20b2\0\u20e8\0\u211e\0\u2154\0\u218a\0\u21c0\0\u21f6\0\u222c"+
+    "\0\u2262\0\u2298\0\u22ce\0\u2304\0\u233a\0\u2370\0\u23a6\0\u23dc"+
+    "\0\u2412\0\u2448\0\u247e\0\u24b4\0\u24ea\0\u2520\0\u2556\0\u258c"+
+    "\0\u25c2";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[201];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\5\1\6\1\7\1\10\1\11\1\12\1\5\1\13"+
+    "\1\14\1\15\1\16\1\17\1\6\1\20\1\21\1\22"+
+    "\1\23\1\24\1\25\1\26\1\27\1\30\1\15\1\20"+
+    "\1\31\1\32\2\33\1\34\1\35\1\36\1\37\1\6"+
+    "\1\40\1\41\1\42\1\6\1\43\1\44\1\45\1\46"+
+    "\2\6\1\47\7\6\1\50\2\6\3\51\1\52\5\51"+
+    "\1\53\57\51\1\54\5\51\1\55\54\51\3\56\1\57"+
+    "\62\56\67\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\32\6\1\0\1\60\1\7\10\0\1\7\1\61\1\0"+
+    "\3\60\1\61\4\60\6\0\32\60\4\0\1\11\61\0"+
+    "\3\12\1\0\1\12\1\62\1\63\57\12\3\13\1\0"+
+    "\2\13\1\64\1\65\56\13\10\0\1\66\67\0\1\67"+
+    "\55\0\1\7\10\0\1\70\53\0\2\6\11\0\1\6"+
+    "\1\0\1\6\1\71\6\6\6\0\2\6\1\72\5\6"+
+    "\1\73\20\6\1\74\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\75\1\6\1\76\2\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\10\6\6\0\1\77\31\6"+
+    "\1\0\2\6\11\0\1\6\1\0\1\6\1\100\4\6"+
+    "\1\101\1\6\6\0\1\102\31\6\1\0\2\6\11\0"+
+    "\1\6\1\0\2\6\1\103\2\6\1\104\2\6\6\0"+
+    "\2\6\1\105\27\6\1\0\2\6\11\0\1\6\1\0"+
+    "\7\6\1\106\6\0\1\107\31\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\2\6\1\110\27\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\111\4\6\6\0"+
+    "\32\6\21\0\1\112\3\0\1\113\4\0\1\20\1\0"+
+    "\1\114\63\0\1\20\34\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\115\4\6\6\0\2\6\1\116\2\6\1\117"+
+    "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\2\6\1\120\27\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\6\1\121\6\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\6\1\122\6\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0"+
+    "\7\6\1\124\22\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\2\6\1\125\27\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\6\1\126\3\6\1\127\2\6\6\0"+
+    "\6\6\1\130\23\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\10\6\1\131\21\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\2\6\1\132\27\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\133\4\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\15\6\1\134\14\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\20\6\1\135\1\136\10\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\7\6\1\137\22\6"+
+    "\3\51\1\0\5\51\1\0\54\51\11\0\1\140\65\0"+
+    "\1\141\54\0\3\56\1\0\62\56\1\0\2\60\11\0"+
+    "\1\60\1\0\10\60\6\0\32\60\1\0\2\60\7\0"+
+    "\1\60\1\0\12\60\6\0\32\60\3\12\1\0\1\12"+
+    "\1\142\1\63\57\12\3\13\1\0\2\13\1\64\1\143"+
+    "\56\13\10\0\1\144\70\0\1\20\53\0\2\6\11\0"+
+    "\1\6\1\0\2\6\1\145\5\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\7\6\1\146\6\0\1\147"+
+    "\31\6\1\0\2\6\11\0\1\6\1\0\3\6\1\150"+
+    "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\7\6\1\151\22\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\152\7\6\6\0\7\6\1\153\20\6"+
+    "\1\154\1\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\11\6\1\155\20\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\156\7\6\6\0\7\6\1\157\22\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\160\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\161"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\1\6\1\123\30\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\1\162\31\6\1\0\2\6\11\0"+
+    "\1\6\1\0\6\6\1\163\1\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\123\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\164"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\1\6\1\121\30\6\1\0\2\6\11\0\1\6"+
+    "\1\0\5\6\1\165\2\6\6\0\6\6\1\166\23\6"+
+    "\1\0\2\6\11\0\1\6\1\0\1\167\5\6\1\170"+
+    "\1\6\6\0\32\6\36\0\1\171\45\0\1\172\67\0"+
+    "\1\173\2\0\1\174\43\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\27\6\1\175\2\6\1\0\2\6\11\0"+
+    "\1\6\1\0\1\121\7\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\6\6\1\123\1\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\4\6\1\176\3\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\3\6"+
+    "\1\177\4\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\5\6\1\127\2\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\6\6\1\200\1\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\5\6"+
+    "\1\201\24\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\5\6\1\202\24\6\1\0\2\6\11\0\1\6"+
+    "\1\0\5\6\1\203\2\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\5\6\1\204\24\6"+
+    "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\1\6"+
+    "\1\205\30\6\1\0\2\6\11\0\1\6\1\0\1\167"+
+    "\7\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\16\6\1\206\13\6\1\0\2\6\11\0"+
+    "\1\207\1\0\10\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\6\6\1\130\23\6\10\0"+
+    "\1\210\56\0\2\6\11\0\1\6\1\0\3\6\1\211"+
+    "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\212\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\2\6\1\213\5\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\1\123\31\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\135\4\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\214"+
+    "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\215\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\2\6\1\216\5\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\217\3\6\1\220"+
+    "\6\0\13\6\1\220\16\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\5\6\1\117\24\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\221\2\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\2\6"+
+    "\1\222\27\6\1\0\2\6\11\0\1\6\1\0\3\6"+
+    "\1\223\4\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\6\6\1\224\23\6\1\0\2\6"+
+    "\11\0\1\6\1\0\7\6\1\145\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\3\6\1\225\4\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\1\6\1\226\30\6\1\0\2\6\11\0\1\6\1\0"+
+    "\5\6\1\117\2\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\4\6\1\227\3\6\6\0\12\6\1\230"+
+    "\17\6\1\0\2\6\11\0\1\6\1\0\3\6\1\231"+
+    "\4\6\6\0\32\6\22\0\1\232\62\0\1\233\114\0"+
+    "\1\234\65\0\1\235\20\0\2\6\11\0\1\6\1\0"+
+    "\1\135\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\5\6\1\236\24\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\237\2\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\6\6\1\240\1\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\1\175\31\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\6\1\241\6\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\6\6\1\242\1\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\6\6\1\243\1\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\236"+
+    "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\16\6\1\244\13\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\22\6\1\245\7\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\246\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\12\6\1\247\17\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\6\1\150\6\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\5\6\1\250\2\6\6\0\32\6\1\0"+
+    "\2\6\11\0\1\6\1\0\10\6\6\0\5\6\1\251"+
+    "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\30\6\1\252\1\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\175\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\6\6\1\253\23\6\1\0"+
+    "\2\6\11\0\1\6\1\0\1\6\1\135\6\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\5\6\1\254\24\6\1\0\2\6\11\0\1\6\1\0"+
+    "\1\255\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\6\1\175\6\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\4\6\1\176\2\6\1\146\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\3\6\1\256"+
+    "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\257\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\6\6\1\175\23\6\31\0"+
+    "\1\260\75\0\1\261\63\0\1\262\47\0\1\232\45\0"+
+    "\2\6\11\0\1\6\1\0\6\6\1\151\1\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\4\6\1\123\25\6\1\0\2\6\11\0\1\6\1\0"+
+    "\3\6\1\263\4\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\7\6\1\135\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\6\6\1\135\1\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\3\6\1\123\4\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\23\6\1\264\6\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\5\6\1\265\24\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\3\6\1\266\26\6"+
+    "\1\0\2\6\11\0\1\6\1\0\1\123\7\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\1\6\1\151"+
+    "\6\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+    "\2\6\1\267\5\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\4\6\1\135\25\6\1\0"+
+    "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0"+
+    "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\5\6\1\270\24\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\1\271\31\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\272\7\6\6\0\32\6\34\0\1\273\52\0"+
+    "\1\274\45\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+    "\6\6\1\275\23\6\1\0\2\6\11\0\1\6\1\0"+
+    "\10\6\6\0\24\6\1\276\5\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\1\277\31\6\1\0\2\6"+
+    "\11\0\1\6\1\0\3\6\1\222\4\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\5\6\1\242\2\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\2\6\1\150\27\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\26\6\1\135\3\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\300\2\6\6\0\32\6"+
+    "\47\0\1\232\35\0\1\232\47\0\2\6\11\0\1\6"+
+    "\1\0\1\301\7\6\6\0\32\6\1\0\2\6\11\0"+
+    "\1\6\1\0\10\6\6\0\25\6\1\302\4\6\1\0"+
+    "\2\6\11\0\1\6\1\0\10\6\6\0\13\6\1\135"+
+    "\16\6\1\0\2\6\11\0\1\6\1\0\1\303\7\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\13\6\1\304\16\6\1\0\2\6\11\0\1\6"+
+    "\1\0\10\6\6\0\14\6\1\135\15\6\1\0\2\6"+
+    "\11\0\1\6\1\0\5\6\1\305\2\6\6\0\32\6"+
+    "\1\0\2\6\11\0\1\6\1\0\5\6\1\306\2\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\3\6\1\236\26\6\1\0\2\6\11\0\1\6"+
+    "\1\0\1\6\1\307\6\6\6\0\32\6\1\0\2\6"+
+    "\11\0\1\6\1\0\10\6\6\0\3\6\1\310\26\6"+
+    "\1\0\2\6\11\0\1\6\1\0\5\6\1\311\2\6"+
+    "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+    "\6\0\13\6\1\151\16\6";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[9720];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\4\0\1\11\2\1\1\11\4\1\1\11\2\1\1\11"+
+    "\31\1\1\11\1\1\1\11\2\1\1\11\2\1\1\11"+
+    "\2\1\2\11\23\1\3\0\23\1\2\11\2\1\1\0"+
+    "\24\1\4\0\13\1\1\11\21\1\4\0\22\1\1\11"+
+    "\2\0\10\1\2\0\15\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[201];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public LuaTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "--", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONGSTRING;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public LuaTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public LuaTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 164) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 24: break;
+        case 13: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 25: break;
+        case 15: 
+          { start = zzMarkedPos-2; yybegin(LONGSTRING);
+          }
+        case 26: break;
+        case 19: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 27: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 28: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 29: break;
+        case 17: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 30: break;
+        case 21: 
+          { start = zzMarkedPos-4; yybegin(MLC);
+          }
+        case 31: break;
+        case 7: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 32: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 33: break;
+        case 18: 
+          { addToken(Token.FUNCTION);
+          }
+        case 34: break;
+        case 5: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 35: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 36: break;
+        case 23: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 37: break;
+        case 22: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 38: break;
+        case 20: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 39: break;
+        case 14: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 40: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 41: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken;
+          }
+        case 42: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 43: break;
+        case 16: 
+          { start = zzMarkedPos-2; yybegin(LINECOMMENT);
+          }
+        case 44: break;
+        case 9: 
+          { 
+          }
+        case 45: break;
+        case 10: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 46: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 202: break;
+            case LONGSTRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 203: break;
+            case LINECOMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken;
+            }
+            case 204: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 205: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex	(revision 25584)
@@ -0,0 +1,336 @@
+/*
+ * 09/20/2008
+ *
+ * MakefileTokenMaker.java - Scanner for makefiles.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import java.util.Stack;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for makefiles.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated MakefileTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class MakefileTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	private Stack varDepths;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MakefileTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(Token.NULL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter					= [A-Za-z]
+Digit					= [0-9]
+IdentifierStart			= ({Letter}|[_\.])
+IdentifierPart			= ({IdentifierStart}|{Digit})
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+Label					= ({Identifier}":")
+
+CurlyVarStart			= ("${")
+ParenVarStart			= ("$(")
+
+LineTerminator			= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedCharLiteral		= ([\']([^\'\n]|"\\'")*)
+CharLiteral				= ({UnclosedCharLiteral}"'")
+UnclosedStringLiteral	= ([\"]([^\"\n]|"\\\"")*)
+StringLiteral			= ({UnclosedStringLiteral}[\"])
+UnclosedBacktickLiteral	= ([\`]([^\`\n]|"\\`")*)
+BacktickLiteral			= ({UnclosedBacktickLiteral}"`")
+
+LineCommentBegin		= "#"
+
+IntegerLiteral			= ({Digit}+)
+
+Operator				= ([\:\+\?]?"=")
+
+
+%state VAR
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"addprefix" |
+	"addsuffix" |
+	"basename" |
+	"dir" |
+	"filter" |
+	"filter-out" |
+	"findstring" |
+	"firstword" |
+	"foreach" |
+	"join" |
+	"notdir" |
+	"origin" |
+	"pathsubst" |
+	"shell" |
+	"sort" |
+	"strip" |
+	"suffix" |
+	"wildcard" |
+	"word" |
+	"words" |
+	"ifeq" |
+	"ifneq" |
+	"else" |
+	"endif" |
+	"define" |
+	"endef" |
+	"ifdef" |
+	"ifndef"					{ addToken(Token.RESERVED_WORD); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Label}							{ addToken(Token.PREPROCESSOR); }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{StringLiteral}					{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{BacktickLiteral}				{ addToken(Token.LITERAL_BACKQUOTE); }
+	{BacktickLiteral}				{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+	/* Variables. */
+	{CurlyVarStart}					{ if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.TRUE); start = zzMarkedPos-2; yybegin(VAR); }
+	{ParenVarStart}					{ if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.FALSE); start = zzMarkedPos-2; yybegin(VAR); }
+
+	/* Comment literals. */
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch-all for anything else. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<VAR> {
+	[^\}\)\$\#]+		{}
+	"}"					{
+							if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+						}
+	")"					{
+							if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+						}
+	"${"				{ varDepths.push(Boolean.TRUE); }
+	"$("				{ varDepths.push(Boolean.FALSE); }
+	"$"					{}
+	"#".*				{ int temp1 = zzStartRead; int temp2 = zzMarkedPos; addToken(start,zzStartRead-1, Token.VARIABLE); addToken(temp1, temp2-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.VARIABLE); addNullToken(); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java	(revision 25584)
@@ -0,0 +1,863 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 09/20/2008
+ *
+ * MakefileTokenMaker.java - Scanner for makefiles.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import java.util.Stack;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for makefiles.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated MakefileTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class MakefileTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int VAR = 1;
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\10\1\7\1\0\1\10\23\0\1\10\1\0\1\13\1\15"+
+    "\1\4\2\0\1\11\1\6\1\47\1\0\1\16\1\0\1\37\1\1"+
+    "\1\0\12\2\1\3\2\0\1\17\1\0\1\16\1\0\32\1\1\0"+
+    "\1\12\2\0\1\1\1\14\1\20\1\32\1\43\1\21\1\24\1\25"+
+    "\1\41\1\44\1\26\1\45\1\1\1\35\1\34\1\33\1\40\1\22"+
+    "\1\46\1\23\1\30\1\36\1\31\1\1\1\42\1\27\2\1\1\5"+
+    "\1\0\1\50\uff82\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\2\0\2\1\1\2\2\1\1\3\1\4\1\5\1\6"+
+    "\1\1\1\7\1\10\14\1\2\11\1\12\1\13\1\14"+
+    "\1\15\1\16\1\17\1\20\1\5\1\6\1\21\2\0"+
+    "\1\22\23\1\1\23\1\24\1\20\1\21\1\22\2\1"+
+    "\1\25\43\1\1\25\14\1\1\25\5\1\1\0\2\1"+
+    "\1\0\1\1\1\0\1\25";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[129];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\51\0\122\0\173\0\244\0\315\0\366\0\122"+
+    "\0\u011f\0\u0148\0\u0171\0\u019a\0\u01c3\0\122\0\u01ec\0\u0215"+
+    "\0\u023e\0\u0267\0\u0290\0\u02b9\0\u02e2\0\u030b\0\u0334\0\u035d"+
+    "\0\u0386\0\u03af\0\u03d8\0\u0401\0\u042a\0\122\0\122\0\122"+
+    "\0\122\0\122\0\122\0\u0453\0\u047c\0\122\0\u019a\0\u04a5"+
+    "\0\122\0\u04ce\0\u04f7\0\u0520\0\u0549\0\u0572\0\u059b\0\u05c4"+
+    "\0\u05ed\0\u0616\0\u063f\0\u0668\0\u0691\0\u06ba\0\u06e3\0\u070c"+
+    "\0\u0735\0\u075e\0\u0787\0\u07b0\0\122\0\122\0\u0148\0\u0171"+
+    "\0\u019a\0\u07d9\0\u0802\0\173\0\u082b\0\u0854\0\u087d\0\u08a6"+
+    "\0\u08cf\0\u08f8\0\u0921\0\u094a\0\u0973\0\u099c\0\u09c5\0\u09ee"+
+    "\0\u0a17\0\u0a40\0\u0a69\0\u0a92\0\u0abb\0\u0ae4\0\u0b0d\0\u0b36"+
+    "\0\u0b5f\0\u0b88\0\u0bb1\0\u0bda\0\u0c03\0\u0c2c\0\u0c55\0\u0c7e"+
+    "\0\u0ca7\0\u0cd0\0\u0cf9\0\u0d22\0\u0d4b\0\u0d74\0\u0d9d\0\u0dc6"+
+    "\0\u0def\0\u0e18\0\u0e41\0\u0e6a\0\u0e93\0\u0ebc\0\u0ee5\0\u0f0e"+
+    "\0\u0f37\0\u0f60\0\u0f89\0\u0fb2\0\u0fdb\0\u1004\0\u102d\0\u1056"+
+    "\0\u107f\0\u10a8\0\u10d1\0\u10fa\0\u1123\0\u114c\0\u1175\0\u119e"+
+    "\0\122";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[129];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\3\1\4\1\5\1\6\1\7\2\3\1\10\1\11"+
+    "\1\12\1\3\1\13\1\14\1\15\1\6\1\16\1\17"+
+    "\1\20\1\21\1\4\1\22\1\23\1\24\1\4\1\25"+
+    "\1\4\1\26\1\27\3\4\1\3\1\30\1\4\1\31"+
+    "\2\4\1\32\1\4\2\3\4\33\1\34\10\33\1\35"+
+    "\31\33\1\36\1\37\52\0\2\4\1\40\14\0\17\4"+
+    "\1\0\7\4\4\0\1\5\65\0\1\16\36\0\1\41"+
+    "\1\42\52\0\1\11\40\0\7\12\1\0\1\12\1\43"+
+    "\1\44\36\12\7\13\1\0\2\13\1\45\1\46\35\13"+
+    "\7\47\1\0\2\47\1\50\1\47\1\51\34\47\7\15"+
+    "\1\0\41\15\1\0\2\4\1\40\14\0\1\4\1\52"+
+    "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\4\4"+
+    "\1\53\1\4\1\54\10\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\1\55\16\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\13\4\1\56\1\4\1\57\1\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\6\4\1\60\10\4"+
+    "\1\0\1\61\6\4\3\0\2\4\1\40\14\0\5\4"+
+    "\1\62\11\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\11\4\1\63\4\4\1\64\1\0\1\65\3\4\1\66"+
+    "\2\4\3\0\2\4\1\40\14\0\1\67\16\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\1\70"+
+    "\6\4\3\0\2\4\1\40\14\0\3\4\1\71\13\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\6\4\1\72"+
+    "\10\4\1\0\1\73\6\4\3\0\2\4\1\40\14\0"+
+    "\17\4\1\0\1\74\6\4\2\0\4\33\1\0\10\33"+
+    "\1\0\31\33\7\0\1\75\1\76\42\0\7\35\1\0"+
+    "\41\35\7\12\1\0\1\12\1\77\1\44\36\12\7\13"+
+    "\1\0\2\13\1\45\1\100\35\13\7\47\1\0\2\47"+
+    "\1\50\1\47\1\101\34\47\1\0\2\4\1\40\14\0"+
+    "\1\4\1\102\15\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\5\4\1\103\11\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\104\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\16\4\1\105\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\1\4\1\106\15\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\10\4\1\107\6\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\3\4\1\110\7\4"+
+    "\1\111\1\4\1\112\1\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\113\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\1\4\1\114\2\4\1\115\6\4"+
+    "\1\116\3\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\5\4\1\117\11\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\3\4\1\120\13\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\121\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\4\4\1\122\12\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\10\4\1\123\6\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\16\4\1\124\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\6\4\1\125\10\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\15\4\1\126"+
+    "\1\4\1\0\7\4\3\0\2\4\1\40\14\0\3\4"+
+    "\1\127\13\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\6\4\1\130\10\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\2\4\1\131\5\4\1\132\6\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\6\4\1\133\10\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\4\4"+
+    "\1\134\2\4\3\0\2\4\1\40\14\0\4\4\1\135"+
+    "\1\4\1\135\10\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\4\4\1\104\12\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\10\4\1\136\6\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\1\4\1\137\15\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\16\4\1\140\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\4\4\1\141\12\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\4\4\1\135\12\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+    "\6\4\1\104\3\0\2\4\1\40\14\0\1\4\1\114"+
+    "\2\4\1\115\12\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\5\4\1\142\11\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\6\4\1\143\10\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\16\4\1\104\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\15\4\1\144\1\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\4\4\1\145\12\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\1\4\1\146\15\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+    "\1\4\1\74\5\4\3\0\2\4\1\40\14\0\1\4"+
+    "\1\147\15\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\1\4\1\150\15\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\13\4\1\104\3\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\3\4\1\151\13\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\11\4\1\63\5\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\13\4\1\107\3\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\10\4\1\152\6\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\5\4\1\104"+
+    "\11\4\1\0\7\4\3\0\2\4\1\40\14\0\16\4"+
+    "\1\153\1\0\7\4\3\0\2\4\1\40\14\0\10\4"+
+    "\1\154\6\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\4\4\1\155\12\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\1\156\16\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\6\4\1\157\10\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\2\4\1\104\14\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\15\4\1\104\1\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\13\4\1\160\3\4\1\0"+
+    "\7\4\3\0\2\4\1\40\14\0\6\4\1\54\10\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+    "\3\4\1\161\3\4\3\0\2\4\1\40\14\0\10\4"+
+    "\1\104\6\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\4\4\1\117\12\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\11\4\1\162\5\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\17\4\1\0\2\4\1\163\4\4\3\0"+
+    "\2\4\1\40\14\0\16\4\1\164\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\3\4\1\165\13\4\1\0\7\4"+
+    "\3\0\2\4\1\40\14\0\17\4\1\0\3\4\1\166"+
+    "\3\4\3\0\2\4\1\40\14\0\7\4\1\104\7\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\1\167\16\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\1\170\16\4"+
+    "\1\0\7\4\3\0\2\4\1\40\14\0\12\4\1\171"+
+    "\4\4\1\0\7\4\3\0\2\4\1\40\14\0\17\4"+
+    "\1\0\1\170\6\4\3\0\2\4\1\40\14\0\3\4"+
+    "\1\172\13\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+    "\17\4\1\173\7\4\3\0\2\4\1\40\14\0\17\4"+
+    "\1\0\4\4\1\104\2\4\3\0\2\4\1\40\14\0"+
+    "\14\4\1\107\2\4\1\0\7\4\3\0\2\4\1\40"+
+    "\14\0\3\4\1\174\13\4\1\0\7\4\3\0\2\4"+
+    "\1\40\14\0\10\4\1\121\6\4\1\0\7\4\3\0"+
+    "\2\4\1\40\14\0\6\4\1\175\10\4\1\0\7\4"+
+    "\42\0\1\176\11\0\2\4\1\40\14\0\1\4\1\104"+
+    "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\13\4"+
+    "\1\177\3\4\1\0\7\4\33\0\1\200\20\0\2\4"+
+    "\1\40\14\0\17\4\1\0\1\4\1\104\5\4\40\0"+
+    "\1\201\12\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[4551];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\2\0\1\11\4\1\1\11\5\1\1\11\17\1\6\11"+
+    "\2\1\1\11\2\0\1\11\23\1\2\11\74\1\1\0"+
+    "\2\1\1\0\1\1\1\0\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[129];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	private Stack varDepths;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MakefileTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(Token.NULL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public MakefileTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public MakefileTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 126) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 13: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 22: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 23: break;
+        case 16: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 24: break;
+        case 15: 
+          { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.FALSE); start = zzMarkedPos-2; yybegin(VAR);
+          }
+        case 25: break;
+        case 12: 
+          { if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+          }
+        case 26: break;
+        case 11: 
+          { if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) {
+								varDepths.pop();
+								if (varDepths.empty()) {
+									addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+								}
+							}
+          }
+        case 27: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 28: break;
+        case 21: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 29: break;
+        case 20: 
+          { varDepths.push(Boolean.FALSE);
+          }
+        case 30: break;
+        case 18: 
+          { addToken(Token.LITERAL_BACKQUOTE);
+          }
+        case 31: break;
+        case 19: 
+          { varDepths.push(Boolean.TRUE);
+          }
+        case 32: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 33: break;
+        case 5: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 34: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 35: break;
+        case 10: 
+          { int temp1 = zzStartRead; int temp2 = zzMarkedPos; addToken(start,zzStartRead-1, Token.VARIABLE); addToken(temp1, temp2-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 36: break;
+        case 17: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 37: break;
+        case 14: 
+          { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.TRUE); start = zzMarkedPos-2; yybegin(VAR);
+          }
+        case 38: break;
+        case 7: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 39: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 40: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 41: break;
+        case 9: 
+          { 
+          }
+        case 42: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case VAR: {
+              addToken(start,zzStartRead-1, Token.VARIABLE); addNullToken(); return firstToken;
+            }
+            case 130: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 131: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex	(revision 25584)
@@ -0,0 +1,809 @@
+/*
+ * 01/21/2011
+ *
+ * MxmlTokenMaker.java - Generates tokens for MXML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for MXML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>MXMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class MxmlTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed XML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG						= -3;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed Script tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT				= -4;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a double-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT	= -5;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a single-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT	= -6;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an ActionScript code block (text content inside a
+	 * Script tag).
+	 */
+	public static final int INTERNAL_IN_AS						= -7;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an MLC in an ActionScript code block (text content
+	 * inside a Script tag).
+	 */
+	public static final int INTERNAL_IN_AS_MLC					= -8;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MxmlTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.FUNCTION:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS:
+				state = AS;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS_MLC:
+				state = AS_MLC;
+				start = text.offset;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+/* XML macros (and some building-block macros used by AS macros). */
+Letter				= [A-Za-z]
+NonzeroDigit		= [1-9]
+Digit				= ("0"|{NonzeroDigit})
+LetterOrUnderscore	= ({Letter}|"_")
+NameStartChar		= ({Letter}|[\:])
+NameChar			= ({NameStartChar}|[\-\.]|{Digit})
+TagName				= ({NameStartChar}{NameChar}*)
+Whitespace			= ([ \t\f])
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+AmperItem				= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'=\/>]+)
+CDataBegin			= ("<![CDATA[")
+CDataEnd				= ("]]>")
+
+
+/* ActionScript macros. */
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+AnyCharacterButApostropheOrBackSlash	= ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash	= ([^\\\"\n])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape							= ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({LetterOrUnderscore}|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+AS_CharLiteral				= ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
+AS_UnclosedCharLiteral		= ([\']([\\].|[^\\\'])*[^\']?)
+AS_ErrorCharLiteral			= ({AS_UnclosedCharLiteral}[\'])
+AS_StringLiteral			= ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+AS_UnclosedStringLiteral	= ([\"]([\\].|[^\\\"])*[^\"]?)
+AS_ErrorStringLiteral		= ({AS_UnclosedStringLiteral}[\"])
+
+AS_MLCBegin					= ("/*")
+AS_MLCEnd					= ("*/")
+AS_LineCommentBegin			= ("//")
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+AS_IntegerLiteral			= ({IntegerHelper1}[lL]?)
+AS_HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+AS_FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+AS_ErrorNumberFormat		= (({AS_IntegerLiteral}|{AS_HexLiteral}|{AS_FloatLiteral}){NonSeparator}+)
+AS_BooleanLiteral			= ("true"|"false")
+
+AS_Separator				= ([\(\)\{\}\[\]])
+AS_Separator2				= ([\;,.])
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+AS_Operator					= ({NonAssignmentOperator}|{AssignmentOperator})
+
+AS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+AS_ErrorIdentifier			= ({NonSeparator}+)
+AS_EndScriptTag				= ("</"({NameStartChar}{NameChar}*":")?"Script"{Whitespace}*">")
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state CDATA
+
+%state AS
+%state AS_MLC
+%state AS_EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	{CDataBegin}					{ addToken(Token.DATA_TYPE); start = zzMarkedPos; yybegin(CDATA); }
+	"<!"							{ start = zzMarkedPos-2; yybegin(DTD); }
+	"<?"							{ start = zzMarkedPos-2; yybegin(PI); }
+	"<"{TagName}				{
+									int count = yylength();
+									String tag = yytext(); // Get before addToken calls
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									if (tag.endsWith(":Script") || tag.equals("<Script")) {
+										yybegin(INTAG_SCRIPT);
+									}
+									else {
+										yybegin(INTAG);
+									}
+								}
+	"</"{TagName}				{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{AmperItem}					{ addToken(Token.DATA_TYPE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	<<EOF>>						{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^\n\-]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	"-->"						{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); }
+	"-"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+	"?>"							{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+	"?"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.FUNCTION); return firstToken; }
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.FUNCTION); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.FUNCTION); return firstToken; }
+}
+
+<INTAG> {
+	{InTagIdentifier}				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	"="							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"							{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{InTagIdentifier}				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	"="							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"							{ yybegin(AS); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<CDATA> {
+	[^\]]+						{}
+	{CDataEnd}					{ int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.DATA_TYPE); }
+	"]"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken; }
+}
+
+<AS> {
+
+	{AS_EndScriptTag}			{
+								  int origStart = zzStartRead;
+								  String text = yytext();
+								  int tagNameEnd = text.length() - 2; // "-1" is '>'
+								  while (Character.isWhitespace(text.charAt(tagNameEnd))) {
+								      tagNameEnd--;
+								  }
+								  int tagNameLen = tagNameEnd - 1;
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(origStart+2,origStart+2+tagNameLen-1, Token.MARKUP_TAG_NAME);
+								  if (tagNameEnd<text.length()-2) {
+								      addToken(origStart+tagNameEnd+1, zzMarkedPos-2, Token.WHITESPACE);
+								  }
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	/* ActionScript snippets are usually wrapped in CDATA. */
+	{CDataBegin} |
+	{CDataEnd}					{ addToken(Token.DATA_TYPE); }
+	
+	/* Keywords */
+	"add" |
+	"and" |
+	"break" |
+	"case" |
+	"catch" |
+	"class" |
+	"const" |
+	"continue" |
+	"default" |
+	"delete" |
+	"do" |
+	"dynamic" |
+	"else" |
+	"eq" |
+	"extends" |
+	"final" |
+	"finally" |
+	"for" |
+	"for each" |
+	"function" |
+	"ge" |
+	"get" |
+	"gt" |
+	"if" |
+	"ifFrameLoaded" |
+	"implements" |
+	"import" |
+	"in" |
+	"include" |
+	"interface" |
+	"internal" |
+	"label" |
+	"le" |
+	"lt" |
+	"namespace" |
+	"native" |
+	"ne" |
+	"new" |
+	"not" |
+	"on" |
+	"onClipEvent" |
+	"or" |
+	"override" |
+	"package" |
+	"private" |
+	"protected" |
+	"public" |
+	"return" |
+	"set" |
+	"static" |
+	"super" |
+	"switch" |
+	"tellTarget" |
+	"this" |
+	"throw" |
+	"try" |
+	"typeof" |
+	"use" |
+	"var" |
+	"void" |
+	"while" |
+	"with" |
+
+	"null" |
+	"undefined"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Built-in objects (good idea not to use these names!) */
+	"Array" |
+	"Boolean" |
+	"Color" |
+	"Date" |
+	"Function" |
+	"int" |
+	"Key" |
+	"MovieClip" |
+	"Math" |
+	"Mouse" |
+	"Null" |
+	"Number" |
+	"Object" |
+	"Selection" |
+	"Sound" |
+	"String" |
+	"uint" |
+	"Vector" |
+	"void" |
+	"XML" |
+	"XMLNode" |
+	"XMLSocket"			{ addToken(Token.DATA_TYPE); }
+
+	/* Global functions */
+	"call" |
+	"escape" |
+	"eval" |
+	"fscommand" |
+	"getProperty" |
+	"getTimer" |
+	"getURL" |
+	"getVersion" |
+	"gotoAndPlay" |
+	"gotoAndStop" |
+	"#include" |
+	"int" |
+	"isFinite" |
+	"isNaN" |
+	"loadMovie" |
+	"loadMovieNum" |
+	"loadVariables" |
+	"loadVariablesNum" |
+	"maxscroll" |
+	"newline" |
+	"nextFrame" |
+	"nextScene" |
+	"Number" |
+	"parseFloat" |
+	"parseInt" |
+	"play" |
+	"prevFrame" |
+	"prevScene" |
+	"print" |
+	"printAsBitmap" |
+	"printAsBitmapNum" |
+	"printNum" |
+	"random" |
+	"removeMovieClip" |
+	"scroll" |
+	"setProperty" |
+	"startDrag" |
+	"stop" |
+	"stopAllSounds" |
+	"stopDrag" |
+	"String" |
+	"targetPath" |
+	"tellTarget" |
+	"toggleHighQuality" |
+	"trace" |
+	"unescape" |
+	"unloadMovie" |
+	"unloadMovieNum" |
+	"updateAfterEvent"			{ addToken(Token.FUNCTION); }
+
+	/* Booleans. */
+	{AS_BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+	{AS_Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{AS_CharLiteral}					{ addToken(Token.LITERAL_CHAR); }
+	{AS_UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{AS_ErrorCharLiteral}				{ addToken(Token.ERROR_CHAR); }
+	{AS_StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{AS_UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{AS_ErrorStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{AS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(AS_MLC); }
+	{AS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(AS_EOL_COMMENT); }
+
+	/* Separators. */
+	{AS_Separator}					{ addToken(Token.SEPARATOR); }
+	{AS_Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{AS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{AS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{AS_HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{AS_FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{AS_ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{AS_ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<AS_MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
+	{AS_MLCEnd}				{ yybegin(AS); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
+
+}
+
+
+<AS_EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java	(revision 25584)
@@ -0,0 +1,2696 @@
+/* The following code was generated by JFlex 1.4.1 on 1/25/12 9:19 AM */
+
+/*
+ * 01/21/2011
+ *
+ * MxmlTokenMaker.java - Generates tokens for MXML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for MXML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>MXMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class MxmlTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int AS_EOL_COMMENT = 13;
+  public static final int AS_MLC = 12;
+  public static final int INTAG_SCRIPT = 7;
+  public static final int INATTR_DOUBLE_SCRIPT = 8;
+  public static final int CDATA = 10;
+  public static final int INATTR_SINGLE_SCRIPT = 9;
+  public static final int DTD = 3;
+  public static final int INATTR_SINGLE = 6;
+  public static final int INATTR_DOUBLE = 5;
+  public static final int YYINITIAL = 0;
+  public static final int AS = 11;
+  public static final int INTAG = 4;
+  public static final int COMMENT = 1;
+  public static final int PI = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\12\1\10\1\0\1\7\1\36\22\0\1\105\1\16\1\32"+
+    "\1\37\1\40\1\63\1\13\1\31\2\73\1\42\1\51\1\61\1\50"+
+    "\1\6\1\41\1\3\3\27\4\27\2\2\1\5\1\14\1\11\1\15"+
+    "\1\25\1\64\1\72\1\22\1\26\1\20\1\21\1\47\1\45\1\1"+
+    "\1\122\1\121\1\1\1\110\1\44\1\111\1\112\1\113\1\116\1\123"+
+    "\1\120\1\66\1\23\1\117\1\115\1\1\1\43\2\1\1\17\1\30"+
+    "\1\24\1\62\1\4\1\0\1\55\1\35\1\67\1\76\1\54\1\46"+
+    "\1\106\1\74\1\70\1\114\1\77\1\56\1\102\1\34\1\100\1\71"+
+    "\1\103\1\53\1\57\1\52\1\33\1\107\1\75\1\104\1\101\1\1"+
+    "\1\60\1\62\1\60\1\65\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\5\0\2\1\1\0\2\1\4\0\2\2\1\3\1\4"+
+    "\1\5\1\6\1\1\1\7\2\1\1\10\2\1\1\11"+
+    "\1\12\2\13\1\14\1\15\1\16\1\17\1\20\1\1"+
+    "\1\21\1\1\1\22\1\23\1\24\1\25\2\1\1\26"+
+    "\1\2\2\27\1\2\1\30\2\14\1\2\1\14\1\31"+
+    "\3\2\1\31\1\14\1\2\1\32\1\33\3\2\2\26"+
+    "\1\14\3\2\2\14\25\2\1\1\1\34\5\1\1\35"+
+    "\3\1\1\36\1\37\1\4\1\40\1\6\1\0\1\41"+
+    "\1\0\1\26\1\42\2\43\1\27\2\42\1\44\1\42"+
+    "\3\0\3\2\1\0\1\14\1\2\1\32\1\45\2\33"+
+    "\1\46\5\2\1\47\3\2\1\26\1\50\1\51\21\2"+
+    "\1\47\20\2\2\47\12\2\1\47\2\2\1\47\11\2"+
+    "\1\52\12\0\1\53\1\54\1\55\1\26\1\43\1\0"+
+    "\2\44\3\0\4\2\2\32\1\33\1\56\1\33\6\2"+
+    "\1\47\4\2\1\26\1\0\1\6\5\2\1\47\23\2"+
+    "\1\47\10\2\1\6\24\2\1\47\1\2\1\6\7\2"+
+    "\11\0\1\57\1\26\3\0\2\2\1\32\1\60\1\32"+
+    "\1\33\10\2\1\26\1\61\6\2\1\0\1\62\13\2"+
+    "\1\63\3\2\1\63\36\2\2\0\1\64\2\0\1\65"+
+    "\1\0\1\26\2\0\1\2\1\32\1\33\7\2\1\26"+
+    "\5\2\1\47\1\0\26\2\1\63\13\2\5\0\1\26"+
+    "\2\0\1\2\1\32\1\33\6\2\1\26\5\2\1\0"+
+    "\30\2\3\0\4\2\1\26\2\2\1\0\23\2\3\0"+
+    "\1\2\1\63\1\2\1\47\21\2\1\66\1\0\1\67"+
+    "\4\2\1\63\40\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[607];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\124\0\250\0\374\0\u0150\0\u01a4\0\u01f8\0\u024c"+
+    "\0\u02a0\0\u02f4\0\u0348\0\u039c\0\u03f0\0\u0444\0\u0498\0\u04ec"+
+    "\0\u0540\0\u0594\0\u05e8\0\u063c\0\u0690\0\u0540\0\u06e4\0\u0738"+
+    "\0\u0540\0\u078c\0\u07e0\0\u0540\0\u0540\0\u0834\0\u0888\0\u0540"+
+    "\0\u0540\0\u0540\0\u0540\0\u08dc\0\u0930\0\u0540\0\u0984\0\u0540"+
+    "\0\u0540\0\u0540\0\u0540\0\u09d8\0\u0a2c\0\u0a80\0\u0ad4\0\u0b28"+
+    "\0\u0b7c\0\u0bd0\0\u0540\0\u0c24\0\u0c78\0\u0540\0\u0ccc\0\u0540"+
+    "\0\u0d20\0\u0d74\0\u0dc8\0\u0e1c\0\u0e70\0\u0ec4\0\u0f18\0\u0f6c"+
+    "\0\u0fc0\0\u1014\0\u1068\0\u0540\0\u10bc\0\u1110\0\u1164\0\u11b8"+
+    "\0\u120c\0\u1260\0\u12b4\0\u1308\0\u135c\0\u13b0\0\u1404\0\u1458"+
+    "\0\u14ac\0\u1500\0\u1554\0\u15a8\0\u15fc\0\u1650\0\u16a4\0\u16f8"+
+    "\0\u174c\0\u17a0\0\u17f4\0\u1848\0\u189c\0\u18f0\0\u1944\0\u1998"+
+    "\0\u19ec\0\u0540\0\u1a40\0\u1a94\0\u1ae8\0\u1b3c\0\u1b90\0\u0540"+
+    "\0\u1be4\0\u1c38\0\u1c8c\0\u1ce0\0\u1d34\0\u1d88\0\u0540\0\u0540"+
+    "\0\u1ddc\0\u0540\0\u1e30\0\u1e84\0\u1ed8\0\u1f2c\0\u1ed8\0\u1ed8"+
+    "\0\u1f80\0\u1fd4\0\u2028\0\u207c\0\u0ccc\0\u20d0\0\u2124\0\u2178"+
+    "\0\u21cc\0\u2220\0\u2274\0\u22c8\0\u231c\0\u2370\0\u0540\0\u23c4"+
+    "\0\u2418\0\u0540\0\u246c\0\u24c0\0\u2514\0\u2568\0\u25bc\0\u2610"+
+    "\0\u2664\0\u26b8\0\u270c\0\u2760\0\u0540\0\u27b4\0\u2808\0\u285c"+
+    "\0\u28b0\0\u2904\0\u2958\0\u29ac\0\u2a00\0\u2a54\0\u2aa8\0\u2afc"+
+    "\0\u2b50\0\u2ba4\0\u2bf8\0\u2c4c\0\u2ca0\0\u2cf4\0\u2d48\0\u0ad4"+
+    "\0\u2d9c\0\u2df0\0\u2e44\0\u2e98\0\u2eec\0\u2f40\0\u2f94\0\u2fe8"+
+    "\0\u303c\0\u3090\0\u30e4\0\u3138\0\u318c\0\u31e0\0\u3234\0\u3288"+
+    "\0\u32dc\0\u3330\0\u3384\0\u33d8\0\u342c\0\u3480\0\u34d4\0\u3528"+
+    "\0\u357c\0\u35d0\0\u3624\0\u3678\0\u36cc\0\u3720\0\u3774\0\u37c8"+
+    "\0\u381c\0\u3870\0\u38c4\0\u3918\0\u396c\0\u39c0\0\u3a14\0\u3a68"+
+    "\0\u3abc\0\u0540\0\u3b10\0\u3b64\0\u3bb8\0\u3c0c\0\u3c60\0\u3cb4"+
+    "\0\u3d08\0\u3d5c\0\u3db0\0\u3e04\0\u3e58\0\u0540\0\u0540\0\u3eac"+
+    "\0\u3f00\0\u3f54\0\u1ed8\0\u3fa8\0\u3ffc\0\u4050\0\u40a4\0\u40f8"+
+    "\0\u414c\0\u41a0\0\u41f4\0\u4248\0\u429c\0\u42f0\0\u0540\0\u4344"+
+    "\0\u4398\0\u43ec\0\u4440\0\u4494\0\u44e8\0\u453c\0\u4590\0\u45e4"+
+    "\0\u4638\0\u468c\0\u46e0\0\u4734\0\u4788\0\u47dc\0\u4830\0\u4884"+
+    "\0\u48d8\0\u492c\0\u4980\0\u49d4\0\u4a28\0\u4a7c\0\u4ad0\0\u4b24"+
+    "\0\u4b78\0\u4bcc\0\u4c20\0\u4c74\0\u4cc8\0\u4d1c\0\u4d70\0\u4dc4"+
+    "\0\u4e18\0\u4e6c\0\u4ec0\0\u4f14\0\u4f68\0\u4fbc\0\u5010\0\u5064"+
+    "\0\u50b8\0\u510c\0\u5160\0\u51b4\0\u5208\0\u525c\0\u52b0\0\u5304"+
+    "\0\u5358\0\u53ac\0\u5400\0\u5454\0\u54a8\0\u54fc\0\u5550\0\u55a4"+
+    "\0\u55f8\0\u564c\0\u56a0\0\u56f4\0\u5748\0\u579c\0\u57f0\0\u5844"+
+    "\0\u5898\0\u58ec\0\u5940\0\u5994\0\u59e8\0\u5a3c\0\u5a90\0\u0ad4"+
+    "\0\u5ae4\0\u5b38\0\u5b8c\0\u5be0\0\u5c34\0\u5c88\0\u5cdc\0\u5d30"+
+    "\0\u5d84\0\u5dd8\0\u5e2c\0\u5e80\0\u5ed4\0\u5f28\0\u5f7c\0\u5fd0"+
+    "\0\u0540\0\u6024\0\u6078\0\u60cc\0\u6120\0\u6174\0\u61c8\0\u621c"+
+    "\0\u0540\0\u6270\0\u62c4\0\u6318\0\u636c\0\u63c0\0\u6414\0\u6468"+
+    "\0\u64bc\0\u6510\0\u6564\0\u65b8\0\u0540\0\u660c\0\u6660\0\u66b4"+
+    "\0\u6708\0\u675c\0\u67b0\0\u6804\0\u0ad4\0\u6858\0\u68ac\0\u6900"+
+    "\0\u6954\0\u69a8\0\u69fc\0\u6a50\0\u6aa4\0\u6af8\0\u6b4c\0\u6ba0"+
+    "\0\u0ad4\0\u6bf4\0\u6c48\0\u6c9c\0\u6cf0\0\u6d44\0\u6d98\0\u6dec"+
+    "\0\u6e40\0\u6e94\0\u6ee8\0\u6f3c\0\u6f90\0\u6fe4\0\u7038\0\u708c"+
+    "\0\u70e0\0\u7134\0\u7188\0\u71dc\0\u7230\0\u7284\0\u72d8\0\u732c"+
+    "\0\u7380\0\u73d4\0\u7428\0\u747c\0\u74d0\0\u7524\0\u7578\0\u75cc"+
+    "\0\u7620\0\u7674\0\u76c8\0\u771c\0\u7770\0\u77c4\0\u7818\0\u786c"+
+    "\0\u78c0\0\u7914\0\u7968\0\u79bc\0\u7a10\0\u7a64\0\u7ab8\0\u7b0c"+
+    "\0\u7b60\0\u7bb4\0\u7c08\0\u7c5c\0\u7cb0\0\u7d04\0\u7d58\0\u7dac"+
+    "\0\u7e00\0\u7e54\0\u7ea8\0\u7efc\0\u7f50\0\u7fa4\0\u7ff8\0\u804c"+
+    "\0\u80a0\0\u80f4\0\u8148\0\u819c\0\u81f0\0\u8244\0\u8298\0\u82ec"+
+    "\0\u8340\0\u8394\0\u83e8\0\u843c\0\u8490\0\u84e4\0\u8538\0\u858c"+
+    "\0\u85e0\0\u8634\0\u8688\0\u86dc\0\u8730\0\u8784\0\u87d8\0\u882c"+
+    "\0\u8880\0\u88d4\0\u8928\0\u897c\0\u89d0\0\u8a24\0\u8a78\0\u8acc"+
+    "\0\u8b20\0\u8b74\0\u77c4\0\u8bc8\0\u78c0\0\u8c1c\0\u8c70\0\u8cc4"+
+    "\0\u8d18\0\u8d6c\0\u8dc0\0\u8e14\0\u8e68\0\u8ebc\0\u8f10\0\u8f64"+
+    "\0\u8fb8\0\u900c\0\u9060\0\u90b4\0\u9108\0\u915c\0\u91b0\0\u9204"+
+    "\0\u9258\0\u92ac\0\u9300\0\u9354\0\u93a8\0\u93fc\0\u9450\0\u94a4"+
+    "\0\u94f8\0\u954c\0\u95a0\0\u95f4\0\u9648\0\u969c\0\u96f0\0\u9744"+
+    "\0\u9798\0\u97ec\0\u9840\0\u9894\0\u98e8\0\u993c\0\u9990\0\u99e4"+
+    "\0\u9a38\0\u9a8c\0\u9ae0\0\u9b34\0\u9b88\0\u9bdc\0\u9c30\0\u9c84"+
+    "\0\u9cd8\0\u9d2c\0\u9d80\0\u9dd4\0\u9e28\0\u9e7c\0\u9ed0\0\u9f24"+
+    "\0\u9f78\0\u9fcc\0\ua020\0\ua074\0\ua0c8\0\ua11c\0\ua170\0\ua1c4"+
+    "\0\ua218\0\ua26c\0\ua2c0\0\ua314\0\ua368\0\ua3bc\0\ua410\0\ua464"+
+    "\0\ua4b8\0\ua50c\0\ua560\0\u0a80\0\ua5b4\0\u0540\0\ua608\0\ua65c"+
+    "\0\ua6b0\0\ua704\0\ua758\0\ua7ac\0\ua800\0\ua854\0\ua8a8\0\ua8fc"+
+    "\0\ua950\0\ua9a4\0\ua9f8\0\uaa4c\0\uaaa0\0\uaaf4\0\uab48\0\u0540"+
+    "\0\uab9c\0\u0540\0\uabf0\0\uac44\0\uac98\0\uacec\0\uad40\0\uad94"+
+    "\0\uade8\0\uae3c\0\uae90\0\uaee4\0\uaf38\0\uaf8c\0\uafe0\0\ub034"+
+    "\0\ub088\0\ub0dc\0\ub130\0\ub184\0\ub1d8\0\ub22c\0\ub280\0\ub2d4"+
+    "\0\ub328\0\ub37c\0\ub3d0\0\ub424\0\ub478\0\ub4cc\0\ub520\0\ub574"+
+    "\0\ub5c8\0\ub61c\0\ub670\0\ub6c4\0\ub718\0\ub76c\0\ub7c0";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[607];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\7\17\1\20\1\21\1\22\1\23\1\24\71\17\1\23"+
+    "\16\17\10\25\1\26\37\25\1\27\53\25\10\30\1\31"+
+    "\53\30\1\32\37\30\10\33\1\34\14\33\1\35\76\33"+
+    "\7\36\1\37\1\0\1\36\1\23\2\36\1\40\7\36"+
+    "\1\41\3\36\1\42\1\43\6\36\1\44\43\36\1\23"+
+    "\16\36\32\45\1\46\71\45\31\47\1\46\72\47\7\36"+
+    "\1\37\1\0\1\36\1\23\2\36\1\40\7\36\1\50"+
+    "\3\36\1\51\1\52\6\36\1\44\43\36\1\23\16\36"+
+    "\32\45\1\53\71\45\31\47\1\53\72\47\24\54\1\55"+
+    "\77\54\1\56\1\57\1\60\1\61\1\57\1\40\1\62"+
+    "\1\23\1\63\1\64\1\23\1\65\1\66\2\67\1\70"+
+    "\1\71\1\72\1\73\1\57\1\74\1\75\1\76\1\60"+
+    "\1\56\1\77\1\100\1\101\1\102\1\103\1\104\1\105"+
+    "\1\57\1\106\1\67\1\107\1\57\1\110\1\111\1\57"+
+    "\1\112\1\113\1\114\1\115\1\116\1\117\1\120\1\121"+
+    "\1\70\1\66\2\67\2\40\1\122\1\123\1\124\1\125"+
+    "\1\56\1\70\1\57\1\126\1\127\1\57\1\130\1\57"+
+    "\1\131\2\57\1\23\1\132\1\133\1\134\1\135\1\136"+
+    "\1\137\1\57\1\140\6\57\10\141\1\142\31\141\1\143"+
+    "\3\141\1\144\25\141\1\145\1\146\26\141\10\147\1\150"+
+    "\35\147\1\151\25\147\1\152\1\153\26\147\10\17\4\0"+
+    "\71\17\1\0\25\17\1\20\2\0\1\23\1\0\71\17"+
+    "\1\23\16\17\125\0\1\154\3\0\1\154\10\0\1\155"+
+    "\1\0\4\154\2\0\1\154\4\0\3\154\3\0\1\156"+
+    "\1\0\5\154\2\0\6\154\4\0\1\157\1\0\4\154"+
+    "\2\0\11\154\1\0\16\154\7\0\1\23\2\0\1\23"+
+    "\72\0\1\23\16\0\12\24\1\0\1\24\1\160\70\24"+
+    "\1\0\16\24\10\25\1\0\37\25\1\0\53\25\50\0"+
+    "\1\161\53\0\10\30\1\0\53\30\1\0\37\30\25\0"+
+    "\1\162\76\0\10\33\1\0\14\33\1\0\76\33\10\36"+
+    "\1\0\1\36\1\0\2\36\1\0\7\36\1\0\3\36"+
+    "\2\0\6\36\1\0\43\36\1\0\25\36\1\37\1\0"+
+    "\1\36\1\23\2\36\1\0\7\36\1\0\3\36\2\0"+
+    "\6\36\1\0\43\36\1\23\16\36\25\0\1\41\76\0"+
+    "\32\45\1\0\71\45\31\47\1\0\72\47\24\54\1\0"+
+    "\77\54\24\0\1\163\77\0\5\56\13\0\4\56\2\0"+
+    "\3\56\2\0\3\56\1\0\2\56\2\0\5\56\2\0"+
+    "\6\56\6\0\5\56\1\0\11\56\1\0\17\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\2\165\2\60\1\165"+
+    "\1\0\1\166\11\0\1\165\1\167\2\165\2\0\1\165"+
+    "\1\60\1\165\2\0\3\165\1\0\2\165\2\0\1\165"+
+    "\1\170\2\167\1\171\2\0\2\165\1\171\1\165\1\170"+
+    "\1\165\6\0\5\165\1\0\2\165\1\167\6\165\1\0"+
+    "\20\165\1\172\1\173\1\165\1\0\1\166\11\0\1\165"+
+    "\1\167\2\165\2\0\1\165\1\173\1\165\2\0\3\165"+
+    "\1\0\2\165\2\0\1\174\1\170\2\167\1\171\2\0"+
+    "\2\165\1\171\1\165\1\170\1\165\6\0\5\165\1\0"+
+    "\2\165\1\167\5\165\1\174\1\0\16\165\2\0\2\166"+
+    "\23\0\1\166\105\0\1\175\3\0\1\40\1\176\22\0"+
+    "\1\177\75\0\1\40\1\0\1\40\123\0\1\40\106\0"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\200\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\201\2\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\57\1\202\4\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\24\0\1\203\114\0\1\40\7\0"+
+    "\1\204\76\0\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\4\57\1\205"+
+    "\4\57\1\0\16\57\30\77\1\206\1\207\72\77\10\100"+
+    "\1\210\17\100\1\211\1\100\1\212\71\100\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\213"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\5\57"+
+    "\1\214\6\0\2\57\1\215\1\216\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\217\2\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\220\1\221\2\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\222\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\223"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\5\56\13\0\4\56\2\0\3\56\2\0\3\56\1\0"+
+    "\2\56\2\0\5\56\2\0\6\56\6\0\2\56\1\224"+
+    "\2\56\1\0\11\56\1\0\16\56\15\0\1\40\23\0"+
+    "\1\225\1\226\61\0\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\3\57\1\227\12\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\230\2\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\231\2\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\232\1\57\1\233"+
+    "\6\0\2\57\1\234\1\57\1\56\1\0\4\57\1\235"+
+    "\4\57\1\0\16\57\15\0\1\40\32\0\1\40\70\0"+
+    "\1\40\33\0\1\40\52\0\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\236\1\237\1\240\2\57"+
+    "\6\0\4\57\1\56\1\0\1\241\3\57\1\242\1\243"+
+    "\3\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\244\1\245\2\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\246\1\247\6\0"+
+    "\4\57\1\56\1\0\7\57\1\250\1\251\1\0\1\57"+
+    "\1\252\14\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\253\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\2\57\1\253\6\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\250\1\57\1\250\1\254"+
+    "\2\57\6\0\4\57\1\56\1\0\4\57\1\255\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\256\2\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\257\1\57\1\260\3\57\6\0\1\57"+
+    "\1\261\2\57\1\56\1\0\1\57\1\262\7\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\263\1\57\1\264\3\57\6\0\4\57\1\56\1\0"+
+    "\4\57\1\265\4\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\266\1\267\1\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\270\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\1\57\1\271\1\57\1\0\1\56\1\57\2\0"+
+    "\3\57\1\272\1\57\2\0\5\57\1\273\6\0\4\57"+
+    "\1\56\1\0\6\57\1\274\2\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\275"+
+    "\2\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\276\1\57\1\277\1\300\1\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\2\57\1\301\1\57"+
+    "\1\56\1\0\1\302\10\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\2\57\1\303\3\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\250\1\304\3\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\305\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\250\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\57\1\306\14\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\307"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\250"+
+    "\1\57\1\310\3\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\311\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\3\57\1\312\2\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\313\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\2\57\1\314"+
+    "\3\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\315\2\57\6\0\4\57\1\56\1\0\4\57\1\316"+
+    "\4\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\317\2\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\2\57\1\320\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\321\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\10\141\1\0\31\141\1\0"+
+    "\3\141\1\0\25\141\2\0\26\141\41\0\1\322\134\0"+
+    "\1\323\15\0\1\324\105\0\1\325\146\0\1\326\26\0"+
+    "\10\147\1\0\35\147\1\0\25\147\2\0\26\147\52\0"+
+    "\1\327\15\0\1\330\105\0\1\331\146\0\1\332\27\0"+
+    "\3\154\1\0\2\154\11\0\4\154\2\0\2\154\3\0"+
+    "\3\154\5\0\6\154\1\0\6\154\6\0\4\154\2\0"+
+    "\11\154\1\0\16\154\17\0\1\333\30\0\1\334\54\0"+
+    "\1\335\3\0\1\335\12\0\4\335\2\0\1\335\4\0"+
+    "\3\335\5\0\5\335\2\0\6\335\6\0\4\335\2\0"+
+    "\11\335\1\0\16\335\25\0\1\336\123\0\1\337\76\0"+
+    "\5\56\13\0\4\56\2\0\3\56\2\0\1\340\2\56"+
+    "\1\0\2\56\2\0\5\56\2\0\6\56\6\0\5\56"+
+    "\1\0\11\56\1\0\16\56\5\165\13\0\4\165\2\0"+
+    "\3\165\2\0\3\165\1\0\2\165\2\0\5\165\2\0"+
+    "\6\165\6\0\5\165\1\0\11\165\1\0\20\165\2\166"+
+    "\1\165\13\0\1\165\1\167\2\165\2\0\1\165\1\166"+
+    "\1\165\2\0\3\165\1\0\2\165\2\0\2\165\2\167"+
+    "\1\171\2\0\2\165\1\171\3\165\6\0\5\165\1\0"+
+    "\2\165\1\167\6\165\1\0\20\165\2\341\1\165\13\0"+
+    "\4\165\2\0\1\165\1\341\1\165\2\0\3\165\1\0"+
+    "\2\165\2\0\5\165\2\342\6\165\6\0\5\165\1\0"+
+    "\11\165\1\0\20\165\2\172\1\165\1\0\1\166\11\0"+
+    "\1\165\1\167\2\165\2\0\1\165\1\172\1\165\2\0"+
+    "\3\165\1\0\2\165\2\0\2\165\2\167\1\171\2\0"+
+    "\2\165\1\171\3\165\6\0\5\165\1\0\2\165\1\167"+
+    "\6\165\1\0\20\165\1\172\1\173\1\165\1\0\1\166"+
+    "\11\0\1\165\1\167\2\165\2\0\1\165\1\173\1\165"+
+    "\2\0\3\165\1\0\2\165\2\0\1\165\1\343\2\167"+
+    "\1\171\2\0\2\165\1\171\1\165\1\343\1\165\6\0"+
+    "\5\165\1\0\2\165\1\167\6\165\1\0\20\165\2\344"+
+    "\1\165\13\0\3\344\1\165\2\0\2\344\1\165\2\0"+
+    "\2\165\1\344\1\0\2\165\2\0\2\165\3\344\2\0"+
+    "\2\165\2\344\2\165\6\0\1\165\1\344\3\165\1\0"+
+    "\2\165\1\344\6\165\1\0\16\165\17\0\1\345\105\0"+
+    "\1\346\3\0\1\346\12\0\4\346\2\0\1\346\4\0"+
+    "\3\346\5\0\5\346\2\0\6\346\6\0\1\347\3\346"+
+    "\2\0\11\346\1\0\16\346\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\350\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\351\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\57\1\352\4\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\25\0\1\160"+
+    "\113\0\1\40\7\0\1\67\76\0\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\4\57\1\353\4\57\1\0\16\57\3\354\1\77"+
+    "\4\354\1\0\16\354\4\77\1\355\2\77\10\354\1\77"+
+    "\3\354\2\77\50\354\30\210\1\356\1\210\1\357\74\210"+
+    "\1\100\4\210\1\0\16\210\4\100\1\360\2\100\10\210"+
+    "\1\100\3\210\2\100\50\210\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\361\1\57\1\362\1\57"+
+    "\6\0\4\57\1\56\1\0\2\57\1\363\6\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\250\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\364\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+    "\1\365\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\366\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\1\57\1\367\6\57\1\370\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\371\5\57"+
+    "\6\0\4\57\1\56\1\0\6\57\1\372\2\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\250\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\373\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\5\56\13\0\4\56\2\0\3\56\2\0"+
+    "\1\56\1\374\1\56\1\0\2\56\2\0\5\56\2\0"+
+    "\6\56\6\0\5\56\1\0\11\56\1\0\16\56\42\0"+
+    "\1\375\61\0\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\1\57"+
+    "\1\376\3\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\377\1\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\57\1\u0100\1\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\u0101\1\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\1\57"+
+    "\1\u0102\2\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\u0103\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u0104\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\1\u0105\2\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u0106\2\57\6\0\4\57\1\56\1\0"+
+    "\5\57\1\250\3\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\u0107\1\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\57\1\u0108\4\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u0109"+
+    "\4\57\6\0\2\57\1\u010a\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\1\u010b\15\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\3\57\1\u010c\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u010d\5\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u010e\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\57\1\u010f\1\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\5\57\1\214\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u0110"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\u0111\5\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0112\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\2\57\1\250\6\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\2\57\1\u0113\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\u0114\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\3\57\1\u0115\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\u0116\2\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u0117\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u0118\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u0119\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u011a"+
+    "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\57\1\u011b\4\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\4\57\1\u011c"+
+    "\1\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\1\u011d\2\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u011e"+
+    "\3\57\1\u0112\1\214\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u011f\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\u0120\1\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u0121\5\57\6\0\1\57\1\u0122"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\2\57\1\u0123\2\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\2\57\1\u0124\2\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\4\57"+
+    "\1\u0125\11\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\3\57\1\u0126\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\2\57\1\u0127\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\2\57\1\u0128\3\57\6\0\2\57\1\u0129\1\57"+
+    "\1\56\1\0\4\57\1\u012a\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u012b"+
+    "\4\57\6\0\1\57\1\u012c\2\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u012d\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u012e\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\2\57\1\u012f\1\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\3\57\1\u0130\1\57\2\0\4\57\1\u0131\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\u0132\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\1\u0133\3\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0134\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\10\57\1\u0135\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\u0136\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\u0137\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\57\1\250\4\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\253\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+    "\1\u0138\3\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u0139\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\u013a\2\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\1\57\1\u013b\14\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u013c\1\57"+
+    "\6\0\4\57\1\56\1\0\6\57\1\u013d\2\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\6\57"+
+    "\1\u013e\7\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\1\57\1\u013f\2\57\1\56\1\0"+
+    "\11\57\1\0\16\57\71\0\1\u0140\110\0\1\u0141\117\0"+
+    "\1\u0142\146\0\1\u0143\117\0\1\u0144\110\0\1\u0145\117\0"+
+    "\1\u0146\146\0\1\u0147\46\0\1\u0148\153\0\1\u0149\54\0"+
+    "\3\335\1\0\2\335\11\0\4\335\2\0\2\335\3\0"+
+    "\3\335\5\0\6\335\1\0\6\335\6\0\4\335\2\0"+
+    "\11\335\1\0\16\335\2\56\2\u014a\1\56\13\0\3\u014a"+
+    "\1\56\2\0\2\u014a\1\56\2\0\2\56\1\u014a\1\0"+
+    "\2\56\2\0\2\56\3\u014a\2\0\2\56\2\u014a\2\56"+
+    "\6\0\1\56\1\u014a\3\56\1\0\2\56\1\u014a\6\56"+
+    "\1\0\16\56\2\165\2\341\1\165\13\0\1\165\1\167"+
+    "\2\165\2\0\1\165\1\341\1\165\2\0\3\165\1\0"+
+    "\2\165\2\0\2\165\2\167\1\165\2\0\6\165\6\0"+
+    "\5\165\1\0\2\165\1\167\6\165\1\0\16\165\2\0"+
+    "\2\341\23\0\1\341\74\0\2\165\2\344\1\165\13\0"+
+    "\3\344\1\165\2\0\2\344\1\165\2\0\2\165\1\344"+
+    "\1\0\2\165\2\0\1\165\1\343\3\344\2\0\2\165"+
+    "\2\344\1\343\1\165\6\0\1\165\1\344\3\165\1\0"+
+    "\2\165\1\344\6\165\1\0\16\165\20\0\1\u014b\104\0"+
+    "\3\346\1\0\1\u014c\1\346\11\0\4\346\2\0\2\346"+
+    "\3\0\3\346\5\0\6\346\1\0\6\346\6\0\4\346"+
+    "\2\0\11\346\1\0\16\346\1\0\3\346\1\0\1\u014c"+
+    "\1\346\11\0\4\346\2\0\2\346\3\0\3\346\5\0"+
+    "\6\346\1\0\6\346\6\0\1\346\1\u014d\2\346\2\0"+
+    "\11\346\1\0\16\346\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u014e\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u0138\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\314\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u014f\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\30\354"+
+    "\1\u0150\1\u0151\74\354\2\u0152\14\354\3\u0152\3\354\2\u0152"+
+    "\1\u0150\1\u0151\3\354\1\u0152\7\354\3\u0152\4\354\2\u0152"+
+    "\11\354\1\u0152\6\354\1\u0152\25\354\10\210\1\0\115\210"+
+    "\2\u0153\14\210\3\u0153\3\210\2\u0153\1\356\1\210\1\357"+
+    "\2\210\1\u0153\7\210\3\u0153\4\210\2\u0153\11\210\1\u0153"+
+    "\6\210\1\u0153\25\210\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\5\57\1\247\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u0154\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u0155\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u0138\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u0156\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\250\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\4\57\1\u0157"+
+    "\1\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u0158"+
+    "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u0159\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u015a\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u015b\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\5\56\13\0\4\56\2\0\3\56"+
+    "\2\0\3\56\1\0\2\56\2\0\5\56\2\0\6\56"+
+    "\6\0\1\56\1\u015c\3\56\1\0\11\56\1\0\16\56"+
+    "\41\0\1\u015d\62\0\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\u015e\3\57\1\56\1\0"+
+    "\11\57\1\0\4\57\1\u015f\11\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u0160"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\1\57"+
+    "\1\u0161\2\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\5\57\1\u0105"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u0162\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\u0163\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\u0164\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0165\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\1\57\1\u0166\2\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u0167\1\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\u0168\15\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u0169\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\5\57\1\250\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\1\u016a\15\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u016b\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\u016c\2\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\4\57\1\u016d\4\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\2\57\1\u016e\6\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u016f"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0170\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\4\57\1\u0171\1\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\2\57\1\366\3\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+    "\1\u0172\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\312\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u0173\1\u0174\4\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\3\57"+
+    "\1\u0175\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\10\57\1\u0176\5\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u0177\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u011e"+
+    "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u0178\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\377\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u0179\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\57\1\u012e\2\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\5\57\1\u010a\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u017a\4\57\1\222\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u017b\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u017c\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u017d"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u017e\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\u017f\2\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u0180\1\57\6\0\4\57\1\56\1\0"+
+    "\4\57\1\u0181\4\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\4\57\1\u0173\1\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\57\1\u0158\14\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\u0182\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\1\57"+
+    "\1\u0183\14\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u0184\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\5\57\1\u0185\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\3\57\1\u0186"+
+    "\5\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+    "\1\u0171\3\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\1\250\10\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\214\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u0187\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\2\57\1\u0188\3\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u0189"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u018a\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\57\1\u018b\4\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\5\57\1\u018c\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\3\57\1\u018d\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\7\57\1\u018e\1\u0176\1\u018f\4\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\u0190\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\1\u0138\10\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\5\57\1\351"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\2\57\1\u0191\1\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u0138\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\2\57\1\u0192\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u0193\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\350\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\5\0\1\u0194\172\0\1\u0140\140\0\1\u0195"+
+    "\40\0\1\u0196\122\0\1\u0197\172\0\1\u0144\140\0\1\u0198"+
+    "\40\0\1\u0199\136\0\1\u019a\102\0\2\56\2\u019b\1\56"+
+    "\13\0\3\u019b\1\56\2\0\2\u019b\1\56\2\0\2\56"+
+    "\1\u019b\1\0\2\56\2\0\2\56\3\u019b\2\0\2\56"+
+    "\2\u019b\2\56\6\0\1\56\1\u019b\3\56\1\0\2\56"+
+    "\1\u019b\6\56\1\0\16\56\21\0\1\u019c\103\0\3\346"+
+    "\1\0\1\u014c\1\346\11\0\4\346\2\0\2\346\3\0"+
+    "\3\346\5\0\6\346\1\0\6\346\6\0\1\347\3\346"+
+    "\2\0\11\346\1\0\16\346\1\0\3\346\1\0\1\u014c"+
+    "\1\346\11\0\4\346\2\0\2\346\3\0\3\346\5\0"+
+    "\6\346\1\0\1\346\1\u019d\4\346\6\0\4\346\2\0"+
+    "\11\346\1\0\16\346\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\57\1\u0138\4\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u019e\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\10\354\1\0\115\354"+
+    "\2\u019f\14\354\3\u019f\3\354\2\u019f\1\u0150\1\u0151\3\354"+
+    "\1\u019f\7\354\3\u019f\4\354\2\u019f\11\354\1\u019f\6\354"+
+    "\1\u019f\25\354\2\210\2\u01a0\14\210\3\u01a0\3\210\2\u01a0"+
+    "\1\356\1\210\1\357\2\210\1\u01a0\7\210\3\u01a0\4\210"+
+    "\2\u01a0\11\210\1\u01a0\6\210\1\u01a0\25\210\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u01a1\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\3\57\1\u01a2\1\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u01a3"+
+    "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u01a4\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\2\57\1\u01a5"+
+    "\2\57\2\0\6\57\6\0\1\u01a6\3\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\57\1\214\14\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\5\57\1\u01a7\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\3\57\1\250\5\57\1\0\16\57\5\56\13\0\4\56"+
+    "\2\0\3\56\2\0\3\56\1\0\2\56\2\0\5\56"+
+    "\2\0\4\56\1\u01a8\1\56\6\0\5\56\1\0\11\56"+
+    "\1\0\17\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01a9\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\4\57\1\u01aa"+
+    "\4\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u01ab\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u01ac\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u01ad\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\u01ae\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\54\0\1\u01af\47\0"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0171\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\3\57\1\u01b0\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u01b1\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\1\57\1\250"+
+    "\7\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\4\57\1\u01b2\1\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\4\57\1\u01b3\4\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\57\1\u01b4\4\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\57\1\u01b5\14\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u01b6\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\3\57\1\u0166\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\1\57\1\u01b7\1\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\3\57"+
+    "\1\u01b8\3\57\1\u01b9\6\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\2\57\1\u01ba\1\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u01bb\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\1\57\1\u01bc\1\u01bd\1\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u01be"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u0112\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\1\57\1\u01bf\1\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u0138"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\2\57\1\u01c0\1\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u01c1\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\u01c2\2\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u01c3\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u01c4"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\4\57\1\u0171\11\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u01c5\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\57\1\222\4\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u01c6\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u0188\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u01c7\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u01c8\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u01c9\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\u01ca\2\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\214\5\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\6\57\1\u0173\2\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\2\57\1\u01cb\1\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u01cc\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\1\57\1\261\2\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u01cd\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u01ce\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\12\57\1\u01cf\3\57\1\56\4\57\13\0"+
+    "\2\57\1\u01d0\1\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\2\57\1\u01d1\3\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\2\57\1\u014e"+
+    "\3\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\1\57\1\364\2\57\1\56\1\0\11\57\1\0"+
+    "\16\57\41\0\1\u01d2\67\0\1\u0194\51\0\1\u0140\45\0"+
+    "\3\u0196\3\u01d3\4\0\5\u01d3\4\u0196\1\u01d3\1\0\2\u0196"+
+    "\1\0\1\u01d3\1\0\3\u0196\1\0\1\u01d3\2\u0196\1\u01d3"+
+    "\5\u0196\2\u01d3\6\u0196\1\0\1\u01d3\1\0\3\u01d3\4\u0196"+
+    "\2\u01d3\11\u0196\1\0\16\u0196\41\0\1\u01d4\67\0\1\u0197"+
+    "\51\0\1\u0144\45\0\3\u0199\3\u01d5\4\0\5\u01d5\4\u0199"+
+    "\1\u01d5\1\0\2\u0199\1\0\1\u01d5\1\0\3\u0199\1\0"+
+    "\1\u01d5\2\u0199\1\u01d5\5\u0199\2\u01d5\6\u0199\1\0\1\u01d5"+
+    "\1\0\3\u01d5\4\u0199\2\u01d5\11\u0199\1\0\16\u0199\22\0"+
+    "\1\u01d6\101\0\2\56\2\u01d7\1\56\13\0\3\u01d7\1\56"+
+    "\2\0\2\u01d7\1\56\2\0\2\56\1\u01d7\1\0\2\56"+
+    "\2\0\2\56\3\u01d7\2\0\2\56\2\u01d7\2\56\6\0"+
+    "\1\56\1\u01d7\3\56\1\0\2\56\1\u01d7\6\56\1\0"+
+    "\16\56\22\0\1\u01d8\102\0\3\346\1\0\1\u014c\1\346"+
+    "\11\0\4\346\2\0\2\346\3\0\3\346\5\0\6\346"+
+    "\1\0\6\346\6\0\2\346\1\u01d9\1\346\2\0\11\346"+
+    "\1\0\16\346\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u01da\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\2\354\2\u01db\14\354\3\u01db\3\354"+
+    "\2\u01db\1\u0150\1\u0151\3\354\1\u01db\7\354\3\u01db\4\354"+
+    "\2\u01db\11\354\1\u01db\6\354\1\u01db\25\354\2\210\2\u01dc"+
+    "\14\210\3\u01dc\3\210\2\u01dc\1\356\1\210\1\357\2\210"+
+    "\1\u01dc\7\210\3\u01dc\4\210\2\u01dc\11\210\1\u01dc\6\210"+
+    "\1\u01dc\25\210\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u01dd"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\2\57\1\u01de\1\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u01df\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0166\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\57\1\u01e0\4\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\1\57\1\u01e1\2\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\3\57\1\u01e2\1\56\1\0\11\57\1\0\16\57"+
+    "\5\56\13\0\4\56\2\0\3\56\2\0\1\u01e3\2\56"+
+    "\1\0\2\56\2\0\5\56\2\0\6\56\6\0\5\56"+
+    "\1\0\11\56\1\0\17\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\57\1\u01e4\2\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\2\57\1\351\6\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u01e5"+
+    "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\2\57"+
+    "\1\u01e6\1\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\6\57\1\u01e7\2\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u01e8\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\55\0\1\u01e9\46\0\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\3\57\1\u01ea\2\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\1\u01eb\5\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u01ec\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\3\57\1\250\1\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+    "\1\250\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u01ed\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\6\57\1\u0171\2\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u010a"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+    "\1\u01ee\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\3\57\1\u01ef\2\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\250"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\1\57\1\u01bc\2\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u01f0"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+    "\1\u01f1\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01f2\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\1\u0138\15\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u01f3\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\u01f4\1\57\1\0\1\56"+
+    "\1\57\2\0\3\57\1\u01e2\1\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\2\57\1\214\6\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\6\57\1\u01f5\2\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\2\57\1\u01f6\1\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\6\57\1\u01f7\2\57"+
+    "\1\0\16\57\1\56\4\57\13\0\2\57\1\u01f8\1\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\4\57\1\u01f9\11\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u01fa"+
+    "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\2\57\1\u01fb\2\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\13\57\1\u01fc"+
+    "\2\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\1\214"+
+    "\15\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\4\57\1\222\1\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\3\57\1\u01fd\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u01c2\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u01fe\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u01ff\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\1\57\1\u0171\3\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u0200"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\1\u0201\3\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\41\0"+
+    "\1\u0196\123\0\1\u0199\105\0\1\u0202\100\0\2\56\2\57"+
+    "\1\56\13\0\3\57\1\56\2\0\2\57\1\56\2\0"+
+    "\2\56\1\57\1\0\2\56\2\0\2\56\3\57\2\0"+
+    "\2\56\2\57\2\56\6\0\1\56\1\57\3\56\1\0"+
+    "\2\56\1\57\6\56\1\0\16\56\23\0\1\u0203\101\0"+
+    "\3\346\1\0\1\u014c\1\346\11\0\4\346\2\0\2\346"+
+    "\3\0\3\346\5\0\6\346\1\0\6\346\6\0\3\346"+
+    "\1\u0204\2\0\11\346\1\0\16\346\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0138\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\2\354\2\77"+
+    "\14\354\3\77\3\354\2\77\1\u0150\1\u0151\3\354\1\77"+
+    "\7\354\3\77\4\354\2\77\11\354\1\77\6\354\1\77"+
+    "\25\354\2\210\2\100\14\210\3\100\3\210\2\100\1\356"+
+    "\1\210\1\357\2\210\1\100\7\210\3\100\4\210\2\100"+
+    "\11\210\1\100\6\210\1\100\25\210\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\3\57\1\u01b8\12\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u0205"+
+    "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\2\57\1\u0206\1\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+    "\1\u0207\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u01a4\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u0208\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\5\56\13\0\4\56\2\0\3\56"+
+    "\2\0\3\56\1\0\2\56\2\0\5\56\2\0\6\56"+
+    "\6\0\5\56\1\0\2\56\1\u0209\6\56\1\0\17\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\3\57\1\u020a\5\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\u01da\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01b4\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\3\57\1\u020b\2\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+    "\1\250\3\57\1\0\16\57\67\0\1\u020c\34\0\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u020d"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\10\57\1\u020e"+
+    "\5\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\14\57"+
+    "\1\u020f\1\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\3\57\1\u0210\12\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\57\1\u0211\14\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\57\1\u0212\4\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\3\57\1\u0213\2\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u0214\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\3\57\1\u0215\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\214"+
+    "\2\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\366"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0216\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\1\u0166\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\u0217\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\5\57\1\u0218\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\u01b6\2\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u0205\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u0219\1\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\57\1\u021a\1\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\4\57\1\u021b\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u021c\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\5\57\1\u021d\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\2\57\1\u021e\6\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\u021f\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\22\0"+
+    "\1\u0220\123\0\1\u0221\102\0\3\346\1\0\1\u014c\1\346"+
+    "\11\0\4\346\2\0\2\346\3\0\3\346\5\0\6\346"+
+    "\1\0\1\u0222\5\346\6\0\4\346\2\0\11\346\1\0"+
+    "\16\346\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\253\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\3\57"+
+    "\1\u0223\1\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+    "\1\u0166\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\1\57\1\214\2\57"+
+    "\1\56\1\0\11\57\1\0\16\57\5\56\13\0\4\56"+
+    "\2\0\3\56\2\0\3\56\1\0\2\56\2\0\5\56"+
+    "\2\0\2\56\1\u0224\3\56\6\0\5\56\1\0\11\56"+
+    "\1\0\17\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\2\57\1\364\3\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u0225\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\74\0\1\u0226\27\0\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\1\u0227\15\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0228\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\2\57\1\u0229\1\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\4\57\1\u022a\4\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\2\57\1\u022b\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u022c\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\1\u0171\15\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\1\u022d\3\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u022e\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\1\57\1\u022f\3\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0230\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\1\u0231\1\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\u0232\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\u0171\5\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\1\57\1\u0233\14\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u0171\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\2\57\1\u0234\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\1\u0235\3\57\1\56\1\0\11\57"+
+    "\1\0\10\57\1\u0236\5\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\2\57\1\u0237\1\57"+
+    "\1\56\1\0\11\57\1\0\16\57\17\0\1\u0238\123\0"+
+    "\1\160\105\0\3\346\1\0\1\u014c\1\346\1\u0239\2\0"+
+    "\1\u0239\5\0\4\346\1\0\1\u023a\2\346\3\0\3\346"+
+    "\5\0\6\346\1\0\6\346\6\0\4\346\2\0\11\346"+
+    "\1\u0239\16\346\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u023b\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u0171"+
+    "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\222\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u023c\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\1\u023d\15\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\1\57\1\u023e\14\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u023f\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0240\2\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\4\57\1\u0241\4\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+    "\1\u0242\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\4\57\1\u0243\4\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\1\u010a\5\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\2\57\1\u0244\1\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\3\57\1\u021a\2\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\2\57\1\u0245\3\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+    "\1\0\4\57\1\u0246\4\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\1\u0247\5\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\4\57\1\300\1\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\3\57\1\u0138\1\56\1\0\11\57\1\0\16\57\7\0"+
+    "\1\u0239\2\0\1\u0239\12\0\1\u023a\57\0\1\u0239\16\0"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0248\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\1\u0171\10\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\4\57\1\56\1\0\1\u0249\10\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\6\57\6\0\2\57\1\u024a\1\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\4\57\1\u01f9\11\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\2\57\1\u024b\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\1\u024c\2\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\1\u012d\5\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\3\57\1\u024d\2\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\1\u024e\5\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\1\57\1\222\1\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0171\1\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\4\57\1\u024f\4\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u0250"+
+    "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\15\57\1\u0251"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+    "\1\u0252\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+    "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\4\57\1\u0253\1\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\1\57\1\u0254\1\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+    "\1\u0205\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+    "\6\57\1\u0255\2\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\3\57\1\u0171"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\4\57\1\u0256\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\1\u0257\2\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\1\u0258\3\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\2\57\1\u0259\3\57\6\0"+
+    "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+    "\1\56\1\0\2\57\1\u025a\6\57\1\0\16\57\1\56"+
+    "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+    "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u025b"+
+    "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+    "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+    "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+    "\6\0\4\57\1\56\1\0\11\57\1\0\1\57\1\u025c"+
+    "\14\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+    "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+    "\3\57\1\u025d\2\57\6\0\4\57\1\56\1\0\11\57"+
+    "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+    "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+    "\2\0\4\57\1\u025e\1\57\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\5\57\1\u023f\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\5\57\1\u0171\6\0\4\57\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\6\57\6\0\3\57\1\u023f\1\56\1\0"+
+    "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+    "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+    "\5\57\2\0\2\57\1\u01fc\3\57\6\0\4\57\1\56"+
+    "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+    "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+    "\2\0\5\57\2\0\4\57\1\u025f\1\57\6\0\4\57"+
+    "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+    "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+    "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u024f"+
+    "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+    "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+    "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\2\57"+
+    "\1\u0242\1\57\1\56\1\0\11\57\1\0\16\57";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[47124];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\5\0\2\1\1\0\2\1\4\0\2\1\1\11\4\1"+
+    "\1\11\2\1\1\11\2\1\2\11\2\1\4\11\2\1"+
+    "\1\11\1\1\4\11\7\1\1\11\2\1\1\11\1\1"+
+    "\1\11\13\1\1\11\35\1\1\11\5\1\1\11\6\1"+
+    "\2\11\1\0\1\11\1\0\11\1\3\0\3\1\1\0"+
+    "\3\1\1\11\2\1\1\11\12\1\1\11\74\1\1\11"+
+    "\12\0\1\1\2\11\2\1\1\0\2\1\3\0\7\1"+
+    "\1\11\15\1\1\0\102\1\11\0\1\11\1\1\3\0"+
+    "\3\1\1\11\13\1\1\11\6\1\1\0\57\1\2\0"+
+    "\1\1\2\0\1\1\1\0\1\1\2\0\21\1\1\0"+
+    "\42\1\5\0\1\1\2\0\17\1\1\0\30\1\3\0"+
+    "\7\1\1\0\23\1\3\0\3\1\1\11\21\1\1\11"+
+    "\1\0\1\11\45\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[607];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed XML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG						= -3;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line with an unclosed Script tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT				= -4;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a double-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT	= -5;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in the middle of a single-quoted attribute in a Script
+	 * tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT	= -6;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an ActionScript code block (text content inside a
+	 * Script tag).
+	 */
+	public static final int INTERNAL_IN_AS						= -7;
+
+	/**
+	 * Token type specific to this class; this signals that the user has
+	 * ended a line in an MLC in an ActionScript code block (text content
+	 * inside a Script tag).
+	 */
+	public static final int INTERNAL_IN_AS_MLC					= -8;
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public MxmlTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.FUNCTION:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS:
+				state = AS;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_AS_MLC:
+				state = AS_MLC;
+				start = text.offset;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public MxmlTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public MxmlTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 190) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 56: break;
+        case 50: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 57: break;
+        case 29: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken;
+          }
+        case 58: break;
+        case 48: 
+          { addToken(Token.ERROR_CHAR);
+          }
+        case 59: break;
+        case 34: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 60: break;
+        case 24: 
+          { addEndToken(INTERNAL_IN_AS); return firstToken;
+          }
+        case 61: break;
+        case 19: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 62: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 63: break;
+        case 26: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 64: break;
+        case 38: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 65: break;
+        case 51: 
+          { addToken(Token.FUNCTION);
+          }
+        case 66: break;
+        case 43: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+          }
+        case 67: break;
+        case 31: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 68: break;
+        case 54: 
+          { addToken(Token.DATA_TYPE); start = zzMarkedPos; yybegin(CDATA);
+          }
+        case 69: break;
+        case 27: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 70: break;
+        case 21: 
+          { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 71: break;
+        case 22: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 72: break;
+        case 10: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.FUNCTION);
+          }
+        case 73: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 74: break;
+        case 28: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken;
+          }
+        case 75: break;
+        case 17: 
+          { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 76: break;
+        case 37: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 77: break;
+        case 32: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 78: break;
+        case 15: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 79: break;
+        case 42: 
+          { yybegin(AS); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 80: break;
+        case 36: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 81: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+          }
+        case 82: break;
+        case 20: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 83: break;
+        case 41: 
+          { start = zzMarkedPos-2; yybegin(AS_MLC);
+          }
+        case 84: break;
+        case 16: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+          }
+        case 85: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 86: break;
+        case 30: 
+          { int count = yylength();
+									String tag = yytext(); // Get before addToken calls
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									if (tag.endsWith(":Script") || tag.equals("<Script")) {
+										yybegin(INTAG_SCRIPT);
+									}
+									else {
+										yybegin(INTAG);
+									}
+          }
+        case 87: break;
+        case 6: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 88: break;
+        case 23: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 89: break;
+        case 14: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 90: break;
+        case 11: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 91: break;
+        case 33: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 92: break;
+        case 45: 
+          { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.DATA_TYPE);
+          }
+        case 93: break;
+        case 40: 
+          { start = zzMarkedPos-2; yybegin(AS_EOL_COMMENT);
+          }
+        case 94: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.FUNCTION); return firstToken;
+          }
+        case 95: break;
+        case 47: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 96: break;
+        case 39: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 97: break;
+        case 52: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 98: break;
+        case 44: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE);
+          }
+        case 99: break;
+        case 25: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 100: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 101: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 102: break;
+        case 18: 
+          { yybegin(AS); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 103: break;
+        case 12: 
+          { addToken(Token.OPERATOR);
+          }
+        case 104: break;
+        case 35: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 105: break;
+        case 53: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 106: break;
+        case 49: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 107: break;
+        case 55: 
+          { int origStart = zzStartRead;
+								  String text = yytext();
+								  int tagNameEnd = text.length() - 2; // "-1" is '>'
+								  while (Character.isWhitespace(text.charAt(tagNameEnd))) {
+								      tagNameEnd--;
+								  }
+								  int tagNameLen = tagNameEnd - 1;
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(origStart+2,origStart+2+tagNameLen-1, Token.MARKUP_TAG_NAME);
+								  if (tagNameEnd<text.length()-2) {
+								      addToken(origStart+tagNameEnd+1, zzMarkedPos-2, Token.WHITESPACE);
+								  }
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 108: break;
+        case 46: 
+          { addToken(Token.ERROR_STRING_DOUBLE);
+          }
+        case 109: break;
+        case 1: 
+          { 
+          }
+        case 110: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case AS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken;
+            }
+            case 608: break;
+            case AS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken;
+            }
+            case 609: break;
+            case INTAG_SCRIPT: {
+              addToken(start,zzStartRead-1, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 610: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 611: break;
+            case CDATA: {
+              addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken;
+            }
+            case 612: break;
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 613: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.FUNCTION); return firstToken;
+            }
+            case 614: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 615: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 616: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 617: break;
+            case AS: {
+              addEndToken(INTERNAL_IN_AS); return firstToken;
+            }
+            case 618: break;
+            case INTAG: {
+              addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken;
+            }
+            case 619: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 620: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+            }
+            case 621: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex	(revision 25584)
@@ -0,0 +1,2052 @@
+/*
+ * 01/28/2009
+ *
+ * PHPTokenMaker.java - Generates tokens for PHP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for PHP files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PHPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+%%
+
+%public
+%class PHPTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -7;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * Token type specifying we're in PHP.
+	 */
+	public static final int INTERNAL_IN_PHP					= -(1<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline comment.
+	 */
+	public static final int INTERNAL_IN_PHP_MLC				= -(2<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline string.
+	 */
+	public static final int INTERNAL_IN_PHP_STRING				= -(3<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline char.
+	 */
+	public static final int INTERNAL_IN_PHP_CHAR				= -(4<<11);
+
+	/**
+	 * Whether closing markup tags are automatically completed for PHP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * The state PHP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int phpInState;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PHPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.FUNCTION || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		phpInState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_PHPxxx - phpInState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_PHP:
+							state = PHP;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_PHP_MLC:
+							state = PHP_MLC;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_PHP_STRING:
+							state = PHP_STRING;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_PHP_CHAR:
+							state = PHP_CHAR;
+							start = text.offset;
+							break;
+					}
+					phpInState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace			= ([ \t\f]+)
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+AmperItem				= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'/=>]+)
+EndScriptTag			= ("</" [sS][cC][rR][iI][pP][tT] ">")
+
+
+// JavaScript stuff.
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin				= "/*"
+JS_MLCEnd					= "*/"
+JS_LineCommentBegin			= "//"
+JS_IntegerHelper1			= (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2			= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral			= ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral				= ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1			= ([fFdD]?)
+JS_FloatHelper2			= ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1			= ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2			= ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3			= ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral			= ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat		= (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator				= ([\(\)\{\}\[\]\]])
+JS_Separator2				= ([\;,.])
+JS_NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator		= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator				= ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier				= ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier			= ({NonSeparator}+)
+JS_Regex					= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+BooleanLiteral				= ("true"|"false")
+
+
+// PHP stuff (most PHP stuff is shared with JS for simplicity)
+PHP_Start					= ("<?""php"?)
+LetterOrUnderscore			= ({Letter}|[_])
+LetterOrUnderscoreOrDigit	= ({LetterOrUnderscore}|{Digit})
+PHP_Variable				= ("$"{LetterOrUnderscore}{LetterOrUnderscoreOrDigit}*)
+PHP_LineCommentBegin		= ("//"|[#])
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrUnderscoreOrDigit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state JAVASCRIPT
+%state JS_CHAR
+%state JS_STRING
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state PHP
+%state PHP_MLC
+%state PHP_STRING
+%state PHP_CHAR
+
+
+%%
+
+<YYINITIAL> {
+	"<!--"						{ start = zzMarkedPos-4; yybegin(COMMENT); }
+	"<"[sS][cC][rR][iI][pP][tT]	{
+								  addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+								}
+	"<!"						{ start = zzMarkedPos-2; yybegin(DTD); }
+	{PHP_Start}					{ addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	"<"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"</"({Letter}|{Digit})+		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}			{ addNullToken(); return firstToken; }
+	{Identifier}				{ addToken(Token.IDENTIFIER); } // Catches everything.
+	{AmperItem}				{ addToken(Token.DATA_TYPE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	<<EOF>>					{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	"-->"					{ yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); }
+	"-"						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+<DTD> {
+	[^\n>]+					{}
+	{LineTerminator}			{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+	">"						{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+	[Aa] |
+	[aA][bB][bB][rR] |
+	[aA][cC][rR][oO][nN][yY][mM] |
+	[aA][dD][dD][rR][eE][sS][sS] |
+	[aA][pP][pP][lL][eE][tT] |
+	[aA][rR][eE][aA] |
+	[aA][rR][tT][iI][cC][lL][eE] |
+	[aA][sS][iI][dD][eE] |
+	[aA][uU][dD][iI][oO] |
+	[bB] |
+	[bB][aA][sS][eE] |
+	[bB][aA][sS][eE][fF][oO][nN][tT] |
+	[bB][dD][oO] |
+	[bB][gG][sS][oO][uU][nN][dD] |
+	[bB][iI][gG] |
+	[bB][lL][iI][nN][kK] |
+	[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+	[bB][oO][dD][yY] |
+	[bB][rR] |
+	[bB][uU][tT][tT][oO][nN] |
+	[cC][aA][nN][vV][aA][sS] |
+	[cC][aA][pP][tT][iI][oO][nN] |
+	[cC][eE][nN][tT][eE][rR] |
+	[cC][iI][tT][eE] |
+	[cC][oO][dD][eE] |
+	[cC][oO][lL] |
+	[cC][oO][lL][gG][rR][oO][uU][pP] |
+	[cC][oO][mM][mM][aA][nN][dD] |
+	[cC][oO][mM][mM][eE][nN][tT] |
+	[dD][dD] |
+	[dD][aA][tT][aA][gG][rR][iI][dD] |
+	[dD][aA][tT][aA][lL][iI][sS][tT] |
+	[dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+	[dD][eE][lL] |
+	[dD][eE][tT][aA][iI][lL][sS] |
+	[dD][fF][nN] |
+	[dD][iI][aA][lL][oO][gG] |
+	[dD][iI][rR] |
+	[dD][iI][vV] |
+	[dD][lL] |
+	[dD][tT] |
+	[eE][mM] |
+	[eE][mM][bB][eE][dD] |
+	[eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+	[fF][iI][eE][lL][dD][sS][eE][tT] |
+	[fF][iI][gG][uU][rR][eE] |
+	[fF][oO][nN][tT] |
+	[fF][oO][oO][tT][eE][rR] |
+	[fF][oO][rR][mM] |
+	[fF][rR][aA][mM][eE] |
+	[fF][rR][aA][mM][eE][sS][eE][tT] |
+	[hH][123456] |
+	[hH][eE][aA][dD] |
+	[hH][eE][aA][dD][eE][rR] |
+	[hH][rR] |
+	[hH][tT][mM][lL] |
+	[iI] |
+	[iI][fF][rR][aA][mM][eE] |
+	[iI][lL][aA][yY][eE][rR] |
+	[iI][mM][gG] |
+	[iI][nN][pP][uU][tT] |
+	[iI][nN][sS] |
+	[iI][sS][iI][nN][dD][eE][xX] |
+	[kK][bB][dD] |
+	[kK][eE][yY][gG][eE][nN] |
+	[lL][aA][bB][eE][lL] |
+	[lL][aA][yY][eE][rR] |
+	[lL][eE][gG][eE][nN][dD] |
+	[lL][iI] |
+	[lL][iI][nN][kK] |
+	[mM][aA][pP] |
+	[mM][aA][rR][kK] |
+	[mM][aA][rR][qQ][uU][eE][eE] |
+	[mM][eE][nN][uU] |
+	[mM][eE][tT][aA] |
+	[mM][eE][tT][eE][rR] |
+	[mM][uU][lL][tT][iI][cC][oO][lL] |
+	[nN][aA][vV] |
+	[nN][eE][sS][tT] |
+	[nN][oO][bB][rR] |
+	[nN][oO][eE][mM][bB][eE][dD] |
+	[nN][oO][fF][rR][aA][mM][eE][sS] |
+	[nN][oO][lL][aA][yY][eE][rR] |
+	[nN][oO][sS][cC][rR][iI][pP][tT] |
+	[oO][bB][jJ][eE][cC][tT] |
+	[oO][lL] |
+	[oO][pP][tT][gG][rR][oO][uU][pP] |
+	[oO][pP][tT][iI][oO][nN] |
+	[oO][uU][tT][pP][uU][tT] |
+	[pP] |
+	[pP][aA][rR][aA][mM] |
+	[pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+	[pP][rR][eE] |
+	[pP][rR][oO][gG][rR][eE][sS][sS] |
+	[qQ] |
+	[rR][uU][lL][eE] |
+	[sS] |
+	[sS][aA][mM][pP] |
+	[sS][cC][rR][iI][pP][tT] |
+	[sS][eE][cC][tT][iI][oO][nN] |
+	[sS][eE][lL][eE][cC][tT] |
+	[sS][eE][rR][vV][eE][rR] |
+	[sS][mM][aA][lL][lL] |
+	[sS][oO][uU][rR][cC][eE] |
+	[sS][pP][aA][cC][eE][rR] |
+	[sS][pP][aA][nN] |
+	[sS][tT][rR][iI][kK][eE] |
+	[sS][tT][rR][oO][nN][gG] |
+	[sS][tT][yY][lL][eE] |
+	[sS][uU][bB] |
+	[sS][uU][pP] |
+	[tT][aA][bB][lL][eE] |
+	[tT][bB][oO][dD][yY] |
+	[tT][dD] |
+	[tT][eE][xX][tT][aA][rR][eE][aA] |
+	[tT][fF][oO][oO][tT] |
+	[tT][hH] |
+	[tT][hH][eE][aA][dD] |
+	[tT][iI][mM][eE] |
+	[tT][iI][tT][lL][eE] |
+	[tT][rR] |
+	[tT][tT] |
+	[uU] |
+	[uU][lL] |
+	[vV][aA][rR] |
+	[vV][iI][dD][eE][oO]    { addToken(Token.MARKUP_TAG_NAME); }
+	{InTagIdentifier}		{ /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+	.						{ /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+	{PHP_Start}				{ addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\"<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\"]						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\'<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\']						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+	{PHP_Start}				{ addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	{InTagIdentifier}			{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	"/>"					{	addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+	"/"						{ addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+	{Whitespace}				{ addToken(Token.WHITESPACE); }
+	"="						{ addToken(Token.OPERATOR); }
+	">"						{ yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+	<<EOF>>					{ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\"<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\"]						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+	{PHP_Start}					{ int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+	[^\'<]*						{}
+	"<"							{ /* Allowing "<?" and "<?php" to start PHP */ }
+	[\']						{ addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+	{EndScriptTag}					{
+								  yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+								}
+
+	// ECMA keywords.
+	"break" |
+	"continue" |
+	"delete" |
+	"else" |
+	"for" |
+	"function" |
+	"if" |
+	"in" |
+	"new" |
+	"return" |
+	"this" |
+	"typeof" |
+	"var" |
+	"void" |
+	"while" |
+	"with"						{ addToken(Token.RESERVED_WORD); }
+
+	// Reserved (but not yet used) ECMA keywords.
+	"abstract"					{ addToken(Token.RESERVED_WORD); }
+	"boolean"						{ addToken(Token.DATA_TYPE); }
+	"byte"						{ addToken(Token.DATA_TYPE); }
+	"case"						{ addToken(Token.RESERVED_WORD); }
+	"catch"						{ addToken(Token.RESERVED_WORD); }
+	"char"						{ addToken(Token.DATA_TYPE); }
+	"class"						{ addToken(Token.RESERVED_WORD); }
+	"const"						{ addToken(Token.RESERVED_WORD); }
+	"debugger"					{ addToken(Token.RESERVED_WORD); }
+	"default"						{ addToken(Token.RESERVED_WORD); }
+	"do"							{ addToken(Token.RESERVED_WORD); }
+	"double"						{ addToken(Token.DATA_TYPE); }
+	"enum"						{ addToken(Token.RESERVED_WORD); }
+	"export"						{ addToken(Token.RESERVED_WORD); }
+	"extends"						{ addToken(Token.RESERVED_WORD); }
+	"final"						{ addToken(Token.RESERVED_WORD); }
+	"finally"						{ addToken(Token.RESERVED_WORD); }
+	"float"						{ addToken(Token.DATA_TYPE); }
+	"goto"						{ addToken(Token.RESERVED_WORD); }
+	"implements"					{ addToken(Token.RESERVED_WORD); }
+	"import"						{ addToken(Token.RESERVED_WORD); }
+	"instanceof"					{ addToken(Token.RESERVED_WORD); }
+	"int"						{ addToken(Token.DATA_TYPE); }
+	"interface"					{ addToken(Token.RESERVED_WORD); }
+	"long"						{ addToken(Token.DATA_TYPE); }
+	"native"						{ addToken(Token.RESERVED_WORD); }
+	"package"						{ addToken(Token.RESERVED_WORD); }
+	"private"						{ addToken(Token.RESERVED_WORD); }
+	"protected"					{ addToken(Token.RESERVED_WORD); }
+	"public"						{ addToken(Token.RESERVED_WORD); }
+	"short"						{ addToken(Token.DATA_TYPE); }
+	"static"						{ addToken(Token.RESERVED_WORD); }
+	"super"						{ addToken(Token.RESERVED_WORD); }
+	"switch"						{ addToken(Token.RESERVED_WORD); }
+	"synchronized"					{ addToken(Token.RESERVED_WORD); }
+	"throw"						{ addToken(Token.RESERVED_WORD); }
+	"throws"						{ addToken(Token.RESERVED_WORD); }
+	"transient"					{ addToken(Token.RESERVED_WORD); }
+	"try"						{ addToken(Token.RESERVED_WORD); }
+	"volatile"					{ addToken(Token.RESERVED_WORD); }
+	"null"						{ addToken(Token.RESERVED_WORD); }
+
+	// Literals.
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+	"NaN"						{ addToken(Token.RESERVED_WORD); }
+	"Infinity"					{ addToken(Token.RESERVED_WORD); }
+
+	// Functions.
+	"eval" |
+	"parseInt" |
+	"parseFloat" |
+	"escape" |
+	"unescape" |
+	"isNaN" |
+	"isFinite"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\']							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+	[\"]							{ start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(JS_MLC); }
+	{JS_LineCommentBegin}			{ start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+	/* Attempt to identify regular expressions (not foolproof) - do after comments! */
+	{JS_Regex}						{
+										boolean highlightedAsRegex = false;
+										if (firstToken==null) {
+											addToken(Token.REGEX);
+											highlightedAsRegex = true;
+										}
+										else {
+											// If this is *likely* to be a regex, based on
+											// the previous token, highlight it as such.
+											Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+											if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+												addToken(Token.REGEX);
+												highlightedAsRegex = true;
+											}
+										}
+										// If it doesn't *appear* to be a regex, highlight it as
+										// individual tokens.
+										if (!highlightedAsRegex) {
+											int temp = zzStartRead + 1;
+											addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+											zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+										}
+									}
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	{PHP_Start}					{ addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JS_STRING> {
+	[^\n\\\"]+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+							}
+	\"						{ int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+	[^\n\\\']+				{}
+	\n						{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	\\x{HexDigit}{2}		{}
+	\\x						{ /* Invalid latin-1 character \xXX */ validJSString = false; }
+	\\u{HexDigit}{4}		{}
+	\\u						{ /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+	\\.						{ /* Skip all escaped chars. */ }
+	\\						{ /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+							}
+	\'						{ int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_MLC> {
+	// JavaScript MLC's.  This state is essentially Java's MLC state.
+	[^hwf<\n\*]+			{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+	{JS_MLCEnd}					{ yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+
+<JS_EOL_COMMENT> {
+	[^hwf<\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	{EndScriptTag}			{
+							  yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+							}
+	"<"						{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+
+<PHP> {
+
+	"?>"						{ addToken(Token.SEPARATOR); start = zzMarkedPos; yybegin(phpInState); }
+
+	/* Error control operator */
+	("@"{JS_Identifier})		{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.FUNCTION);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+								}
+
+	/* Keywords */
+	"__CLASS__" |
+	"__DIR__" |
+	"__FILE__" |
+	"__FUNCTION__" |
+	"__METHOD__" |
+	"__NAMESPACE__" |
+	"abstract" |
+	"and" |
+	"array" |
+	"as" |
+	"break" |
+	"case" |
+	"catch" |
+	"cfunction" |
+	"class" |
+	"clone" |
+	"const" |
+	"continue" |
+	"declare" |
+	"default" |
+	"die" |
+	"do" |
+	"echo" |
+	"else" |
+	"elseif" |
+	"empty" |
+	"enddeclare" |
+	"endfor" |
+	"endforeach" |
+	"endif" |
+	"endswitch" |
+	"endwhile" |
+	"eval" |
+	"exit" |
+	"extends" |
+	"final" |
+	"for" |
+	"foreach" |
+	"function" |
+	"global" |
+	"goto" |
+	"if" |
+	"implements" |
+	"include" |
+	"include_once" |
+	"interface" |
+	"instanceof" |
+	"isset" |
+	"list" |
+	"namespace" |
+	"new" |
+	"old_function" |
+	"or" |
+	"print" |
+	"private" |
+	"protected" |
+	"public" |
+	"require" |
+	"require_once" |
+	"return" |
+	"static" |
+	"switch" |
+	"throw" |
+	"try" |
+	"unset" |
+	"use" |
+	"var" |
+	"while" |
+	"xor" |
+
+	"parent" |
+	"self" |
+	"stdClass"					{ addToken(Token.RESERVED_WORD); }
+
+	/* Functions */
+	"__call" |
+	"__construct" |
+	"__getfunctions" |
+	"__getlastrequest" |
+	"__getlastresponse" |
+	"__gettypes" |
+	"__tostring" |
+	"abs" |
+	"acos" |
+	"acosh" |
+	"add" |
+	("add"("_namespace"|"_root"|"action"|"color"|"cslashes"|"entry"|"fill"|"function"|"shape"|"slashes"|"string")) |
+	"aggregate" |
+	"aggregate_info" |
+	"aggregate_methods" |
+	"aggregate_methods_by_list" |
+	"aggregate_methods_by_regexp" |
+	"aggregate_properties" |
+	"aggregate_properties_by_list" |
+	"aggregate_properties_by_regexp" |
+	"aggregation_info" |
+	"align" |
+	("apd_"("breakpoint"|"callstack"|"clunk"|"continue"|"croak"|"dump_function_table"|"dump_persistent_resources"|"dump_regular_resources"|"echo"|"get_active_symbols"|"set_pprof_trace"|"set_session"|"set_session_trace"|"set_socket_session_trace")) |
+	"append" |
+	"append_child" |
+	"append_sibling" |
+	"appendchild" |
+	"appenddata" |
+	("array_"("change_key_case"|"chunk"|"combine"|"count_values"|"diff"|"diff_assoc"|"diff_key"|"diff_uassoc"|"diff_ukey"|"fill"|"filter"|"flip"|"intersect"|"intersect_assoc"|"intersect_key"|"intersect_uassoc"|"intersect_ukey"|"key_exists"|"keys"|"map"|"merge"|"merge_recursive"|"multisort"|"pad"|"pop"|"push"|"rand"|"reduce"|"reverse"|"search"|"shift"|"slice"|"splice"|"sum"|"udiff"|"udiff_assoc"|"udiff_uassoc"|"uintersect"|"uintersect_assoc"|"uintersect_uassoc"|"unique"|"unshift"|"values"|"walk"|"walk_recursive")) |
+	"arsort" |
+	"ascii2ebcdic" |
+	"asin" |
+	"asinh" |
+	"asort" |
+	"assert" |
+	"assert_options" |
+	"assign" |
+	"assignelem" |
+	"asxml" |
+	"atan" |
+	"atan2" |
+	"atanh" |
+	"attreditable" |
+	"attributes" |
+	"base64_decode" |
+	"base64_encode" |
+	"base_convert" |
+	"basename" |
+	"bcadd" |
+	"bccomp" |
+	"bcdiv" |
+	"bcmod" |
+	"bcmul" |
+	"bcpow" |
+	"bcpowmod" |
+	"bcscale" |
+	"bcsqrt" |
+	"bcsub" |
+	"begintransaction" |
+	"bin2hex" |
+	"bind_textdomain_codeset" |
+	"bindcolumn" |
+	"bindec" |
+	"bindparam" |
+	"bindtextdomain" |
+	"bzclose" |
+	"bzcompress" |
+	"bzdecompress" |
+	"bzerrno" |
+	"bzerror" |
+	"bzerrstr" |
+	"bzflush" |
+	"bzopen" |
+	"bzread" |
+	"bzwrite" |
+	"cal_days_in_month" |
+	"cal_from_jd" |
+	"cal_info" |
+	"cal_to_jd" |
+	"call_user_func" |
+	"call_user_func_array" |
+	"call_user_method" |
+	"call_user_method_array" |
+	("ccvs_"("add"|"auth"|"command"|"count"|"delete"|"done"|"init"|"lookup"|"new"|"report"|"return"|"reverse"|"sale"|"status"|"textvalue"|"void")) |
+	"ceil" |
+	"chdir" |
+	"checkdate" |
+	"checkdnsrr" |
+	"checkin" |
+	"checkout" |
+	"chgrp" |
+	"child_nodes" |
+	"children" |
+	"chmod" |
+	"chop" |
+	"chown" |
+	"chr" |
+	"chroot" |
+	"chunk_split" |
+	"class_exists" |
+	"class_implements" |
+	"class_parents" |
+	"classkit_import" |
+	"classkit_method_add" |
+	"classkit_method_copy" |
+	"classkit_method_redefine" |
+	"classkit_method_remove" |
+	"classkit_method_rename" |
+	"clearstatcache" |
+	"clone_node" |
+	"clonenode" |
+	"close" |
+	"closedir" |
+	"closelog" |
+	"com" |
+	"commit" |
+	"compact" |
+	"connect" |
+	"connection_aborted" |
+	"connection_status" |
+	"connection_timeout" |
+	"constant" |
+	"content" |
+	"convert_cyr_string" |
+	"convert_uudecode" |
+	"convert_uuencode" |
+	"copy" |
+	"cos" |
+	"cosh" |
+	"count" |
+	"count_chars" |
+	"crack_check" |
+	"crack_closedict" |
+	"crack_getlastmessage" |
+	"crack_opendict" |
+	"crc32" |
+	("create"("_attribute"|"_cdata_section"|"_comment"|"_element"|"_element_ns"|"_entity_reference"|"_function"|"_processing_instruction"|"_text_node"|"attribute"|"attributens"|"cdatasection"|"comment"|"document"|"documentfragment"|"documenttype"|"element"|"elementns"|"entityreference"|"processinginstruction"|"textnode")) |
+	"crypt" |
+	("curl_"("close"|"copy_handle"|"errno"|"error"|"exec"|"getinfo"|"init"|"multi_add_handle"|"multi_close"|"multi_exec"|"multi_getcontent"|"multi_info_read"|"multi_init"|"multi_remove_handle"|"multi_select"|"setopt"|"version")) |
+	"current" |
+	"cybercash_base64_decode" |
+	"cybercash_base64_encode" |
+	"cybercash_decr" |
+	"cybercash_encr" |
+	"cyrus_authenticate" |
+	"cyrus_bind" |
+	"cyrus_close" |
+	"cyrus_connect" |
+	"cyrus_query" |
+	"cyrus_unbind" |
+	"data" |
+	"date" |
+	"date_sunrise" |
+	"date_sunset" |
+	"dblist" |
+	"dbmclose" |
+	"dbmdelete" |
+	"dbmexists" |
+	"dbmfetch" |
+	"dbmfirstkey" |
+	"dbminsert" |
+	"dbmnextkey" |
+	"dbmopen" |
+	"dbmreplace" |
+	"dbstat" |
+	"dcgettext" |
+	"dcngettext" |
+	"dcstat" |
+	"deaggregate" |
+	"debug_backtrace" |
+	"debug_print_backtrace" |
+	"debug_zval_dump" |
+	"debugger_off" |
+	"debugger_on" |
+	"decbin" |
+	"dechex" |
+	"decoct" |
+	"decrement" |
+	"define" |
+	"define_syslog_variables" |
+	"defined" |
+	"deg2rad" |
+	"delete" |
+	"deletedata" |
+	"description" |
+	"dgettext" |
+	("dio_"("close"|"fcntl"|"open"|"read"|"seek"|"stat"|"tcsetattr"|"truncate"|"write")) |
+	"dir" |
+	"dirname" |
+	"disk_free_space" |
+	"disk_total_space" |
+	"diskfreespace" |
+	"dl" |
+	"dngettext" |
+	"dns_check_record" |
+	"dns_get_mx" |
+	"dns_get_record" |
+	"doctype" |
+	"document_element" |
+	"dom_import_simplexml" |
+	("domxml_"("new_doc"|"open_file"|"open_mem"|"version"|"xmltree"|"xslt_stylesheet"|"xslt_stylesheet_doc"|"xslt_stylesheet_file")) |
+	"dotnet" |
+	"dotnet_load" |
+	"doubleval" |
+	"drawcurve" |
+	"drawcurveto" |
+	"drawline" |
+	"drawlineto" |
+	"dstanchors" |
+	"dstofsrcanchors" |
+	"dump_file" |
+	"dump_mem" |
+	"dump_node" |
+	"each" |
+	"easter_date" |
+	"easter_days" |
+	"ebcdic2ascii" |
+	"end" |
+	"entities" |
+	"eof" |
+	"erase" |
+	"ereg" |
+	"ereg_replace" |
+	"eregi" |
+	"eregi_replace" |
+	"error_log" |
+	"error_reporting" |
+	"errorcode" |
+	"errorinfo" |
+	"escapeshellarg" |
+	"escapeshellcmd" |
+	"exec" |
+	"execute" |
+	"exif_imagetype" |
+	"exif_read_data" |
+	"exif_tagname" |
+	"exif_thumbnail" |
+	"exp" |
+	"explode" |
+	"expm1" |
+	"export" |
+	"extension_loaded" |
+	"extract" |
+	"ezmlm_hash" |
+	"fclose" |
+	"feof" |
+	"fetch" |
+	"fetchall" |
+	"fetchsingle" |
+	"fflush" |
+	"fgetc" |
+	"fgetcsv" |
+	"fgets" |
+	"fgetss" |
+	"file" |
+	("file"("_exists"|"_get_contents"|"_put_contents"|"atime"|"ctime"|"group"|"inode"|"mtime"|"owner"|"perms"|"pro"|"pro_fieldcount"|"pro_fieldname"|"pro_fieldtype"|"pro_fieldwidth"|"pro_retrieve"|"pro_rowcount"|"size"|"type")) |
+	"find" |
+	"first_child" |
+	"floatval" |
+	"flock" |
+	"floor" |
+	"flush" |
+	"fmod" |
+	"fnmatch" |
+	"fopen" |
+	"fpassthru" |
+	"fprintf" |
+	"fputcsv" |
+	"fputs" |
+	"fread" |
+	"free" |
+	"frenchtojd" |
+	"fribidi_log2vis" |
+	"fscanf" |
+	"fseek" |
+	"fsockopen" |
+	"fstat" |
+	"ftell" |
+	"ftok" |
+	("ftp_"("alloc"|"cdup"|"chdir"|"chmod"|"close"|"connect"|"delete"|"exec"|"fget"|"fput"|"get"|"get_option"|"login"|"mdtm"|"mkdir"|"nb_continue"|"nb_fget"|"nb_fput"|"nb_get"|"nb_put"|"nlist"|"pasv"|"put"|"pwd"|"quit"|"raw"|"rawlist"|"rename"|"rmdir"|"set_option"|"site"|"size"|"ssl_connect"|"systype")) |
+	"ftruncate" |
+	"ftstat" |
+	"func_get_arg" |
+	"func_get_args" |
+	"func_num_args" |
+	"function_exists" |
+	"fwrite" |
+	"gd_info" |
+	"get" |
+	("get"("_attr"|"_attribute"|"_attribute_node"|"_browser"|"_cfg_var"|"_class"|"_class_methods"|"_class_vars"|"_content"|"_current_user"|"_declared_classes"|"_declared_interfaces"|"_defined_constants"|"_defined_functions"|"_defined_vars"|"_element_by_id"|"_elements_by_tagname"|"_extension_funcs"|"_headers"|"_html_translation_table"|"_include_path"|"_included_files"|"_loaded_extensions"|"_magic_quotes_gpc"|"_magic_quotes_runtime"|"_meta_tags"|"_nodes"|"_object_vars"|"_parent_class"|"_required_files"|"_resource_type"|"allheaders"|"atime"|"attr"|"attribute"|"attributenode"|"attributenodens"|"attributens"|"buffering"|"children"|"crc"|"ctime"|"cwd"|"date"|"depth"|"elem"|"elementbyid"|"elementsbytagname"|"elementsbytagnamens"|"env"|"filename"|"filetime"|"functions"|"group"|"height"|"hostbyaddr"|"hostbyname"|"hostbynamel"|"hostos"|"imagesize"|"inneriterator"|"inode"|"iterator"|"lastmod"|"method"|"mtime"|"mxrr"|"mygid"|"myinode"|"mypid"|"myuid"|"name"|"nameditem"|"nameditemns"|"opt"|"owner"|"packedsize"|"path"|"pathname"|"perms"|"position"|"protobyname"|"protobynumber"|"randmax"|"rusage"|"servbyname"|"servbyport"|"shape1"|"shape2"|"size"|"stats"|"subiterator"|"text"|"timeofday"|"type"|"unpackedsize"|"version"|"width")) |
+	"glob" |
+	"gmdate" |
+	"gmmktime" |
+	("gmp_"("abs"|"add"|"and"|"clrbit"|"cmp"|"com"|"div"|"div_q"|"div_qr"|"div_r"|"divexact"|"fact"|"gcd"|"gcdext"|"hamdist"|"init"|"intval"|"invert"|"jacobi"|"legendre"|"mod"|"mul"|"neg"|"or"|"perfect_square"|"popcount"|"pow"|"powm"|"prob_prime"|"random"|"scan0"|"scan1"|"setbit"|"sign"|"sqrt"|"sqrtrem"|"strval"|"sub"|"xor")) |
+	"gmstrftime" |
+	"gregoriantojd" |
+	("gz"("close"|"compress"|"deflate"|"encode"|"eof"|"file"|"getc"|"gets"|"getss"|"inflate"|"open"|"passthru"|"puts"|"read"|"rewind"|"seek"|"tell"|"uncompress"|"write")) |
+	"handle" |
+	("has"("_attribute"|"_attributes"|"_child_nodes"|"attribute"|"attributens"|"attributes"|"childnodes"|"children"|"feature"|"next"|"siblings")) |
+	"header" |
+	"headers_list" |
+	"headers_sent" |
+	"hebrev" |
+	"hebrevc" |
+	"hexdec" |
+	"highlight_file" |
+	"highlight_string" |
+	"html_dump_mem" |
+	"html_entity_decode" |
+	"htmlentities" |
+	"htmlspecialchars" |
+	"http_build_query" |
+	("hw_"("array2objrec"|"changeobject"|"children"|"childrenobj"|"close"|"connect"|"connection_info"|"cp"|"deleteobject"|"docbyanchor"|"docbyanchorobj"|"document_attributes"|"document_bodytag"|"document_content"|"document_setcontent"|"document_size"|"dummy"|"edittext"|"error"|"errormsg"|"free_document"|"getanchors"|"getanchorsobj"|"getandlock"|"getchildcoll"|"getchildcollobj"|"getchilddoccoll"|"getchilddoccollobj"|"getobject"|"getobjectbyquery"|"getobjectbyquerycoll"|"getobjectbyquerycollobj"|"getobjectbyqueryobj"|"getparents"|"getparentsobj"|"getrellink"|"getremote"|"getremotechildren"|"getsrcbydestobj"|"gettext"|"getusername"|"identify"|"incollections"|"info"|"inscoll"|"insdoc"|"insertanchors"|"insertdocument"|"insertobject"|"mapid"|"modifyobject"|"mv"|"new_document"|"objrec2array"|"output_document"|"pconnect"|"pipedocument"|"root"|"setlinkroot"|"stat"|"unlock"|"who")) |
+	"hwapi_hgcsp" |
+	"hwstat" |
+	"hypot" |
+	("ibase_"("add_user"|"affected_rows"|"backup"|"blob_add"|"blob_cancel"|"blob_close"|"blob_create"|"blob_echo"|"blob_get"|"blob_import"|"blob_info"|"blob_open"|"close"|"commit"|"commit_ret"|"connect"|"db_info"|"delete_user"|"drop_db"|"errcode"|"errmsg"|"execute"|"fetch_assoc"|"fetch_object"|"fetch_row"|"field_info"|"free_event_handler"|"free_query"|"free_result"|"gen_id"|"maintain_db"|"modify_user"|"name_result"|"num_fields"|"num_params"|"param_info"|"pconnect"|"prepare"|"query"|"restore"|"rollback"|"rollback_ret"|"server_info"|"service_attach"|"service_detach"|"set_event_handler"|"timefmt"|"trans"|"wait_event")) |
+	"iconv" |
+	("iconv_"("get_encoding"|"mime_decode"|"mime_decode_headers"|"mime_encode"|"set_encoding"|"strlen"|"strpos"|"strrpos"|"substr")) |
+	"identify" |
+	"ignore_user_abort" |
+	("image"("2wbmp"|"_type_to_extension"|"_type_to_mime_type"|"alphablending"|"antialias"|"arc"|"char"|"charup"|"colorallocate"|"colorallocatealpha"|"colorat"|"colorclosest"|"colorclosestalpha"|"colorclosesthwb"|"colordeallocate"|"colorexact"|"colorexactalpha"|"colormatch"|"colorresolve"|"colorresolvealpha"|"colorset"|"colorsforindex"|"colorstotal"|"colortransparent"|"copy"|"copymerge"|"copymergegray"|"copyresampled"|"copyresized"|"create"|"createfromgd"|"createfromgd2"|"createfromgd2part"|"createfromgif"|"createfromjpeg"|"createfrompng"|"createfromstring"|"createfromwbmp"|"createfromxbm"|"createfromxpm"|"createtruecolor"|"dashedline"|"destroy"|"ellipse"|"fill"|"filledarc"|"filledellipse"|"filledpolygon"|"filledrectangle"|"filltoborder"|"filter"|"fontheight"|"fontwidth"|"ftbbox"|"fttext"|"gammacorrect"|"gd"|"gd2"|"gif"|"interlace"|"istruecolor"|"jpeg"|"layereffect"|"line"|"loadfont"|"palettecopy"|"png"|"polygon"|"psbbox"|"pscopyfont"|"psencodefont"|"psextendfont"|"psfreefont"|"psloadfont"|"psslantfont"|"pstext"|"rectangle"|"rotate"|"savealpha"|"setbrush"|"setpixel"|"setstyle"|"setthickness"|"settile"|"string"|"stringup"|"sx"|"sy"|"truecolortopalette"|"ttfbbox"|"ttftext"|"types"|"wbmp"|"xbm")) |
+	("imap_"("8bit"|"alerts"|"append"|"base64"|"binary"|"body"|"bodystruct"|"check"|"clearflag_full"|"close"|"createmailbox"|"delete"|"deletemailbox"|"errors"|"expunge"|"fetch_overview"|"fetchbody"|"fetchheader"|"fetchstructure"|"get_quota"|"get_quotaroot"|"getacl"|"getmailboxes"|"getsubscribed"|"header"|"headerinfo"|"headers"|"last_error"|"list"|"listmailbox"|"listscan"|"listsubscribed"|"lsub"|"mail"|"mail_compose"|"mail_copy"|"mail_move"|"mailboxmsginfo"|"mime_header_decode"|"msgno"|"num_msg"|"num_recent"|"open"|"ping"|"qprint"|"renamemailbox"|"reopen"|"rfc822_parse_adrlist"|"rfc822_parse_headers"|"rfc822_write_address"|"scanmailbox"|"search"|"set_quota"|"setacl"|"setflag_full"|"sort"|"status"|"subscribe"|"thread"|"timeout"|"uid"|"undelete"|"unsubscribe"|"utf7_decode"|"utf7_encode"|"utf8")) |
+	"implode" |
+	"import" |
+	"import_request_variables" |
+	"importnode" |
+	"in_array" |
+	"increment" |
+	"inet_ntop" |
+	"inet_pton" |
+	"info" |
+	("ini_"("alter"|"get"|"get_all"|"restore"|"set")) |
+	"insert" |
+	"insert_before" |
+	"insertanchor" |
+	"insertbefore" |
+	"insertcollection" |
+	"insertdata" |
+	"insertdocument" |
+	"interface_exists" |
+	"internal_subset" |
+	"intval" |
+	"ip2long" |
+	"iptcembed" |
+	"iptcparse" |
+	("is_"("a"|"array"|"blank_node"|"bool"|"callable"|"dir"|"double"|"executable"|"file"|"finite"|"float"|"infinite"|"int"|"integer"|"link"|"long"|"nan"|"null"|"numeric"|"object"|"readable"|"real"|"resource"|"scalar"|"soap_fault"|"string"|"subclass_of"|"uploaded_file"|"writable"|"writeable")) |
+	("is"("asp"|"comment"|"dir"|"dot"|"executable"|"file"|"html"|"id"|"jste"|"link"|"php"|"readable"|"samenode"|"supported"|"text"|"whitespaceinelementcontent"|"writable"|"xhtml"|"xml")) |
+	"item" |
+	"iterator_count" |
+	"iterator_to_array" |
+	"java_last_exception_clear" |
+	"java_last_exception_get" |
+	"jddayofweek" |
+	"jdmonthname" |
+	"jdtofrench" |
+	"jdtogregorian" |
+	"jdtojewish" |
+	"jdtojulian" |
+	"jdtounix" |
+	"jewishtojd" |
+	"join" |
+	"jpeg2wbmp" |
+	"juliantojd" |
+	"key" |
+	"krsort" |
+	"ksort" |
+	"langdepvalue" |
+	"last_child" |
+	"lastinsertid" |
+	"lcg_value" |
+	("ldap_"("8859_to_t61"|"add"|"bind"|"close"|"compare"|"connect"|"count_entries"|"delete"|"dn2ufn"|"err2str"|"errno"|"error"|"explode_dn"|"first_attribute"|"first_entry"|"first_reference"|"free_result"|"get_attributes"|"get_dn"|"get_entries"|"get_option"|"get_values"|"get_values_len"|"list"|"mod_add"|"mod_del"|"mod_replace"|"modify"|"next_attribute"|"next_entry"|"next_reference"|"parse_reference"|"parse_result"|"read"|"rename"|"sasl_bind"|"search"|"set_option"|"set_rebind_proc"|"sort"|"start_tls"|"t61_to_8859"|"unbind")) |
+	"levenshtein" |
+	"link" |
+	"linkinfo" |
+	"load" |
+	"loadhtml" |
+	"loadhtmlfile" |
+	"loadxml" |
+	"localeconv" |
+	"localtime" |
+	"lock" |
+	"log" |
+	"log10" |
+	"log1p" |
+	"long2ip" |
+	"lookupnamespaceuri" |
+	"lookupprefix" |
+	"lstat" |
+	"ltrim" |
+	"lzf_compress" |
+	"lzf_decompress" |
+	"lzf_optimized_for" |
+	"mail" |
+	"main" |
+	"max" |
+	("mb_"("convert_case"|"convert_encoding"|"convert_kana"|"convert_variables"|"decode_mimeheader"|"decode_numericentity"|"detect_encoding"|"detect_order"|"encode_mimeheader"|"encode_numericentity"|"ereg"|"ereg_match"|"ereg_replace"|"ereg_search"|"ereg_search_getpos"|"ereg_search_getregs"|"ereg_search_init"|"ereg_search_pos"|"ereg_search_regs"|"ereg_search_setpos"|"eregi"|"eregi_replace"|"get_info"|"http_input"|"http_output"|"internal_encoding"|"language"|"list_encodings"|"output_handler"|"parse_str"|"preferred_mime_name"|"regex_encoding"|"regex_set_options"|"send_mail"|"split"|"strcut"|"strimwidth"|"strlen"|"strpos"|"strrpos"|"strtolower"|"strtoupper"|"strwidth"|"substitute_character"|"substr"|"substr_count")) |
+	("mcal_"("append_event"|"close"|"create_calendar"|"date_compare"|"date_valid"|"day_of_week"|"day_of_year"|"days_in_month"|"delete_calendar"|"delete_event"|"event_add_attribute"|"event_init"|"event_set_alarm"|"event_set_category"|"event_set_class"|"event_set_description"|"event_set_end"|"event_set_recur_daily"|"event_set_recur_monthly_mday"|"event_set_recur_monthly_wday"|"event_set_recur_none"|"event_set_recur_weekly"|"event_set_recur_yearly"|"event_set_start"|"event_set_title"|"expunge"|"fetch_current_stream_event"|"fetch_event"|"is_leap_year"|"list_alarms"|"list_events"|"next_recurrence"|"open"|"popen"|"rename_calendar"|"reopen"|"snooze"|"store_event"|"time_valid"|"week_of_year")) |
+	("mcrypt_"("cbc"|"cfb"|"create_iv"|"decrypt"|"ecb"|"enc_get_algorithms_name"|"enc_get_block_size"|"enc_get_iv_size"|"enc_get_key_size"|"enc_get_modes_name"|"enc_get_supported_key_sizes"|"enc_is_block_algorithm"|"enc_is_block_algorithm_mode"|"enc_is_block_mode"|"enc_self_test"|"encrypt"|"generic"|"generic_deinit"|"generic_end"|"generic_init"|"get_block_size"|"get_cipher_name"|"get_iv_size"|"get_key_size"|"list_algorithms"|"list_modes"|"module_close"|"module_get_algo_block_size"|"module_get_algo_key_size"|"module_get_supported_key_sizes"|"module_is_block_algorithm"|"module_is_block_algorithm_mode"|"module_is_block_mode"|"module_open"|"module_self_test"|"ofb")) |
+	"md5" |
+	"md5_file" |
+	"mdecrypt_generic" |
+	"memcache_debug" |
+	"memory_get_usage" |
+	"metaphone" |
+	"method_exists" |
+	"mhash" |
+	"mhash_count" |
+	"mhash_get_block_size" |
+	"mhash_get_hash_name" |
+	"mhash_keygen_s2k" |
+	"microtime" |
+	"mime_content_type" |
+	"mimetype" |
+	"min" |
+	"ming_setcubicthreshold" |
+	"ming_setscale" |
+	"ming_useswfversion" |
+	"mkdir" |
+	"mktime" |
+	"money_format" |
+	"move" |
+	"move_uploaded_file" |
+	"movepen" |
+	"movepento" |
+	"moveto" |
+	("msession_"("connect"|"count"|"create"|"destroy"|"disconnect"|"find"|"get"|"get_array"|"get_data"|"inc"|"list"|"listvar"|"lock"|"plugin"|"randstr"|"set"|"set_array"|"set_data"|"timeout"|"uniq"|"unlock")) |
+	"msg_get_queue" |
+	"msg_receive" |
+	"msg_remove_queue" |
+	"msg_send" |
+	"msg_set_queue" |
+	"msg_stat_queue" |
+	"msql" |
+	"mt_getrandmax" |
+	"mt_rand" |
+	"mt_srand" |
+	"name" |
+	"natcasesort" |
+	"natsort" |
+	"next" |
+	"next_sibling" |
+	"nextframe" |
+	"ngettext" |
+	"nl2br" |
+	"nl_langinfo" |
+	("node_"("name"|"type"|"value")) |
+	"normalize" |
+	"notations" |
+	("notes_"("body"|"copy_db"|"create_db"|"create_note"|"drop_db"|"find_note"|"header_info"|"list_msgs"|"mark_read"|"mark_unread"|"nav_create"|"search"|"unread"|"version")) |
+	("nsapi_"("request_headers"|"response_headers"|"virtual")) |
+	"number_format" |
+	("ob_"("clean"|"end_clean"|"end_flush"|"flush"|"get_clean"|"get_contents"|"get_flush"|"get_length"|"get_level"|"get_status"|"gzhandler"|"iconv_handler"|"implicit_flush"|"list_handlers"|"start"|"tidyhandler")) |
+	"object" |
+	"objectbyanchor" |
+	("oci"("_bind_by_name"|"_cancel"|"_close"|"_commit"|"_connect"|"_define_by_name"|"_error"|"_execute"|"_fetch"|"_fetch_all"|"_fetch_array"|"_fetch_assoc"|"_fetch_object"|"_fetch_row"|"_field_is_null"|"_field_name"|"_field_precision"|"_field_scale"|"_field_size"|"_field_type"|"_field_type_raw"|"_free_statement"|"_internal_debug"|"_lob_copy"|"_lob_is_equal"|"_new_collection"|"_new_connect"|"_new_cursor"|"_new_descriptor"|"_num_fields"|"_num_rows"|"_parse"|"_password_change"|"_pconnect"|"_result"|"_rollback"|"_server_version"|"_set_prefetch"|"_statement_type"|"bindbyname"|"cancel"|"closelob"|"collappend"|"collassign"|"collassignelem"|"collgetelem"|"collmax"|"collsize"|"colltrim"|"columnisnull"|"columnname"|"columnprecision"|"columnscale"|"columnsize"|"columntype"|"columntyperaw"|"commit"|"definebyname"|"error"|"execute"|"fetch"|"fetchinto"|"fetchstatement"|"freecollection"|"freecursor"|"freedesc"|"freestatement"|"internaldebug"|"loadlob"|"logoff"|"logon"|"newcollection"|"newcursor"|"newdescriptor"|"nlogon"|"numcols"|"parse"|"plogon"|"result"|"rollback"|"rowcount"|"savelob"|"savelobfile"|"serverversion"|"setprefetch"|"statementtype"|"writelobtofile"|"writetemporarylob")) |
+	"octdec" |
+	("odbc_"("autocommit"|"binmode"|"close"|"close_all"|"columnprivileges"|"columns"|"commit"|"connect"|"cursor"|"data_source"|"do"|"error"|"errormsg"|"exec"|"execute"|"fetch_array"|"fetch_into"|"fetch_object"|"fetch_row"|"field_len"|"field_name"|"field_num"|"field_precision"|"field_scale"|"field_type"|"foreignkeys"|"free_result"|"gettypeinfo"|"longreadlen"|"next_result"|"num_fields"|"num_rows"|"pconnect"|"prepare"|"primarykeys"|"procedurecolumns"|"procedures"|"result"|"result_all"|"rollback"|"setoption"|"specialcolumns"|"statistics"|"tableprivileges"|"tables")) |
+	"offsetexists" |
+	"offsetget" |
+	"offsetset" |
+	"offsetunset" |
+	"opendir" |
+	"openlog" |
+	("openssl_"("csr_export"|"csr_export_to_file"|"csr_new"|"csr_sign"|"error_string"|"free_key"|"get_privatekey"|"get_publickey"|"open"|"pkcs7_decrypt"|"pkcs7_encrypt"|"pkcs7_sign"|"pkcs7_verify"|"pkey_export"|"pkey_export_to_file"|"pkey_get_private"|"pkey_get_public"|"pkey_new"|"private_decrypt"|"private_encrypt"|"public_decrypt"|"public_encrypt"|"seal"|"sign"|"verify"|"x509_check_private_key"|"x509_checkpurpose"|"x509_export"|"x509_export_to_file"|"x509_free"|"x509_parse"|"x509_read")) |
+	("ora_"("bind"|"close"|"columnname"|"columnsize"|"columntype"|"commit"|"commitoff"|"commiton"|"do"|"error"|"errorcode"|"exec"|"fetch"|"fetch_into"|"getcolumn"|"logoff"|"logon"|"numcols"|"numrows"|"open"|"parse"|"plogon"|"rollback")) |
+	"ord" |
+	"output" |
+	"output_add_rewrite_var" |
+	"output_reset_rewrite_vars" |
+	"overload" |
+	"override_function" |
+	"owner_document" |
+	"pack" |
+	"parent_node" |
+	"parents" |
+	"parse_ini_file" |
+	"parse_str" |
+	"parse_url" |
+	"parsekit_compile_file" |
+	"parsekit_compile_string" |
+	"parsekit_func_arginfo" |
+	"passthru" |
+	"pathinfo" |
+	"pclose" |
+	("pcntl_"("alarm"|"exec"|"fork"|"getpriority"|"setpriority"|"signal"|"wait"|"waitpid"|"wexitstatus"|"wifexited"|"wifsignaled"|"wifstopped"|"wstopsig"|"wtermsig")) |
+	"pconnect" |
+	("pdf_"("add_annotation"|"add_bookmark"|"add_launchlink"|"add_locallink"|"add_note"|"add_outline"|"add_pdflink"|"add_thumbnail"|"add_weblink"|"arc"|"arcn"|"attach_file"|"begin_page"|"begin_pattern"|"begin_template"|"circle"|"clip"|"close"|"close_image"|"close_pdi"|"close_pdi_page"|"closepath"|"closepath_fill_stroke"|"closepath_stroke"|"concat"|"continue_text"|"curveto"|"delete"|"end_page"|"end_pattern"|"end_template"|"endpath"|"fill"|"fill_stroke"|"findfont"|"fit_pdi_page"|"get_buffer"|"get_font"|"get_fontname"|"get_fontsize"|"get_image_height"|"get_image_width"|"get_majorversion"|"get_minorversion"|"get_parameter"|"get_pdi_parameter"|"get_pdi_value"|"get_value"|"initgraphics"|"lineto"|"load_font"|"makespotcolor"|"moveto"|"new"|"open"|"open_ccitt"|"open_file"|"open_gif"|"open_image"|"open_image_file"|"open_jpeg"|"open_memory_image"|"open_pdi"|"open_pdi_page"|"open_png"|"open_tiff"|"place_image"|"place_pdi_page"|"rect"|"restore"|"rotate"|"save"|"scale"|"set_border_color"|"set_border_dash"|"set_border_style"|"set_char_spacing"|"set_duration"|"set_font"|"set_horiz_scaling"|"set_info"|"set_info_author"|"set_info_creator"|"set_info_keywords"|"set_info_subject"|"set_info_title"|"set_leading"|"set_parameter"|"set_text_matrix"|"set_text_pos"|"set_text_rendering"|"set_text_rise"|"set_value"|"set_word_spacing"|"setcolor"|"setdash"|"setflat"|"setfont"|"setgray"|"setgray_fill"|"setgray_stroke"|"setlinecap"|"setlinejoin"|"setlinewidth"|"setmatrix"|"setmiterlimit"|"setpolydash"|"setrgbcolor"|"setrgbcolor_fill"|"setrgbcolor_stroke"|"show"|"show_boxed"|"show_xy"|"skew"|"stringwidth"|"stroke"|"translate")) |
+	"pfpro_cleanup" |
+	"pfpro_init" |
+	"pfpro_process" |
+	"pfpro_process_raw" |
+	"pfpro_version" |
+	"pfsockopen" |
+	("pg_"("affected_rows"|"cancel_query"|"client_encoding"|"close"|"connect"|"connection_busy"|"connection_reset"|"connection_status"|"convert"|"copy_from"|"copy_to"|"dbname"|"delete"|"end_copy"|"escape_bytea"|"escape_string"|"fetch_all"|"fetch_array"|"fetch_assoc"|"fetch_object"|"fetch_result"|"fetch_row"|"field_is_null"|"field_name"|"field_num"|"field_prtlen"|"field_size"|"field_type"|"free_result"|"get_notify"|"get_pid"|"get_result"|"host"|"insert"|"last_error"|"last_notice"|"last_oid"|"lo_close"|"lo_create"|"lo_export"|"lo_import"|"lo_open"|"lo_read"|"lo_read_all"|"lo_seek"|"lo_tell"|"lo_unlink"|"lo_write"|"meta_data"|"num_fields"|"num_rows"|"options"|"parameter_status"|"pconnect"|"ping"|"port"|"put_line"|"query"|"result_error"|"result_seek"|"result_status"|"select"|"send_query"|"set_client_encoding"|"trace"|"tty"|"unescape_bytea"|"untrace"|"update"|"version")) |
+	"php_check_syntax" |
+	"php_ini_scanned_files" |
+	"php_logo_guid" |
+	"php_sapi_name" |
+	"php_strip_whitespace" |
+	"php_uname" |
+	"phpcredits" |
+	"phpinfo" |
+	"phpversion" |
+	"pi" |
+	"png2wbmp" |
+	"popen" |
+	"pos" |
+	("posix_"("ctermid"|"get_last_error"|"getcwd"|"getegid"|"geteuid"|"getgid"|"getgrgid"|"getgrnam"|"getgroups"|"getlogin"|"getpgid"|"getpgrp"|"getpid"|"getppid"|"getpwnam"|"getpwuid"|"getrlimit"|"getsid"|"getuid"|"isatty"|"kill"|"mkfifo"|"setegid"|"seteuid"|"setgid"|"setpgid"|"setsid"|"setuid"|"strerror"|"times"|"ttyname"|"uname")) |
+	"pow" |
+	"prefix" |
+	"preg_grep" |
+	"preg_match" |
+	"preg_match_all" |
+	"preg_quote" |
+	"preg_replace" |
+	"preg_replace_callback" |
+	"preg_split" |
+	"prepare" |
+	"prev" |
+	"previous_sibling" |
+	"print_r" |
+	("printer_"("abort"|"close"|"create_brush"|"create_dc"|"create_font"|"create_pen"|"delete_brush"|"delete_dc"|"delete_font"|"delete_pen"|"draw_bmp"|"draw_chord"|"draw_elipse"|"draw_line"|"draw_pie"|"draw_rectangle"|"draw_roundrect"|"draw_text"|"end_doc"|"end_page"|"get_option"|"list"|"logical_fontheight"|"open"|"select_brush"|"select_font"|"select_pen"|"set_option"|"start_doc"|"start_page"|"write")) |
+	"printf" |
+	"proc_close" |
+	"proc_get_status" |
+	"proc_nice" |
+	"proc_open" |
+	"proc_terminate" |
+	"process" |
+	"public_id" |
+	"putenv" |
+	"qdom_error" |
+	"qdom_tree" |
+	"query" |
+	"quoted_printable_decode" |
+	"quotemeta" |
+	"rad2deg" |
+	"rand" |
+	"range" |
+	"rar_close" |
+	"rar_entry_get" |
+	"rar_list" |
+	"rar_open" |
+	"rawurldecode" |
+	"rawurlencode" |
+	"read" |
+	"read_exif_data" |
+	"readdir" |
+	"readfile" |
+	"readgzfile" |
+	"readline" |
+	("readline_"("add_history"|"callback_handler_install"|"callback_handler_remove"|"callback_read_char"|"clear_history"|"completion_function"|"info"|"list_history"|"on_new_line"|"read_history"|"redisplay"|"write_history")) |
+	"readlink" |
+	"realpath" |
+	"reason" |
+	"recode" |
+	"recode_file" |
+	"recode_string" |
+	"register_shutdown_function" |
+	"register_tick_function" |
+	"registernamespace" |
+	"relaxngvalidate" |
+	"relaxngvalidatesource" |
+	"remove" |
+	"remove_attribute" |
+	"remove_child" |
+	"removeattribute" |
+	"removeattributenode" |
+	"removeattributens" |
+	"removechild" |
+	"rename" |
+	"rename_function" |
+	"replace" |
+	"replace_child" |
+	"replace_node" |
+	"replacechild" |
+	"replacedata" |
+	"reset" |
+	"restore_error_handler" |
+	"restore_exception_handler" |
+	"restore_include_path" |
+	"result_dump_file" |
+	"result_dump_mem" |
+	"rewind" |
+	"rewinddir" |
+	"rmdir" |
+	"rollback" |
+	"rotate" |
+	"rotateto" |
+	"round" |
+	"rowcount" |
+	"rsort" |
+	"rtrim" |
+	"save" |
+	"savehtml" |
+	"savehtmlfile" |
+	"savexml" |
+	"scale" |
+	"scaleto" |
+	"scandir" |
+	"schemavalidate" |
+	"schemavalidatesource" |
+	"seek" |
+	"sem_acquire" |
+	"sem_get" |
+	"sem_release" |
+	"sem_remove" |
+	"serialize" |
+	("sesam_"("affected_rows"|"commit"|"connect"|"diagnostic"|"disconnect"|"errormsg"|"execimm"|"fetch_array"|"fetch_result"|"fetch_row"|"field_array"|"field_name"|"free_result"|"num_fields"|"query"|"rollback"|"seek_row"|"sesam_settransaction")) |
+	("session_"("cache_expire"|"cache_limiter"|"commit"|"decode"|"destroy"|"encode"|"get_cookie_params"|"id"|"is_registered"|"module_name"|"name"|"regenerate_id"|"register"|"save_path"|"set_cookie_params"|"set_save_handler"|"start"|"unregister"|"unset"|"write_close")) |
+	"set" |
+	("set"("_attribute"|"_content"|"_error_handler"|"_exception_handler"|"_file_buffer"|"_include_path"|"_magic_quotes_runtime"|"_name"|"_namespace"|"_time_limit"|"action"|"attribute"|"attributenode"|"attributenodens"|"attributens"|"background"|"bounds"|"buffering"|"class"|"color"|"commitedversion"|"cookie"|"depth"|"dimension"|"down"|"font"|"frames"|"height"|"hit"|"indentation"|"leftfill"|"leftmargin"|"line"|"linespacing"|"locale"|"margins"|"name"|"over"|"persistence"|"rate"|"ratio"|"rawcookie"|"rightfill"|"rightmargin"|"spacing"|"type"|"up")) |
+	"sha1" |
+	"sha1_file" |
+	"shell_exec" |
+	"shm_attach" |
+	"shm_detach" |
+	"shm_get_var" |
+	"shm_put_var" |
+	"shm_remove" |
+	"shm_remove_var" |
+	"shmop_close" |
+	"shmop_delete" |
+	"shmop_open" |
+	"shmop_read" |
+	"shmop_size" |
+	"shmop_write" |
+	"show_source" |
+	"shuffle" |
+	"similar_text" |
+	"simplexml_import_dom" |
+	"simplexml_load_file" |
+	"simplexml_load_string" |
+	"sin" |
+	"sinh" |
+	"size" |
+	"sizeof" |
+	"skewx" |
+	"skewxto" |
+	"skewy" |
+	"skewyto" |
+	"sleep" |
+	("socket_"("accept"|"bind"|"clear_error"|"close"|"connect"|"create"|"create_listen"|"create_pair"|"get_option"|"get_status"|"getpeername"|"getsockname"|"last_error"|"listen"|"read"|"recv"|"recvfrom"|"select"|"send"|"sendto"|"set_block"|"set_blocking"|"set_nonblock"|"set_option"|"set_timeout"|"shutdown"|"strerror"|"write")) |
+	"sort" |
+	"soundex" |
+	"specified" |
+	"spl_classes" |
+	"split" |
+	"spliti" |
+	"splittext" |
+	"sprintf" |
+	"sql_regcase" |
+	"sqrt" |
+	"srand" |
+	"srcanchors" |
+	"srcsofdst" |
+	"sscanf" |
+	"stat" |
+	("str_"("ireplace"|"pad"|"repeat"|"replace"|"rot13"|"shuffle"|"split"|"word_count")) |
+	"strcasecmp" |
+	"strchr" |
+	"strcmp" |
+	"strcoll" |
+	"strcspn" |
+	("stream_"("context_create"|"context_get_default"|"context_get_options"|"context_set_option"|"context_set_params"|"copy_to_stream"|"filter_append"|"filter_prepend"|"filter_register"|"filter_remove"|"get_contents"|"get_filters"|"get_line"|"get_meta_data"|"get_transports"|"get_wrappers"|"register_wrapper"|"select"|"set_blocking"|"set_timeout"|"set_write_buffer"|"socket_accept"|"socket_client"|"socket_enable_crypto"|"socket_get_name"|"socket_recvfrom"|"socket_sendto"|"socket_server"|"wrapper_register"|"wrapper_restore"|"wrapper_unregister")) |
+	("str"("eammp3"|"ftime"|"ip_tags"|"ipcslashes"|"ipos"|"ipslashes"|"istr"|"len"|"natcasecmp"|"natcmp"|"ncasecmp"|"ncmp"|"pbrk"|"pos"|"ptime"|"rchr"|"rev"|"ripos"|"rpos"|"spn"|"str"|"tok"|"tolower"|"totime"|"toupper"|"tr"|"val")) |
+	"substr" |
+	"substr_compare" |
+	"substr_count" |
+	"substr_replace" |
+	"substringdata" |
+	("swf_"("actiongeturl"|"actiongotoframe"|"actiongotolabel"|"actionnextframe"|"actionplay"|"actionprevframe"|"actionsettarget"|"actionstop"|"actiontogglequality"|"actionwaitforframe"|"addbuttonrecord"|"addcolor"|"closefile"|"definebitmap"|"definefont"|"defineline"|"definepoly"|"definerect"|"definetext"|"endbutton"|"enddoaction"|"endshape"|"endsymbol"|"fontsize"|"fontslant"|"fonttracking"|"getbitmapinfo"|"getfontinfo"|"getframe"|"labelframe"|"lookat"|"modifyobject"|"mulcolor"|"nextid"|"oncondition"|"openfile"|"ortho"|"ortho2"|"perspective"|"placeobject"|"polarview"|"popmatrix"|"posround"|"pushmatrix"|"removeobject"|"rotate"|"scale"|"setfont"|"setframe"|"shapearc"|"shapecurveto"|"shapecurveto3"|"shapefillbitmapclip"|"shapefillbitmaptile"|"shapefilloff"|"shapefillsolid"|"shapelinesolid"|"shapelineto"|"shapemoveto"|"showframe"|"startbutton"|"startdoaction"|"startshape"|"startsymbol"|"textwidth"|"translate"|"viewport")) |
+	"swfbutton_keypress" |
+	"symlink" |
+	"syslog" |
+	"system" |
+	"system_id" |
+	"tagname" |
+	"tan" |
+	"tanh" |
+	"target" |
+	"tcpwrap_check" |
+	"tell" |
+	"tempnam" |
+	"textdomain" |
+	("tidy_"("access_count"|"clean_repair"|"config_count"|"diagnose"|"error_count"|"get_body"|"get_config"|"get_error_buffer"|"get_head"|"get_html"|"get_html_ver"|"get_output"|"get_release"|"get_root"|"get_status"|"getopt"|"is_xhtml"|"is_xml"|"load_config"|"parse_file"|"parse_string"|"repair_file"|"repair_string"|"reset_config"|"save_config"|"set_encoding"|"setopt"|"warning_count")) |
+	"time" |
+	"time_nanosleep" |
+	"title" |
+	"tmpfile" |
+	"token_get_all" |
+	"token_name" |
+	"touch" |
+	"trigger_error" |
+	"trim" |
+	"truncate" |
+	"type" |
+	"uasort" |
+	"ucfirst" |
+	"ucwords" |
+	"uksort" |
+	"umask" |
+	"uniqid" |
+	"unixtojd" |
+	"unlink" |
+	"unlink_node" |
+	"unlock" |
+	"unpack" |
+	"unregister_tick_function" |
+	"unserialize" |
+	"urldecode" |
+	"urlencode" |
+	"user" |
+	"user_error" |
+	"userlist" |
+	"usleep" |
+	"usort" |
+	"utf8_"("decode"|"encode") |
+	"valid" |
+	"validate" |
+	"value" |
+	"values" |
+	"var_"("dump"|"export") |
+	("variant_"("abs"|"add"|"and"|"cast"|"cat"|"cmp"|"date_from_timestamp"|"date_to_timestamp"|"div"|"eqv"|"fix"|"get_type"|"idiv"|"imp"|"int"|"mod"|"mul"|"neg"|"not"|"or"|"pow"|"round"|"set"|"set_type"|"sub"|"xor")) |
+	"version_compare" |
+	"vfprintf" |
+	"virtual" |
+	("vpopmail_"("add_alias_domain"|"add_alias_domain_ex"|"add_domain"|"add_domain_ex"|"add_user"|"alias_add"|"alias_del"|"alias_del_domain"|"alias_get"|"alias_get_all"|"auth_user"|"del_domain"|"del_domain_ex"|"del_user"|"error"|"passwd"|"set_user_quota")) |
+	"vprintf" |
+	"vsprintf" |
+	("w32api_"("deftype"|"init_dtype"|"invoke_function"|"register_function"|"set_call_method")) |
+	"wddx_add_vars" |
+	"wddx_deserialize" |
+	"wddx_packet_end" |
+	"wddx_packet_start" |
+	"wddx_serialize_value" |
+	"wddx_serialize_vars" |
+	"wordwrap" |
+	"write" |
+	"writetemporary" |
+	"xattr_get" |
+	"xattr_list" |
+	"xattr_remove" |
+	"xattr_set" |
+	"xattr_supported" |
+	"xinclude" |
+	("xml"("_error_string"|"_get_current_byte_index"|"_get_current_column_number"|"_get_current_line_number"|"_get_error_code"|"_parse"|"_parse_into_struct"|"_parser_create"|"_parser_create_ns"|"_parser_free"|"_parser_get_option"|"_parser_set_option"|"_set_character_data_handler"|"_set_default_handler"|"_set_element_handler"|"_set_end_namespace_decl_handler"|"_set_external_entity_ref_handler"|"_set_notation_decl_handler"|"_set_object"|"_set_processing_instruction_handler"|"_set_start_namespace_decl_handler"|"_set_unparsed_entity_decl_handler"|"rpc_decode"|"rpc_decode_request"|"rpc_encode"|"rpc_encode_request"|"rpc_get_type"|"rpc_is_fault"|"rpc_parse_method_descriptions"|"rpc_server_add_introspection_data"|"rpc_server_call_method"|"rpc_server_create"|"rpc_server_destroy"|"rpc_server_register_introspection_callback"|"rpc_server_register_method"|"rpc_set_type")) |
+	"xpath" |
+	"xpath_eval" |
+	"xpath_eval_expression" |
+	"xpath_new_context" |
+	"xptr_eval" |
+	"xptr_new_context" |
+	("xsl_xsltprocessor_"("get_parameter"|"has_exslt_support"|"import_stylesheet"|"register_php_functions"|"remove_parameter"|"set_parameter"|"transform_to_doc"|"transform_to_uri"|"transform_to_xml"|"xslt_backend_info")) |
+	("xslt_"("backend_name"|"backend_version"|"create"|"errno"|"error"|"free"|"getopt"|"process"|"set_base"|"set_encoding"|"set_error_handler"|"set_log"|"set_object"|"set_sax_handler"|"set_sax_handlers"|"set_scheme_handler"|"set_scheme_handlers"|"setopt")) |
+	("yp_"("all"|"cat"|"err_string"|"errno"|"first"|"get_default_domain"|"master"|"match"|"next"|"yp_order")) |
+	"zend_logo_guid" |
+	"zend_version" |
+	("zip_"("close"|"entry_close"|"entry_compressedsize"|"entry_compressionmethod"|"entry_filesize"|"entry_name"|"entry_open"|"entry_read"|"open"|"read")) |
+	"zlib_get_coding_type" |
+
+	/* mysql functions */
+	("mysql_"("affected_rows"|"client_encoding"|"close"|"connect"|"create_db"|"data_seek"|"db_"("name"|"query")|"drop_db"|"errno"|"error"|"escape_string"|"fetch_"("array"|"assoc"|"field"|"lengths"|"object"|"row")|"field_"("flags"|"len"|"name"|"seek"|"table"|"type")|"free_result"|"get_"("client_info"|"host_info"|"proto_info"|"server_info")|"info"|"insert_id"|"list_"("dbs"|"fields"|"processes"|"tables")|"num_"("fields"|"rows")|"pconnect"|"ping"|"query"|"real_escape_string"|"result"|"select_db"|"set_charset"|"stat"|"tablename"|"thread_id"|"unbuffered_query")) |
+
+	/* Function aliases */
+	"apache_request_headers" |
+	"apache_response_headers" |
+	"attr_get" |
+	"attr_set" |
+	"autocommit" |
+	"bind_param" |
+	"bind_result" |
+	"bzclose" |
+	"bzflush" |
+	"bzwrite" |
+	"change_user" |
+	"character_set_name" |
+	"checkdnsrr" |
+	"chop" |
+	"client_encoding" |
+	"close" |
+	"commit" |
+	"connect" |
+	"data_seek" |
+	"debug" |
+	"disable_reads_from_master" |
+	"disable_rpl_parse" |
+	"diskfreespace" |
+	"doubleval" |
+	"dump_debug_info" |
+	"enable_reads_from_master" |
+	"enable_rpl_parse" |
+	"escape_string" |
+	"execute" |
+	"fbsql" |
+	"fbsql_tablename" |
+	"fetch" |
+	"fetch_array" |
+	"fetch_assoc" |
+	"fetch_field" |
+	"fetch_field_direct" |
+	"fetch_fields" |
+	"fetch_object" |
+	"fetch_row" |
+	"field_count" |
+	"field_seek" |
+	"fputs" |
+	"free" |
+	"free_result" |
+	"ftp_quit" |
+	"get_client_info" |
+	"get_required_files" |
+	"get_server_info" |
+	"getallheaders" |
+	"getmxrr" |
+	"gmp_div" |
+	("gz"("close"|"eof"|"getc"|"gets"|"getss"|"passthru"|"puts"|"read"|"rewind"|"seek"|"tell"|"gzwrite")) |
+	"imap_create" |
+	"imap_fetchtext" |
+	"imap_header" |
+	"imap_listmailbox" |
+	"imap_listsubscribed" |
+	"imap_rename" |
+	"ini_alter" |
+	"init" |
+	"is_double" |
+	"is_int" |
+	"is_integer" |
+	"is_real" |
+	"is_writeable" |
+	"join" |
+	"key_exists" |
+	"kill" |
+	"ldap_close" |
+	"ldap_modify" |
+	"magic_quotes_runtime" |
+	"master_query" |
+	"ming_keypress" |
+	"ming_setcubicthreshold" |
+	"ming_setscale" |
+	"ming_useconstants" |
+	"ming_useswfversion" |
+	"more_results" |
+	"next_result" |
+	"num_rows" |
+	("oci"("_free_cursor"|"bindbyname"|"cancel"|"collappend"|"collassignelem"|"collgetelem"|"collmax"|"collsize"|"colltrim"|"columnisnull"|"columnname"|"columnprecision"|"columnscale"|"columnsize"|"columntype"|"columntyperaw"|"commit"|"definebyname"|"error"|"execute"|"fetch"|"fetchstatement"|"freecollection"|"freecursor"|"freedesc"|"freestatement"|"internaldebug"|"loadlob"|"logoff"|"logon"|"newcollection"|"newcursor"|"newdescriptor"|"nlogon"|"numcols"|"parse"|"passwordchange"|"plogon"|"result"|"rollback"|"rowcount"|"savelob"|"savelobfile"|"serverversion"|"setprefetch"|"statementtype"|"writelobtofile")) |
+	"odbc_do" |
+	"odbc_field_precision" |
+	"openssl_free_key" |
+	"openssl_get_privatekey" |
+	"openssl_get_publickey" |
+	"options" |
+	("pg_"("clientencoding"|"cmdtuples"|"errormessage"|"exec"|"fieldisnull"|"fieldname"|"fieldnum"|"fieldprtlen"|"fieldsize"|"fieldtype"|"freeresult"|"getlastoid"|"loclose"|"locreate"|"loexport"|"loimport"|"loopen"|"loread"|"loreadall"|"lounlink"|"lowrite"|"numfields"|"numrows"|"result"|"setclientencoding")) |
+	"ping" |
+	"pos" |
+	"posix_errno" |
+	"prepare" |
+	"query" |
+	"read_exif_data" |
+	"real_connect" |
+	"real_escape_string" |
+	"real_query" |
+	"recode" |
+	"reset" |
+	"result_metadata" |
+	"rollback" |
+	"rpl_parse_enabled" |
+	"rpl_probe" |
+	"rpl_query_type" |
+	"select_db" |
+	"send_long_data" |
+	"session_commit" |
+	"set_file_buffer" |
+	"set_local_infile_default" |
+	"set_local_infile_handler" |
+	"set_opt" |
+	"show_source" |
+	"sizeof" |
+	"slave_query" |
+	"snmpwalkoid" |
+	"socket_get_status" |
+	"socket_getopt" |
+	"socket_set_blocking" |
+	"socket_set_timeout" |
+	"socket_setopt" |
+	"sqlite_fetch_string" |
+	"sqlite_has_more" |
+	"ssl_set" |
+	"stat" |
+	"stmt" |
+	"stmt_init" |
+	"store_result" |
+	"strchr" |
+	"stream_register_wrapper" |
+	"thread_safe" |
+	"use_result" |
+	"user_error" |
+	("velocis_"("autocommit"|"close"|"commit"|"connect"|"exec"|"fetch"|"fieldname"|"fieldnum"|"freeresult"|"off_autocommit"|"result"|"rollback")) |
+	"virtual"							{ addToken(Token.FUNCTION); }
+
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+	{PHP_Variable}				{ addToken(Token.VARIABLE); }
+
+	{LineTerminator}				{ addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+	{JS_Identifier}				{ addToken(Token.IDENTIFIER); }
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	[\"]							{ start = zzMarkedPos-1; yybegin(PHP_STRING); }
+	[\']							{ start = zzMarkedPos-1; yybegin(PHP_CHAR); }
+
+	/* Comment literals. */
+	"/**/"						{ addToken(Token.COMMENT_MULTILINE); }
+	{JS_MLCBegin}					{ start = zzMarkedPos-2; yybegin(PHP_MLC); }
+	{PHP_LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+
+	/* Separators. */
+	{JS_Separator}					{ addToken(Token.SEPARATOR); }
+	{JS_Separator2}				{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{JS_Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{JS_IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{JS_HexLiteral}				{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{JS_FloatLiteral}				{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{JS_ErrorNumberFormat}			{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{JS_ErrorIdentifier}			{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+
+	/* Catch any other (unhandled) characters and assume they are okay. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<PHP_MLC> {
+	// PHP MLC's.  This state is essentially Java's MLC state.
+	[^hwf\n\*]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+	\n							{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken; }
+	{JS_MLCEnd}					{ yybegin(PHP); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken; }
+}
+
+
+<PHP_STRING> {
+	[^\n\\\$\"]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken; }
+	\\.?				{ /* Skip escaped chars. */ }
+	{PHP_Variable}		{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	"$"					{}
+	\"					{ yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken; }
+}
+
+
+<PHP_CHAR> {
+	[^\n\\\']+			{}
+	\\.?				{ /* Skip escaped single quotes only, but this should still work. */ }
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken; }
+	\'					{ yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken; }
+}
+
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java	(revision 25584)
@@ -0,0 +1,19608 @@
+/* The following code was generated by JFlex 1.4.1 on 2/6/12 12:14 PM */
+
+/*
+ * 01/28/2009
+ *
+ * PHPTokenMaker.java - Generates tokens for PHP syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for PHP files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PHPTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ *
+ */
+
+public class PHPTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int PHP = 15;
+  public static final int INATTR_SINGLE_SCRIPT = 9;
+  public static final int JS_CHAR = 11;
+  public static final int JS_MLC = 13;
+  public static final int INTAG_SCRIPT = 7;
+  public static final int PHP_MLC = 16;
+  public static final int COMMENT = 1;
+  public static final int INATTR_DOUBLE_SCRIPT = 8;
+  public static final int PHP_STRING = 17;
+  public static final int JAVASCRIPT = 10;
+  public static final int INTAG = 3;
+  public static final int INTAG_CHECK_TAG_NAME = 4;
+  public static final int DTD = 2;
+  public static final int PHP_CHAR = 18;
+  public static final int JS_EOL_COMMENT = 14;
+  public static final int INATTR_SINGLE = 6;
+  public static final int YYINITIAL = 0;
+  public static final int INATTR_DOUBLE = 5;
+  public static final int JS_STRING = 12;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\2\1\0\1\1\1\26\22\0\1\4\1\50\1\7"+
+    "\1\27\1\32\1\47\1\5\1\71\2\70\1\33\1\44\1\43\1\40"+
+    "\1\41\1\10\1\22\1\132\1\125\1\131\1\127\1\110\1\126\1\24"+
+    "\1\133\1\21\1\52\1\6\1\3\1\45\1\17\1\51\1\67\1\73"+
+    "\1\23\1\12\1\101\1\37\1\36\1\103\1\107\1\14\1\111\1\104"+
+    "\1\35\1\77\1\75\1\74\1\15\1\105\1\13\1\11\1\16\1\102"+
+    "\1\106\1\20\1\34\1\76\1\20\1\70\1\30\1\70\1\46\1\31"+
+    "\1\0\1\62\1\112\1\114\1\117\1\60\1\61\1\55\1\66\1\54"+
+    "\1\130\1\113\1\63\1\100\1\116\1\115\1\65\1\124\1\57\1\64"+
+    "\1\56\1\25\1\121\1\72\1\122\1\120\1\123\1\42\1\46\1\42"+
+    "\1\53\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\5\0\2\1\1\0\2\1\11\0\2\2\1\3\1\4"+
+    "\1\5\1\6\1\1\1\7\5\1\1\10\1\11\3\12"+
+    "\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22"+
+    "\2\20\2\22\1\20\2\22\3\20\1\22\6\20\1\22"+
+    "\1\20\1\1\1\23\1\24\1\1\1\25\1\14\1\26"+
+    "\1\27\1\30\1\31\1\32\2\16\1\2\1\33\1\16"+
+    "\2\2\1\16\2\34\1\2\1\31\2\16\1\2\1\35"+
+    "\1\16\12\2\1\36\7\2\1\1\1\37\1\40\1\41"+
+    "\1\1\1\42\1\43\1\44\1\1\1\45\3\1\1\46"+
+    "\4\1\1\47\1\16\1\50\1\16\1\2\1\51\2\2"+
+    "\1\16\13\2\1\31\1\52\16\2\1\1\1\53\2\1"+
+    "\1\54\1\55\1\56\1\1\1\57\1\60\1\61\1\4"+
+    "\2\62\1\63\1\64\1\6\5\0\1\64\32\20\1\22"+
+    "\6\20\1\22\5\20\1\22\33\20\1\65\1\66\3\0"+
+    "\1\67\1\0\1\70\1\16\1\31\1\2\1\16\1\71"+
+    "\1\34\1\72\1\71\1\72\1\71\1\73\1\71\1\2"+
+    "\1\74\2\2\1\74\47\2\1\74\1\2\1\75\1\76"+
+    "\1\77\1\0\1\100\5\0\1\101\10\2\1\102\1\103"+
+    "\100\2\1\74\37\2\1\104\17\2\1\105\42\2\1\74"+
+    "\24\2\1\104\3\2\1\74\27\2\1\106\1\56\1\107"+
+    "\1\60\1\110\1\62\2\0\1\111\4\0\1\12\14\20"+
+    "\1\22\63\20\2\0\1\112\1\0\1\31\1\2\1\72"+
+    "\1\0\2\73\4\2\1\6\56\2\10\0\2\2\1\74"+
+    "\63\2\1\104\32\2\1\104\46\2\1\104\3\2\1\104"+
+    "\32\2\1\74\17\2\1\104\1\2\1\104\6\2\1\104"+
+    "\17\2\1\104\52\2\1\104\15\2\1\31\6\2\1\104"+
+    "\21\2\1\104\15\2\1\104\15\2\1\104\6\2\1\104"+
+    "\33\2\1\104\31\2\1\74\25\2\1\62\1\113\3\0"+
+    "\1\114\1\12\20\20\1\22\11\20\1\22\10\20\2\0"+
+    "\1\115\1\31\7\2\1\116\11\2\1\6\17\2\1\0"+
+    "\1\1\4\0\1\117\4\2\1\104\27\2\1\104\72\2"+
+    "\1\104\14\2\1\104\16\2\1\104\21\2\1\104\1\2"+
+    "\1\74\15\2\1\104\6\2\1\104\4\2\1\104\15\2"+
+    "\1\104\15\2\1\104\5\2\1\104\10\2\1\104\11\2"+
+    "\2\104\107\2\1\104\47\2\1\31\43\2\1\104\111\2"+
+    "\1\104\1\2\1\104\22\2\2\104\54\2\1\62\1\64"+
+    "\2\0\1\64\10\20\1\22\13\20\1\65\1\0\1\31"+
+    "\5\2\1\74\3\2\1\74\12\2\4\0\61\2\1\104"+
+    "\155\2\1\104\23\2\2\104\16\2\1\104\4\2\1\104"+
+    "\5\2\1\74\131\2\1\104\30\2\1\104\42\2\1\74"+
+    "\103\2\1\31\1\104\20\2\1\104\40\2\1\104\12\2"+
+    "\1\74\1\104\1\74\6\2\1\104\1\74\123\2\1\104"+
+    "\30\2\1\104\6\2\1\104\22\2\1\62\12\20\1\0"+
+    "\1\31\13\2\2\0\3\2\1\104\14\2\1\104\62\2"+
+    "\1\104\11\2\1\104\135\2\4\104\53\2\2\104\2\2"+
+    "\1\104\41\2\1\104\125\2\1\104\2\2\1\74\52\2"+
+    "\1\74\51\2\2\104\31\2\1\31\137\2\1\104\22\2"+
+    "\1\104\100\2\1\104\1\2\1\104\11\2\1\104\47\2"+
+    "\1\120\3\20\1\0\5\2\2\0\31\2\1\104\111\2"+
+    "\1\104\11\2\1\74\35\2\1\104\1\2\1\104\13\2"+
+    "\2\104\6\2\1\104\1\2\1\104\33\2\1\104\27\2"+
+    "\3\104\133\2\1\104\172\2\1\104\60\2\1\31\26\2"+
+    "\1\104\117\2\1\104\213\2\1\20\1\0\2\2\2\0"+
+    "\161\2\1\104\37\2\1\104\32\2\1\104\24\2\1\74"+
+    "\47\2\1\104\46\2\1\104\161\2\1\104\16\2\1\104"+
+    "\5\2\1\104\24\2\1\104\230\2\1\104\131\2\1\20"+
+    "\1\121\1\2\1\122\1\123\21\2\1\104\22\2\1\104"+
+    "\1\2\1\104\13\2\1\104\7\2\1\104\1\2\1\104"+
+    "\52\2\1\104\15\2\1\104\53\2\1\104\155\2\1\104"+
+    "\13\2\1\104\117\2\1\104\65\2\1\104\115\2\2\104"+
+    "\21\2\1\104\130\2\1\104\223\2\1\104\4\2\1\104"+
+    "\66\2\1\104\51\2\1\104\26\2\1\104\103\2\1\104"+
+    "\146\2\1\104\122\2\1\104\50\2\1\104\14\2\1\104"+
+    "\10\2\1\104\103\2\1\104\3\2\1\104\111\2\1\104"+
+    "\74\2\1\104\31\2\1\104\213\2\1\104\121\2\1\104"+
+    "\20\2\1\104\2\2\1\104\160\2\1\104\15\2\1\104"+
+    "\10\2\1\104\11\2\1\104\3\2\2\104\4\2\1\104"+
+    "\16\2\1\104\301\2\1\104\2\2\1\104\120\2\1\104"+
+    "\7\2\1\104\22\2\1\104\22\2\1\104\102\2\1\104"+
+    "\43\2\1\104\23\2\2\104\112\2\1\104\45\2\1\104"+
+    "\6\2\1\104\23\2\1\104\3\2\1\104\1\2\1\104"+
+    "\70\2\1\104\23\2\1\104\7\2\1\104\5\2\1\104"+
+    "\263\2\2\104\114\2\1\104\1\2\1\104\2\2\1\104"+
+    "\11\2\1\104\125\2\1\104\57\2\1\104\3\2\1\104"+
+    "\44\2\1\104\27\2\1\104\165\2\1\104\160\2\1\104"+
+    "\32\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[7729];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\134\0\270\0\u0114\0\u0170\0\u01cc\0\u0228\0\u0284"+
+    "\0\u02e0\0\u033c\0\u0398\0\u03f4\0\u0450\0\u04ac\0\u0508\0\u0564"+
+    "\0\u05c0\0\u061c\0\u0678\0\u06d4\0\u0730\0\u078c\0\u07e8\0\u0844"+
+    "\0\u08a0\0\u08fc\0\u078c\0\u0958\0\u09b4\0\u0a10\0\u0a6c\0\u0ac8"+
+    "\0\u078c\0\u078c\0\u0b24\0\u0b80\0\u0bdc\0\u078c\0\u0c38\0\u078c"+
+    "\0\u078c\0\u078c\0\u0c94\0\u078c\0\u0cf0\0\u0d4c\0\u0da8\0\u0e04"+
+    "\0\u0e60\0\u0ebc\0\u0f18\0\u0f74\0\u0fd0\0\u102c\0\u1088\0\u10e4"+
+    "\0\u1140\0\u119c\0\u11f8\0\u1254\0\u12b0\0\u130c\0\u0c94\0\u1368"+
+    "\0\u13c4\0\u1420\0\u078c\0\u147c\0\u078c\0\u14d8\0\u078c\0\u078c"+
+    "\0\u078c\0\u1534\0\u078c\0\u1590\0\u15ec\0\u078c\0\u078c\0\u1648"+
+    "\0\u16a4\0\u1700\0\u175c\0\u17b8\0\u1814\0\u1870\0\u078c\0\u18cc"+
+    "\0\u1928\0\u1984\0\u078c\0\u19e0\0\u1a3c\0\u1a98\0\u1af4\0\u1b50"+
+    "\0\u1bac\0\u1c08\0\u1c64\0\u1cc0\0\u1d1c\0\u1d78\0\u078c\0\u1dd4"+
+    "\0\u1e30\0\u1e8c\0\u1ee8\0\u1f44\0\u1fa0\0\u1ffc\0\u2058\0\u078c"+
+    "\0\u20b4\0\u078c\0\u2110\0\u078c\0\u078c\0\u20b4\0\u216c\0\u078c"+
+    "\0\u21c8\0\u2224\0\u2280\0\u078c\0\u22dc\0\u2338\0\u2394\0\u23f0"+
+    "\0\u078c\0\u244c\0\u078c\0\u24a8\0\u2504\0\u2560\0\u25bc\0\u2618"+
+    "\0\u2674\0\u26d0\0\u272c\0\u2788\0\u27e4\0\u2840\0\u289c\0\u28f8"+
+    "\0\u2954\0\u29b0\0\u2a0c\0\u2a68\0\u2ac4\0\u078c\0\u2b20\0\u2b7c"+
+    "\0\u2bd8\0\u2c34\0\u2c90\0\u2cec\0\u2d48\0\u2da4\0\u2e00\0\u2e5c"+
+    "\0\u2eb8\0\u2f14\0\u2f70\0\u2fcc\0\u3028\0\u078c\0\u3084\0\u30e0"+
+    "\0\u078c\0\u078c\0\u313c\0\u3198\0\u078c\0\u31f4\0\u078c\0\u3250"+
+    "\0\u32ac\0\u3308\0\u3364\0\u33c0\0\u078c\0\u341c\0\u3478\0\u34d4"+
+    "\0\u3530\0\u358c\0\u35e8\0\u3644\0\u36a0\0\u36fc\0\u3758\0\u37b4"+
+    "\0\u3810\0\u386c\0\u38c8\0\u3924\0\u3980\0\u39dc\0\u3a38\0\u3a94"+
+    "\0\u3af0\0\u3b4c\0\u3ba8\0\u3c04\0\u3c60\0\u3cbc\0\u3d18\0\u3d74"+
+    "\0\u3dd0\0\u3e2c\0\u3e88\0\u3ee4\0\u3f40\0\u3f9c\0\u3ff8\0\u4054"+
+    "\0\u40b0\0\u410c\0\u4168\0\u41c4\0\u4220\0\u427c\0\u42d8\0\u4334"+
+    "\0\u4390\0\u43ec\0\u4448\0\u44a4\0\u4500\0\u455c\0\u45b8\0\u4614"+
+    "\0\u4670\0\u46cc\0\u4728\0\u4784\0\u47e0\0\u483c\0\u4898\0\u48f4"+
+    "\0\u4950\0\u49ac\0\u4a08\0\u4a64\0\u4ac0\0\u4b1c\0\u4b78\0\u4bd4"+
+    "\0\u4c30\0\u4c8c\0\u4ce8\0\u4d44\0\u4da0\0\u4dfc\0\u4e58\0\u078c"+
+    "\0\u18cc\0\u4eb4\0\u4f10\0\u078c\0\u4f6c\0\u4fc8\0\u4f10\0\u5024"+
+    "\0\u5080\0\u50dc\0\u5138\0\u5138\0\u5138\0\u5194\0\u51f0\0\u524c"+
+    "\0\u52a8\0\u5304\0\u5360\0\u16a4\0\u53bc\0\u5418\0\u5474\0\u54d0"+
+    "\0\u552c\0\u5588\0\u55e4\0\u5640\0\u569c\0\u56f8\0\u5754\0\u57b0"+
+    "\0\u580c\0\u5868\0\u58c4\0\u5920\0\u597c\0\u59d8\0\u5a34\0\u5a90"+
+    "\0\u5aec\0\u5b48\0\u5ba4\0\u5c00\0\u5c5c\0\u5cb8\0\u5d14\0\u5d70"+
+    "\0\u5dcc\0\u5e28\0\u5e84\0\u5ee0\0\u5f3c\0\u5f98\0\u5ff4\0\u6050"+
+    "\0\u60ac\0\u6108\0\u6164\0\u61c0\0\u621c\0\u6278\0\u62d4\0\u6330"+
+    "\0\u078c\0\u638c\0\u63e8\0\u6444\0\u078c\0\u64a0\0\u64fc\0\u6558"+
+    "\0\u65b4\0\u6610\0\u4fc8\0\u666c\0\u66c8\0\u6724\0\u6780\0\u67dc"+
+    "\0\u6838\0\u6894\0\u68f0\0\u694c\0\u078c\0\u69a8\0\u6a04\0\u6a60"+
+    "\0\u6abc\0\u6b18\0\u6b74\0\u6bd0\0\u6c2c\0\u6c88\0\u6ce4\0\u6d40"+
+    "\0\u6d9c\0\u6df8\0\u6e54\0\u6eb0\0\u6f0c\0\u6f68\0\u6fc4\0\u7020"+
+    "\0\u707c\0\u70d8\0\u7134\0\u7190\0\u71ec\0\u7248\0\u72a4\0\u7300"+
+    "\0\u735c\0\u73b8\0\u7414\0\u7470\0\u74cc\0\u7528\0\u7584\0\u75e0"+
+    "\0\u763c\0\u7698\0\u76f4\0\u7750\0\u77ac\0\u7808\0\u7864\0\u78c0"+
+    "\0\u791c\0\u7978\0\u79d4\0\u7a30\0\u7a8c\0\u7ae8\0\u7b44\0\u7ba0"+
+    "\0\u7bfc\0\u7c58\0\u7cb4\0\u7d10\0\u7d6c\0\u7dc8\0\u7e24\0\u7e80"+
+    "\0\u7edc\0\u7f38\0\u7f94\0\u7ff0\0\u804c\0\u80a8\0\u8104\0\u8160"+
+    "\0\u81bc\0\u8218\0\u8274\0\u82d0\0\u832c\0\u8388\0\u83e4\0\u8440"+
+    "\0\u849c\0\u84f8\0\u8554\0\u85b0\0\u860c\0\u8668\0\u86c4\0\u8720"+
+    "\0\u877c\0\u87d8\0\u8834\0\u8890\0\u88ec\0\u8948\0\u89a4\0\u8a00"+
+    "\0\u8a5c\0\u8ab8\0\u8b14\0\u8b70\0\u8bcc\0\u8c28\0\u8c84\0\u8ce0"+
+    "\0\u8d3c\0\u8d98\0\u8df4\0\u8e50\0\u8eac\0\u8f08\0\u8f64\0\u8fc0"+
+    "\0\u901c\0\u9078\0\u90d4\0\u9130\0\u918c\0\u91e8\0\u9244\0\u92a0"+
+    "\0\u92fc\0\u9358\0\u93b4\0\u9410\0\u946c\0\u94c8\0\u9524\0\u9580"+
+    "\0\u95dc\0\u9638\0\u9694\0\u96f0\0\u974c\0\u97a8\0\u9804\0\u9860"+
+    "\0\u98bc\0\u9918\0\u9974\0\u99d0\0\u9a2c\0\u9a88\0\u9ae4\0\u9b40"+
+    "\0\u9b9c\0\u9bf8\0\u9c54\0\u9cb0\0\u9d0c\0\u9d68\0\u9dc4\0\u9e20"+
+    "\0\u9e7c\0\u9ed8\0\u9f34\0\u9f90\0\u9fec\0\ua048\0\ua0a4\0\ua100"+
+    "\0\ua15c\0\ua1b8\0\ua214\0\ua270\0\ua2cc\0\ua328\0\ua384\0\ua3e0"+
+    "\0\ua43c\0\ua498\0\ua4f4\0\ua550\0\ua5ac\0\u16a4\0\ua608\0\ua664"+
+    "\0\ua6c0\0\ua71c\0\ua778\0\ua7d4\0\ua830\0\ua88c\0\ua8e8\0\ua944"+
+    "\0\ua9a0\0\ua9fc\0\uaa58\0\uaab4\0\uab10\0\uab6c\0\uabc8\0\uac24"+
+    "\0\uac80\0\uacdc\0\uad38\0\uad94\0\uadf0\0\uae4c\0\uaea8\0\uaf04"+
+    "\0\uaf60\0\u078c\0\u078c\0\uafbc\0\u078c\0\u3250\0\ub018\0\ub074"+
+    "\0\ub0d0\0\u078c\0\ub12c\0\ub188\0\ub1e4\0\ub240\0\ub29c\0\ub2f8"+
+    "\0\ub354\0\ub3b0\0\ub40c\0\ub468\0\ub4c4\0\ub520\0\ub57c\0\ub5d8"+
+    "\0\ub634\0\ub690\0\ub6ec\0\ub748\0\ub7a4\0\ub800\0\ub85c\0\ub8b8"+
+    "\0\ub914\0\ub970\0\ub9cc\0\uba28\0\uba84\0\ubae0\0\ubb3c\0\ubb98"+
+    "\0\u4220\0\ubbf4\0\ubc50\0\ubcac\0\ubd08\0\ubd64\0\ubdc0\0\ube1c"+
+    "\0\ube78\0\ubed4\0\ubf30\0\ubf8c\0\ubfe8\0\uc044\0\uc0a0\0\uc0fc"+
+    "\0\uc158\0\uc1b4\0\uc210\0\uc26c\0\uc2c8\0\uc324\0\uc380\0\u0f74"+
+    "\0\uc3dc\0\uc438\0\uc494\0\uc4f0\0\uc54c\0\uc5a8\0\uc604\0\uc660"+
+    "\0\uc6bc\0\uc718\0\uc774\0\uc7d0\0\uc82c\0\uc888\0\uc8e4\0\uc940"+
+    "\0\uc99c\0\uc9f8\0\uca54\0\ucab0\0\ucb0c\0\ucb68\0\ucbc4\0\u5138"+
+    "\0\ucc20\0\ucc7c\0\uccd8\0\ucd34\0\ucd90\0\ucdec\0\uce48\0\ucea4"+
+    "\0\ucf00\0\ucf5c\0\ucfb8\0\ud014\0\ud070\0\ud0cc\0\ud128\0\ud184"+
+    "\0\ud1e0\0\ud23c\0\ud298\0\ud2f4\0\ud350\0\ud3ac\0\ud408\0\ud464"+
+    "\0\ud4c0\0\ud51c\0\ud578\0\ud5d4\0\ud630\0\ud68c\0\ud6e8\0\ud744"+
+    "\0\ud7a0\0\ud7fc\0\ud858\0\ud8b4\0\ud910\0\ud96c\0\ud9c8\0\uda24"+
+    "\0\uda80\0\udadc\0\udb38\0\udb94\0\udbf0\0\udc4c\0\udca8\0\udd04"+
+    "\0\udd60\0\uddbc\0\ude18\0\ude74\0\uded0\0\udf2c\0\udf88\0\udfe4"+
+    "\0\ue040\0\ue09c\0\ue0f8\0\ue154\0\ue1b0\0\ue20c\0\ue268\0\ue2c4"+
+    "\0\ue320\0\ue37c\0\ue3d8\0\ue434\0\ue490\0\ue4ec\0\ue548\0\ue5a4"+
+    "\0\ue600\0\ue65c\0\ue6b8\0\ue714\0\ue770\0\ue7cc\0\ue828\0\ue884"+
+    "\0\ue8e0\0\ue93c\0\ue998\0\ue9f4\0\uea50\0\ueaac\0\ueb08\0\ueb64"+
+    "\0\uebc0\0\uec1c\0\uec78\0\uecd4\0\ued30\0\ued8c\0\uede8\0\uee44"+
+    "\0\ueea0\0\ueefc\0\uef58\0\uefb4\0\uf010\0\uf06c\0\uf0c8\0\uf124"+
+    "\0\uf180\0\uf1dc\0\uf238\0\uf294\0\uf2f0\0\uf34c\0\uf3a8\0\uf404"+
+    "\0\uf460\0\uf4bc\0\uf518\0\uf574\0\uf5d0\0\uf62c\0\uf688\0\uf6e4"+
+    "\0\uf740\0\uf79c\0\uf7f8\0\uf854\0\uf8b0\0\uf90c\0\uf968\0\uf9c4"+
+    "\0\ufa20\0\ufa7c\0\ufad8\0\ufb34\0\ufb90\0\ufbec\0\ufc48\0\ufca4"+
+    "\0\ufd00\0\ufd5c\0\ufdb8\0\ufe14\0\ufe70\0\ufecc\0\uff28\0\uff84"+
+    "\0\uffe0\1\74\1\230\1\364\1\u0150\1\u01ac\1\u0208\1\u0264"+
+    "\1\u02c0\1\u031c\1\u0378\1\u03d4\1\u0430\1\u048c\1\u04e8\1\u0544"+
+    "\1\u05a0\1\u05fc\1\u0658\1\u06b4\1\u0710\1\u076c\1\u07c8\1\u0824"+
+    "\1\u0880\1\u08dc\1\u0938\1\u0994\1\u09f0\0\ufecc\1\u0a4c\1\u0aa8"+
+    "\1\u0b04\1\u0b60\1\u0bbc\1\u0c18\1\u0c74\1\u0cd0\1\u0d2c\1\u0d88"+
+    "\1\u0de4\1\u0e40\1\u0e9c\1\u0ef8\1\u0f54\1\u0fb0\1\u100c\1\u1068"+
+    "\1\u10c4\1\u1120\1\u117c\1\u11d8\1\u1234\1\u1290\1\u12ec\1\u1348"+
+    "\1\u13a4\1\u1400\1\u145c\1\u14b8\1\u1514\1\u1570\1\u15cc\1\u1628"+
+    "\1\u1684\1\u16e0\1\u173c\1\u1798\1\u17f4\1\u1850\1\u18ac\1\u1908"+
+    "\1\u1964\1\u19c0\1\u1a1c\1\u1a78\1\u1ad4\1\u1b30\1\u1b8c\1\u1be8"+
+    "\1\u1c44\1\u1ca0\1\u1cfc\0\ud4c0\1\u1d58\1\u1db4\1\u1e10\1\u1e6c"+
+    "\1\u1ec8\1\u1f24\1\u1f80\1\u1fdc\1\u2038\1\u2094\1\u20f0\1\u214c"+
+    "\1\u21a8\1\u2204\1\u2260\1\u22bc\1\u2318\1\u2374\1\u23d0\1\u242c"+
+    "\1\u2488\1\u24e4\1\u2540\1\u259c\1\u25f8\1\u2654\1\u26b0\1\u270c"+
+    "\1\u2768\1\u27c4\1\u2820\1\u287c\1\u28d8\1\u2934\1\u2990\1\u29ec"+
+    "\1\u2a48\1\u2aa4\1\u2b00\1\u2b5c\1\u2bb8\1\u2c14\1\u2c70\1\u2ccc"+
+    "\1\u2d28\1\u2d84\1\u2de0\1\u2e3c\1\u2e98\1\u2ef4\1\u2f50\1\u2fac"+
+    "\1\u3008\1\u3064\1\u30c0\1\u311c\1\u3178\1\u31d4\1\u3230\1\u328c"+
+    "\1\u32e8\1\u3344\1\u33a0\1\u33fc\1\u3458\1\u34b4\1\u3510\1\u356c"+
+    "\1\u35c8\1\u3624\1\u3680\1\u36dc\1\u3738\1\u3794\1\u37f0\1\u384c"+
+    "\1\u38a8\1\u3904\1\u3960\1\u39bc\1\u3a18\1\u3a74\1\u3ad0\1\u3b2c"+
+    "\1\u3b88\1\u3be4\1\u3c40\1\u3c9c\1\u3cf8\1\u3d54\1\u3db0\1\u3e0c"+
+    "\1\u3e68\1\u3ec4\1\u3f20\1\u3f7c\1\u3fd8\1\u4034\1\u4090\1\u40ec"+
+    "\1\u4148\1\u41a4\1\u4200\1\u425c\1\u42b8\1\u4314\1\u4370\1\u43cc"+
+    "\1\u4428\1\u4484\1\u44e0\1\u453c\1\u4598\1\u45f4\1\u4650\1\u46ac"+
+    "\1\u4708\1\u4764\1\u47c0\1\u481c\1\u4878\1\u48d4\1\u4930\1\u498c"+
+    "\1\u49e8\1\u4a44\1\u4aa0\1\u4afc\1\u4b58\1\u4bb4\1\u4c10\1\u4c6c"+
+    "\1\u4cc8\1\u4d24\1\u4d80\1\u4ddc\1\u4e38\1\u4e94\1\u4ef0\1\u4f4c"+
+    "\1\u4fa8\1\u5004\1\u5060\1\u50bc\1\u5118\1\u5174\1\u51d0\1\u522c"+
+    "\1\u5288\1\u52e4\1\u5340\1\u539c\1\u53f8\1\u5454\1\u54b0\1\u550c"+
+    "\1\u5568\1\u55c4\1\u5620\1\u567c\1\u56d8\1\u5734\1\u5790\1\u57ec"+
+    "\1\u5848\1\u58a4\1\u5900\1\u595c\1\u59b8\0\ufe14\1\u5a14\1\u5a70"+
+    "\1\u5acc\1\u5b28\1\u5b84\1\u5be0\1\u5c3c\1\u5c98\1\u5cf4\1\u5d50"+
+    "\1\u5dac\1\u5e08\1\u5e64\1\u5ec0\1\u5f1c\1\u5f78\1\u5fd4\1\u6030"+
+    "\1\u608c\1\u60e8\1\u6144\1\u61a0\1\u61fc\1\u6258\1\u62b4\1\u6310"+
+    "\1\u636c\1\u63c8\1\u6424\1\u6480\1\u64dc\1\u6538\1\u6594\1\u65f0"+
+    "\1\u664c\1\u66a8\1\u6704\1\u6760\1\u67bc\1\u6818\1\u6874\1\u68d0"+
+    "\1\u692c\1\u6988\1\u69e4\1\u6a40\1\u6a9c\1\u6af8\0\u078c\1\u6b54"+
+    "\1\u6bb0\1\u6c0c\1\u6c68\1\u6cc4\1\u6d20\1\u6d7c\1\u6dd8\1\u6e34"+
+    "\1\u6e90\1\u6eec\1\u6f48\1\u6fa4\1\u7000\1\u705c\1\u70b8\1\u7114"+
+    "\1\u7170\1\u71cc\1\u7228\1\u7284\1\u72e0\1\u733c\1\u7398\1\u73f4"+
+    "\1\u7450\1\u74ac\1\u7508\1\u7564\1\u75c0\1\u761c\0\ube78\1\u7678"+
+    "\0\u4448\1\u76d4\1\u7730\1\u778c\1\u77e8\1\u7844\1\u78a0\1\u78fc"+
+    "\1\u7958\0\u078c\1\u79b4\1\u7a10\1\u7a6c\1\u7ac8\1\u7b24\1\u7b80"+
+    "\1\u7bdc\1\u7c38\0\u16a4\1\u7c94\1\u7cf0\1\u7d4c\1\u7da8\1\u7e04"+
+    "\1\u7e60\1\u7ebc\1\u7f18\1\u7f74\0\u16a4\1\u7fd0\1\u802c\1\u8088"+
+    "\1\u80e4\1\u8140\1\u819c\1\u81f8\1\u8254\1\u82b0\1\u830c\1\u8368"+
+    "\1\u83c4\1\u8420\1\u847c\1\u84d8\0\u63e8\0\u078c\1\u8534\1\u8590"+
+    "\1\u85ec\1\u8648\1\u86a4\1\u8700\1\u875c\1\u87b8\1\u8814\1\u8870"+
+    "\1\u88cc\1\u8928\1\u8984\1\u89e0\1\u8a3c\1\u8a98\1\u8af4\1\u8b50"+
+    "\1\u8bac\1\u8c08\1\u8c64\1\u8cc0\1\u8d1c\1\u8d78\1\u8dd4\1\u8e30"+
+    "\1\u8e8c\1\u8ee8\1\u8f44\1\u8fa0\1\u8ffc\1\u9058\1\u90b4\1\u9110"+
+    "\1\u916c\1\u91c8\1\u9224\1\u9280\1\u92dc\1\u9338\1\u9394\1\u93f0"+
+    "\1\u944c\1\u94a8\1\u9504\1\u9560\1\u95bc\1\u9618\1\u9674\1\u96d0"+
+    "\1\u972c\1\u9788\1\u97e4\1\u9840\1\u989c\1\u98f8\1\u9954\1\u99b0"+
+    "\1\u9a0c\1\u9a68\1\u9ac4\1\u9b20\1\u9110\1\u9b7c\1\u9bd8\1\u9c34"+
+    "\1\u9c90\1\u9cec\1\u9d48\1\u9da4\1\u9e00\1\u9e5c\1\u9eb8\1\u9f14"+
+    "\1\u9f70\1\u9fcc\1\ua028\1\ua084\1\ua0e0\1\ua13c\1\ua198\1\ua1f4"+
+    "\1\ua250\1\ua2ac\1\ua308\1\ua364\1\ua3c0\1\ua41c\1\ua478\1\ua4d4"+
+    "\1\ua530\1\ua58c\0\u7808\1\ua5e8\1\ua644\1\ua6a0\1\ua6fc\1\ua758"+
+    "\1\ua7b4\1\ua810\1\ua86c\1\ua8c8\1\ua924\1\ua980\1\ua9dc\1\uaa38"+
+    "\1\uaa94\1\uaaf0\1\uab4c\1\uaba8\1\uac04\1\uac60\1\uacbc\1\uad18"+
+    "\1\uad74\1\uadd0\1\uae2c\1\uae88\1\uaee4\1\uaf40\1\uaf9c\1\uaff8"+
+    "\1\ub054\1\ub0b0\1\ub10c\1\ub168\1\ub1c4\1\ub220\1\ub27c\1\ub2d8"+
+    "\1\ub334\1\ub390\1\ub3ec\1\ub448\1\ub4a4\1\ub500\1\ub55c\1\ub5b8"+
+    "\1\ub614\1\ub670\1\ub6cc\1\ub728\1\ub784\1\ub7e0\1\ub83c\1\ub898"+
+    "\1\ub8f4\1\ub950\1\ub9ac\1\uba08\1\uba64\1\ubac0\1\ubb1c\1\ubb78"+
+    "\1\ubbd4\1\ubc30\1\ubc8c\1\ubce8\1\ubd44\1\ubda0\1\ubdfc\1\ube58"+
+    "\1\ubeb4\1\ubf10\1\ubf6c\1\ubfc8\1\uc024\1\uc080\1\uc0dc\1\uc138"+
+    "\1\uc194\1\uc1f0\1\uc24c\1\uc2a8\1\uc304\1\uc360\1\uc3bc\1\uc418"+
+    "\1\uc474\1\uc4d0\1\uc52c\1\uc588\1\uc5e4\1\uc640\1\uc69c\1\uc6f8"+
+    "\1\uc754\1\uc7b0\1\uc80c\1\uc868\1\uc8c4\1\uc920\1\uc97c\1\uc9d8"+
+    "\0\uf740\1\uca34\1\uca90\1\ucaec\1\ucb48\1\ucba4\1\ucc00\1\ucc5c"+
+    "\1\uccb8\1\ucd14\1\ucd70\1\ucdcc\1\uce28\1\uce84\1\ucee0\1\ucf3c"+
+    "\1\ucf98\1\ucff4\1\ud050\1\ud0ac\1\ud108\1\ud164\1\ud1c0\1\ud21c"+
+    "\1\ud278\1\u7fd0\1\ud2d4\1\ud330\1\ud38c\1\ud3e8\1\ud444\1\ud4a0"+
+    "\1\ud4fc\1\ud558\1\ud5b4\1\ud610\1\ud66c\1\ud6c8\1\ud724\1\ud780"+
+    "\1\ud7dc\1\ud838\1\ud894\1\ud8f0\1\ud94c\1\ud9a8\1\uda04\1\uda60"+
+    "\1\udabc\1\udb18\1\udb74\1\udbd0\1\udc2c\1\udc88\1\udce4\1\udd40"+
+    "\1\udd9c\1\uddf8\1\ude54\1\udeb0\1\udf0c\1\udf68\1\udfc4\1\ue020"+
+    "\1\ue07c\1\ue0d8\1\ue134\1\ue190\1\ue1ec\1\ue248\1\ue2a4\1\ue300"+
+    "\1\ue35c\1\ue3b8\1\ue414\1\ue470\1\ue4cc\1\ue528\1\ue584\1\ue5e0"+
+    "\1\ue63c\1\ue698\1\ue6f4\1\ue750\1\ue7ac\1\ue808\1\ue864\1\ue8c0"+
+    "\1\ue91c\1\ue978\1\ue9d4\1\uea30\1\uea8c\1\ueae8\1\ueb44\1\ueba0"+
+    "\1\uebfc\1\uec58\1\uecb4\1\ued10\1\ued6c\1\uedc8\1\uee24\1\uee80"+
+    "\1\ueedc\1\uef38\1\uef94\1\ueff0\1\uf04c\1\uf0a8\1\uf104\1\uf160"+
+    "\1\uf1bc\1\uf218\1\uf274\1\uf2d0\1\uf32c\1\uf388\1\uf3e4\1\uf440"+
+    "\1\uf49c\1\uf4f8\1\uf554\1\uf5b0\1\uf60c\1\u4d80\1\uf668\1\uf6c4"+
+    "\1\uf720\1\uf77c\1\uf7d8\1\uf834\1\uf890\1\uf8ec\1\uf948\1\uf9a4"+
+    "\1\ufa00\1\ufa5c\1\ufab8\1\ufb14\1\ufb70\1\ufbcc\1\ufc28\1\ufc84"+
+    "\1\ufce0\1\ufd3c\1\ufd98\1\ufdf4\1\ufe50\1\ufeac\1\uff08\1\uff64"+
+    "\1\uffc0\2\34\2\170\2\324\2\u0130\2\u018c\2\u01e8\2\u0244"+
+    "\2\u02a0\2\u02fc\2\u0358\2\u03b4\2\u0410\2\u046c\2\u04c8\2\u0524"+
+    "\2\u0580\2\u05dc\2\u0638\2\u0694\2\u06f0\2\u074c\2\u07a8\2\u0804"+
+    "\2\u0860\2\u08bc\2\u0918\2\u0974\2\u09d0\2\u0a2c\2\u0a88\2\u0ae4"+
+    "\2\u0b40\2\u0b9c\2\u0bf8\2\u0c54\2\u0cb0\2\u0d0c\2\u0d68\2\u0dc4"+
+    "\2\u0e20\2\u0e7c\2\u0ed8\2\u0f34\2\u0f90\2\u0fec\2\u1048\2\u10a4"+
+    "\2\u1100\2\u115c\2\u11b8\2\u1214\2\u1270\2\u12cc\2\u1328\2\u1384"+
+    "\2\u13e0\2\u143c\2\u1498\2\u14f4\2\u1550\2\u15ac\2\u1608\2\u1664"+
+    "\2\u16c0\2\u171c\2\u1778\2\u17d4\2\u1830\2\u188c\2\u18e8\2\u1944"+
+    "\2\u19a0\2\u19fc\2\u1a58\2\u1ab4\2\u1b10\2\u1b6c\2\u1bc8\2\u1c24"+
+    "\2\u1c80\2\u1cdc\2\u1d38\2\u1d94\2\u1df0\2\u1e4c\2\u1ea8\2\u1f04"+
+    "\2\u1f60\2\u1fbc\2\u2018\2\u2074\2\u20d0\2\u212c\2\u2188\2\u21e4"+
+    "\2\u2240\2\u229c\2\u22f8\2\u2354\2\u23b0\2\u240c\2\u2468\2\u24c4"+
+    "\2\u2520\2\u257c\2\u25d8\2\u2634\2\u2690\2\u26ec\2\u2748\2\u27a4"+
+    "\2\u2800\2\u285c\2\u28b8\2\u2914\2\u2970\2\u29cc\2\u2a28\2\u2a84"+
+    "\2\u2ae0\2\u2b3c\2\u2b98\2\u2bf4\2\u2c50\2\u2cac\2\u2d08\2\u2d64"+
+    "\2\u2dc0\2\u2e1c\2\u2e78\2\u2ed4\2\u2f30\2\u2f8c\2\u2fe8\2\u3044"+
+    "\2\u30a0\2\u30fc\2\u3158\2\u31b4\2\u3210\2\u326c\2\u32c8\2\u3324"+
+    "\2\u3380\2\u33dc\2\u3438\2\u3494\2\u34f0\2\u354c\2\u35a8\2\u3604"+
+    "\2\u3660\2\u36bc\2\u3718\2\u3774\2\u37d0\2\u382c\2\u3888\2\u38e4"+
+    "\2\u3940\2\u399c\2\u39f8\2\u3a54\0\u078c\2\u3ab0\1\u6c68\0\u0b24"+
+    "\2\u3b0c\2\u3b68\2\u3bc4\2\u3c20\2\u3c7c\2\u3cd8\2\u3d34\2\u3d90"+
+    "\2\u3dec\2\u3dec\2\u3e48\2\u3ea4\2\u3f00\2\u3f5c\2\u3fb8\2\u4014"+
+    "\2\u4070\2\u40cc\2\u4128\2\u4184\0\u078c\2\u41e0\2\u423c\2\u4298"+
+    "\2\u42f4\2\u4350\2\u43ac\2\u4408\0\ucfb8\2\u4464\2\u44c0\2\u451c"+
+    "\2\u4578\2\u45d4\2\u4630\2\u468c\2\u46e8\2\u4744\2\u47a0\2\u47fc"+
+    "\2\u4858\2\u48b4\2\u4910\2\u496c\2\u49c8\2\u4a24\1\u86a4\2\u4a80"+
+    "\2\u4adc\2\u4b38\2\u4b94\2\u4bf0\2\u4c4c\2\u4ca8\2\u4d04\2\u4d60"+
+    "\2\u4dbc\2\u4e18\2\u4e74\2\u4ed0\2\u4f2c\2\u4f88\2\u4fe4\2\u5040"+
+    "\2\u509c\2\u50f8\2\u5154\2\u51b0\2\u520c\2\u5268\0\u8c28\2\u52c4"+
+    "\2\u5320\2\u537c\2\u53d8\2\u5434\2\u5490\2\u54ec\2\u5548\2\u55a4"+
+    "\2\u5600\2\u565c\2\u56b8\2\u5714\2\u5770\2\u57cc\2\u5828\2\u5884"+
+    "\2\u58e0\2\u593c\2\u5998\2\u59f4\2\u5a50\2\u5aac\2\u5b08\2\u5b64"+
+    "\2\u5bc0\2\u5c1c\2\u5c78\2\u5cd4\2\u5d30\2\u5d8c\2\u5de8\2\u5e44"+
+    "\2\u5ea0\2\u5efc\2\u5f58\2\u5fb4\2\u6010\2\u606c\2\u60c8\2\u6124"+
+    "\2\u6180\2\u61dc\2\u6238\2\u6294\2\u62f0\2\u634c\2\u63a8\2\u6404"+
+    "\2\u6460\2\u64bc\2\u6518\2\u6574\2\u65d0\2\u662c\2\u6688\2\u66e4"+
+    "\2\u6740\2\u679c\2\u67f8\2\u6854\2\u68b0\2\u690c\2\u6968\2\u69c4"+
+    "\2\u6a20\2\u6a7c\2\u6ad8\2\u6b34\2\u6b90\2\u6bec\2\u6c48\2\u6ca4"+
+    "\2\u6d00\2\u6d5c\2\u6db8\2\u6e14\2\u6e70\2\u6ecc\2\u6f28\2\u6f84"+
+    "\2\u6fe0\2\u703c\2\u7098\2\u70f4\2\u7150\2\u71ac\2\u7208\2\u7264"+
+    "\2\u72c0\2\u731c\2\u7378\2\u73d4\2\u7430\2\u748c\2\u74e8\2\u7544"+
+    "\2\u75a0\2\u75fc\2\u7658\2\u76b4\2\u7710\2\u776c\2\u77c8\2\u7824"+
+    "\2\u7880\2\u78dc\2\u7938\2\u7994\2\u79f0\2\u7a4c\2\u7aa8\2\u7b04"+
+    "\2\u7b60\2\u7bbc\2\u7c18\2\u7c74\2\u7cd0\2\u7d2c\2\u7d88\2\u7de4"+
+    "\2\u7e40\2\u7e9c\2\u7ef8\2\u7f54\2\u7fb0\2\u800c\2\u8068\2\u80c4"+
+    "\2\u8120\2\u817c\2\u81d8\2\u8234\2\u8290\2\u82ec\2\u8348\2\u83a4"+
+    "\2\u8400\2\u845c\2\u84b8\2\u8514\2\u8570\2\u85cc\2\u8628\2\u8684"+
+    "\2\u86e0\2\u873c\2\u8798\2\u87f4\2\u8850\2\u88ac\2\u8908\2\u8964"+
+    "\2\u89c0\2\u8a1c\2\u7824\2\u8a78\2\u8ad4\2\u8b30\2\u8b8c\2\u8be8"+
+    "\2\u8c44\2\u8ca0\2\u8cfc\2\u8d58\2\u8db4\2\u8e10\2\u8e6c\2\u8ec8"+
+    "\2\u8f24\2\u8f80\2\u8fdc\2\u9038\2\u9094\2\u8a78\2\u90f0\2\u914c"+
+    "\2\u91a8\2\u9204\2\u9260\2\u92bc\2\u9318\2\u9374\2\u93d0\2\u942c"+
+    "\2\u9488\2\u94e4\2\u9540\2\u959c\2\u95f8\2\u9654\2\u96b0\2\u970c"+
+    "\2\u9768\2\u97c4\2\u9820\2\u987c\2\u98d8\2\u9934\2\u9990\2\u99ec"+
+    "\2\u9a48\2\u9aa4\2\u9b00\2\u9b5c\2\u9bb8\2\u9c14\2\u9c70\2\u9ccc"+
+    "\2\u9d28\2\u9d84\2\u9de0\2\u9e3c\2\u9e98\2\u9ef4\2\u9f50\2\u9fac"+
+    "\2\ua008\2\ua064\2\ua0c0\2\ua11c\2\ua178\2\ua1d4\2\ua230\2\ua28c"+
+    "\2\ua2e8\2\ua344\2\ua3a0\2\ua3fc\2\ua458\2\ua4b4\1\uc024\2\ua510"+
+    "\2\ua56c\2\ua5c8\2\ua624\2\ua680\2\ua6dc\2\ua738\2\ua794\2\ua7f0"+
+    "\2\ua84c\2\ua8a8\2\ua904\2\ua960\2\ua9bc\2\uaa18\2\uaa74\2\uaad0"+
+    "\2\uab2c\2\uab88\2\uabe4\2\uac40\2\uac9c\2\uacf8\2\uad54\2\uadb0"+
+    "\2\uae0c\2\uae68\2\uaec4\2\uaf20\2\uaf7c\2\uafd8\2\ub034\2\ub090"+
+    "\2\ub0ec\2\ub148\2\ub1a4\2\ub200\2\ub25c\2\ub2b8\2\ub314\2\ub370"+
+    "\2\ub3cc\2\ub428\2\ub484\2\ub4e0\2\ub53c\2\ub598\2\ub5f4\2\ub650"+
+    "\2\ub6ac\2\ub708\2\ub764\2\ub7c0\2\ub81c\2\ub878\2\ub8d4\2\ub930"+
+    "\2\ub98c\2\ub9e8\2\uba44\2\ubaa0\2\ubafc\2\ubb58\2\ubbb4\2\ubc10"+
+    "\2\ubc6c\2\ubcc8\2\ubd24\2\ubd80\2\ubddc\2\ube38\2\ube94\2\ubef0"+
+    "\2\ubf4c\2\ubfa8\2\uc004\2\uc060\2\uc0bc\2\uc118\2\uc174\2\uc1d0"+
+    "\2\uc22c\2\uc288\2\uc2e4\2\uc340\2\uc39c\2\uc3f8\2\uc454\2\uc4b0"+
+    "\2\uc50c\2\uc568\2\uc5c4\2\uc620\2\uc67c\2\uc6d8\2\uc734\2\uc790"+
+    "\2\uc7ec\2\uc848\2\uc8a4\2\uc900\2\uc95c\2\uc9b8\2\uca14\2\uca70"+
+    "\2\ucacc\2\ucb28\2\ucb84\2\ucbe0\2\ucc3c\2\ucc98\2\uccf4\2\ucd50"+
+    "\2\ucdac\2\uce08\2\uce64\2\ucec0\2\ucf1c\2\ucf78\2\ucfd4\2\ud030"+
+    "\2\ud08c\2\ud0e8\2\ud144\2\ud1a0\2\ud1fc\2\ud258\2\ud2b4\2\ud310"+
+    "\2\ud36c\2\ud3c8\2\ud424\2\ud480\2\ud4dc\2\ud538\2\ud594\2\ud5f0"+
+    "\2\ud64c\2\ud6a8\2\ud704\2\ud760\2\ud7bc\2\ud818\2\ud874\2\ud8d0"+
+    "\2\ud92c\2\ud988\2\ud9e4\2\uda40\2\uda9c\2\udaf8\2\udb54\2\udbb0"+
+    "\2\udc0c\2\udc68\2\udcc4\2\udd20\2\udd7c\2\uddd8\2\ude34\2\ude90"+
+    "\2\udeec\2\udf48\2\udfa4\2\ue000\2\ue05c\2\ue0b8\2\ue114\2\ue170"+
+    "\2\ue1cc\2\ue228\2\ue284\2\ue2e0\2\ue33c\2\ue398\2\ue3f4\2\ue450"+
+    "\2\ue4ac\2\ue508\2\ue564\2\ue5c0\2\ue61c\2\ue678\2\ue6d4\2\ue730"+
+    "\2\ue78c\2\ue7e8\2\ue844\2\ue8a0\2\ue8fc\2\ue958\2\ue9b4\2\uea10"+
+    "\2\uea6c\2\ueac8\2\ueb24\2\ueb80\2\uebdc\2\uec38\2\uec94\2\uecf0"+
+    "\2\ued4c\2\ueda8\2\uee04\2\uee60\2\ueebc\2\uef18\2\uef74\2\uefd0"+
+    "\2\uf02c\2\uf088\2\uf0e4\2\uf140\2\uf19c\2\uf1f8\2\uf254\2\uf2b0"+
+    "\2\uf30c\2\uf368\2\uf3c4\2\uf420\2\uf47c\2\uf4d8\2\uf534\2\uf590"+
+    "\2\uf5ec\2\uf648\2\uf6a4\2\uf700\2\uf75c\2\uf7b8\2\uf814\2\uf870"+
+    "\2\uf8cc\2\uf928\2\uf984\2\uf9e0\2\ufa3c\2\ufa98\2\ufaf4\2\ufb50"+
+    "\2\ufbac\2\ufc08\2\ufc64\2\ufcc0\2\ufd1c\2\ufd78\2\ufdd4\2\ufe30"+
+    "\2\ufe8c\2\ufee8\2\uff44\2\uffa0\2\ufffc\3\130\3\264\3\u0110"+
+    "\3\u016c\3\u01c8\3\u0224\3\u0280\3\u02dc\3\u0338\3\u0394\3\u03f0"+
+    "\3\u044c\3\u04a8\3\u0504\3\u0560\3\u05bc\3\u0618\3\u0674\3\u06d0"+
+    "\3\u072c\3\u0788\3\u07e4\3\u0840\3\u089c\3\u08f8\3\u0954\3\u09b0"+
+    "\3\u0a0c\3\u0a68\3\u0ac4\3\u0b20\3\u0b7c\3\u0bd8\3\u0c34\3\u0c90"+
+    "\3\u0cec\3\u0d48\3\u0da4\3\u0e00\3\u0e5c\3\u0eb8\3\u0f14\3\u0f70"+
+    "\3\u0fcc\3\u1028\3\u1084\3\u10e0\3\u113c\3\u1198\3\u11f4\3\u1250"+
+    "\3\u12ac\3\u1308\3\u1364\3\u13c0\3\u141c\3\u1478\3\u14d4\3\u1530"+
+    "\3\u158c\3\u15e8\3\u1644\3\u16a0\3\u16fc\3\u1758\3\u17b4\3\u1810"+
+    "\3\u186c\3\u18c8\3\u1924\3\u1980\3\u19dc\3\u1a38\3\u1a94\3\u1af0"+
+    "\3\u1b4c\3\u1ba8\3\u1c04\3\u1c60\3\u1cbc\3\u1d18\3\u1d74\3\u1dd0"+
+    "\3\u1e2c\3\u1e88\3\u1ee4\3\u1f40\3\u1f9c\3\u1ff8\3\u2054\3\u20b0"+
+    "\3\u210c\3\u2168\3\u21c4\3\u2220\0\uf6e4\3\u227c\3\u22d8\3\u2334"+
+    "\3\u2390\3\u23ec\3\u2448\3\u24a4\3\u2500\3\u255c\3\u25b8\3\u2614"+
+    "\3\u2670\3\u26cc\3\u2728\3\u2784\3\u27e0\3\u283c\3\u2898\3\u28f4"+
+    "\3\u2950\3\u29ac\3\u2a08\3\u2a64\3\u2ac0\3\u2b1c\3\u2b78\3\u2bd4"+
+    "\3\u2c30\3\u2c8c\3\u2ce8\3\u2d44\3\u2da0\3\u2dfc\3\u2e58\3\u2eb4"+
+    "\3\u2f10\3\u2f6c\3\u2fc8\3\u3024\3\u3080\3\u30dc\3\u3138\3\u3194"+
+    "\3\u31f0\3\u324c\3\u32a8\3\u3304\3\u3360\3\u33bc\3\u3418\3\u3474"+
+    "\3\u34d0\3\u352c\3\u3588\3\u35e4\3\u3640\3\u369c\3\u36f8\3\u3754"+
+    "\3\u37b0\3\u380c\3\u3868\3\u38c4\3\u3920\3\u397c\3\u39d8\3\u3a34"+
+    "\3\u3a90\3\u3aec\3\u3b48\3\u3ba4\3\u3c00\3\u3c5c\3\u3cb8\3\u3d14"+
+    "\3\u3d70\3\u3dcc\3\u3e28\3\u3e84\3\u3ee0\3\u3f3c\3\u3f98\3\u3ff4"+
+    "\3\u4050\3\u40ac\3\u4108\3\u4164\3\u41c0\3\u421c\3\u4278\3\u42d4"+
+    "\3\u4330\3\u438c\3\u43e8\3\u4444\3\u44a0\3\u44fc\3\u4558\3\u45b4"+
+    "\3\u4610\3\u466c\3\u46c8\3\u4724\3\u4780\3\u47dc\3\u4838\3\u4894"+
+    "\3\u48f0\3\u494c\3\u49a8\3\u4a04\3\u4a60\3\u4abc\3\u4b18\3\u4b74"+
+    "\3\u4bd0\3\u4c2c\3\u4c88\3\u4ce4\3\u4d40\3\u4d9c\3\u4df8\3\u4e54"+
+    "\3\u4eb0\3\u4f0c\3\u4f68\3\u4fc4\3\u5020\3\u507c\3\u50d8\3\u5134"+
+    "\3\u5190\3\u51ec\3\u5248\3\u52a4\3\u5300\3\u535c\3\u53b8\3\u5414"+
+    "\3\u5470\3\u54cc\3\u5528\3\u5584\3\u55e0\3\u563c\3\u5698\3\u56f4"+
+    "\3\u5750\3\u57ac\3\u5808\3\u5864\3\u58c0\3\u591c\3\u5978\3\u59d4"+
+    "\3\u5a30\3\u5a8c\3\u5ae8\3\u5b44\3\u5ba0\3\u5bfc\3\u5c58\3\u5cb4"+
+    "\3\u5d10\3\u5d6c\3\u5dc8\3\u5e24\3\u5e80\3\u5edc\3\u5f38\3\u5f94"+
+    "\3\u5ff0\3\u604c\3\u60a8\3\u6104\3\u6160\3\u61bc\3\u6218\3\u6274"+
+    "\3\u62d0\3\u632c\3\u6388\3\u63e4\3\u6440\3\u649c\3\u64f8\3\u6554"+
+    "\3\u65b0\3\u660c\3\u6668\3\u66c4\3\u6720\3\u677c\3\u67d8\3\u6834"+
+    "\3\u6890\3\u68ec\3\u6948\3\u69a4\3\u6a00\3\u6a5c\3\u6ab8\3\u6b14"+
+    "\3\u6b70\3\u6bcc\3\u6c28\3\u6c84\3\u6ce0\3\u6d3c\3\u6d98\3\u6df4"+
+    "\3\u6e50\3\u6eac\3\u6f08\3\u6f64\3\u6fc0\3\u701c\3\u7078\3\u70d4"+
+    "\3\u7130\3\u718c\3\u71e8\0\u7414\3\u7244\3\u72a0\3\u72fc\3\u7358"+
+    "\3\u73b4\3\u7410\3\u746c\3\u74c8\3\u7524\3\u7580\3\u75dc\3\u7638"+
+    "\3\u7694\3\u76f0\3\u774c\3\u77a8\3\u7804\3\u7860\3\u78bc\3\u7918"+
+    "\3\u7974\3\u79d0\3\u7a2c\3\u7a88\3\u7ae4\3\u7b40\3\u7b9c\3\u7bf8"+
+    "\3\u7c54\3\u7cb0\3\u7d0c\3\u7d68\3\u7dc4\3\u7e20\3\u7e7c\3\u7ed8"+
+    "\3\u7f34\3\u7f90\3\u7fec\3\u8048\3\u80a4\3\u8100\3\u815c\3\u81b8"+
+    "\3\u8214\3\u8270\3\u82cc\3\u8328\3\u8384\3\u83e0\3\u843c\3\u8498"+
+    "\3\u84f4\3\u8550\3\u85ac\3\u8608\3\u8664\3\u86c0\3\u871c\3\u8778"+
+    "\3\u87d4\3\u8830\3\u888c\3\u88e8\3\u8944\3\u89a0\3\u89fc\3\u8a58"+
+    "\3\u8ab4\3\u8b10\3\u8b6c\3\u8bc8\3\u8c24\3\u8c80\3\u8cdc\3\u8d38"+
+    "\3\u8d94\3\u8df0\3\u8e4c\3\u8ea8\3\u8f04\3\u8f60\3\u8fbc\3\u9018"+
+    "\3\u9074\3\u90d0\3\u912c\3\u9188\3\u91e4\3\u9240\3\u929c\3\u92f8"+
+    "\3\u9354\3\u93b0\3\u940c\3\u9468\3\u94c4\3\u9520\3\u957c\3\u95d8"+
+    "\3\u9634\3\u9690\3\u96ec\3\u9748\3\u97a4\3\u9800\3\u985c\3\u98b8"+
+    "\3\u9914\3\u9970\3\u99cc\3\u9a28\3\u9a84\3\u9ae0\3\u9b3c\3\u9b98"+
+    "\3\u9bf4\3\u9c50\3\u9cac\3\u9d08\3\u9d64\3\u9dc0\3\u9e1c\3\u9e78"+
+    "\3\u9ed4\3\u9f30\3\u9f8c\3\u9fe8\3\ua044\3\ua0a0\3\ua0fc\3\ua158"+
+    "\3\ua1b4\3\ua210\3\ua26c\3\ua2c8\3\ua324\3\ua380\3\ua3dc\3\ua438"+
+    "\3\ua494\3\ua4f0\3\ua54c\3\ua5a8\3\ua604\3\ua660\3\ua6bc\3\ua718"+
+    "\3\ua774\3\ua7d0\3\ua82c\3\ua888\3\ua8e4\3\ua940\3\ua99c\3\ua9f8"+
+    "\3\uaa54\3\uaab0\3\uab0c\3\uab68\3\uabc4\3\uac20\3\uac7c\3\uacd8"+
+    "\3\uad34\3\uad90\3\uadec\3\uae48\3\uaea4\3\uaf00\3\uaf5c\3\uafb8"+
+    "\3\ub014\3\uaf5c\3\ub070\3\ub0cc\3\ub128\3\ub184\3\ub1e0\3\ub23c"+
+    "\3\ub298\3\ub2f4\3\ub350\3\ub3ac\3\ub408\3\ub464\3\ub4c0\3\ub51c"+
+    "\3\ub578\3\ub5d4\3\ub630\3\ub68c\3\ub6e8\3\ub744\3\ub7a0\3\ub7fc"+
+    "\3\ub858\3\ub8b4\3\ub910\3\ub96c\3\ub9c8\3\uba24\3\uba80\3\ubadc"+
+    "\3\ubb38\3\ubb94\3\ubbf0\3\ubc4c\3\ubca8\3\ubd04\3\ubd60\3\ubdbc"+
+    "\3\ube18\3\ube74\3\ubed0\3\ubf2c\3\ubf88\3\ubfe4\3\uc040\3\uc09c"+
+    "\3\uc0f8\3\uc154\3\uc1b0\3\uc20c\3\uc268\3\uc2c4\3\uc320\3\uc37c"+
+    "\3\uc3d8\3\uc434\3\uc490\3\uc4ec\3\uc548\3\uc5a4\3\uc600\3\uc65c"+
+    "\3\uc6b8\3\uc714\3\uc770\3\uc7cc\3\uc828\3\uc884\3\uc8e0\3\uc93c"+
+    "\3\uc998\3\uc9f4\3\uca50\3\ucaac\3\ucb08\3\ucb64\3\ucbc0\3\ucc1c"+
+    "\3\ucc78\3\uccd4\3\ucd30\3\ucd8c\3\ucde8\3\uce44\3\ucea0\2\u6f28"+
+    "\3\ucefc\3\ucf58\3\ucfb4\3\ud010\3\ud06c\3\ud0c8\3\ud124\3\ud180"+
+    "\3\ud1dc\3\ud238\3\ud294\3\ud2f0\3\ud34c\3\ud3a8\3\ud404\3\ud460"+
+    "\3\ud4bc\3\ud518\3\ud574\3\ud5d0\3\ud62c\3\ud688\3\ud6e4\3\ud740"+
+    "\3\ud79c\3\ud7f8\3\ud854\3\ud8b0\3\ud90c\3\ud968\3\ud9c4\3\uda20"+
+    "\3\uda7c\3\udad8\3\udb34\3\udb90\3\udbec\3\udc48\3\udca4\1\u4878"+
+    "\3\udd00\3\udd5c\3\uddb8\3\ude14\3\ude70\3\udecc\3\udf28\3\udf84"+
+    "\3\udfe0\3\ue03c\3\ue098\3\ue0f4\3\ue150\3\ue1ac\3\ue208\3\ue264"+
+    "\3\ue2c0\3\ue31c\3\ue378\3\ue3d4\3\ue430\3\ue48c\3\ue4e8\3\ue544"+
+    "\3\ue5a0\3\ue5fc\3\ue658\3\ue6b4\3\ue710\3\ue76c\3\ue7c8\3\ue824"+
+    "\3\ue880\3\ue8dc\3\ue938\3\ue994\3\ue9f0\3\uea4c\3\ueaa8\3\ueb04"+
+    "\3\ueb60\3\uebbc\3\uec18\3\uec74\3\uecd0\3\ued2c\3\ued88\3\uede4"+
+    "\3\uee40\3\uee9c\3\ueef8\3\uef54\3\uefb0\3\uf00c\3\uf068\3\uf0c4"+
+    "\3\uf120\3\uf17c\3\uf1d8\3\uf234\3\uf290\3\uf2ec\3\uf348\3\uf3a4"+
+    "\3\uf400\3\uf45c\3\uf4b8\3\uf514\3\uf570\3\uf5cc\3\uf628\3\uf684"+
+    "\3\uf6e0\3\uf73c\3\uf798\3\uf7f4\3\uf850\3\uf8ac\3\uf908\3\uf964"+
+    "\3\uf9c0\3\ufa1c\3\ufa78\3\ufad4\3\ufb30\3\ufb8c\3\ufbe8\3\ufc44"+
+    "\3\ufca0\3\ufcfc\3\ufd58\3\ufdb4\3\ufe10\3\ufe6c\3\ufec8\3\uff24"+
+    "\3\uff80\3\uffdc\4\70\4\224\4\360\4\u014c\4\u01a8\4\u0204"+
+    "\4\u0260\4\u02bc\4\u0318\4\u0374\4\u03d0\4\u042c\4\u0488\4\u04e4"+
+    "\4\u0540\4\u059c\4\u05f8\4\u0654\4\u06b0\4\u070c\4\u0768\4\u07c4"+
+    "\4\u0820\4\u087c\4\u08d8\4\u0934\4\u0990\4\u09ec\4\u0a48\4\u0aa4"+
+    "\4\u0b00\4\u0b5c\4\u0bb8\4\u0c14\4\u0c70\4\u0ccc\4\u0d28\4\u0d84"+
+    "\4\u0de0\4\u0e3c\4\u0e98\4\u0ef4\4\u0f50\4\u0fac\4\u1008\4\u1064"+
+    "\4\u10c0\4\u111c\4\u1178\4\u11d4\4\u1230\4\u128c\4\u12e8\4\u1344"+
+    "\4\u13a0\4\u13fc\4\u1458\4\u14b4\4\u1510\4\u156c\4\u15c8\4\u1624"+
+    "\4\u1680\4\u16dc\4\u1738\4\u1794\4\u17f0\4\u184c\4\u18a8\4\u1904"+
+    "\4\u1960\4\u19bc\4\u1a18\4\u1a74\4\u1ad0\4\u1b2c\4\u1b88\4\u1be4"+
+    "\4\u1c40\4\u1c9c\4\u1cf8\4\u1d54\4\u1db0\4\u1e0c\4\u1e68\4\u1ec4"+
+    "\4\u1f20\4\u1f7c\4\u1fd8\4\u2034\4\u2090\4\u20ec\4\u2148\4\u21a4"+
+    "\4\u2200\4\u225c\4\u22b8\4\u2314\4\u2370\4\u23cc\4\u2428\4\u2484"+
+    "\4\u24e0\4\u253c\4\u2598\4\u25f4\4\u2650\4\u26ac\4\u2708\4\u2764"+
+    "\4\u27c0\4\u281c\4\u2878\4\u28d4\4\u2930\4\u298c\4\u29e8\4\u2a44"+
+    "\4\u2aa0\0\u3308\4\u2afc\4\u2b58\4\u2bb4\4\u2c10\4\u2c6c\4\u2cc8"+
+    "\4\u2d24\4\u2d80\4\u2ddc\4\u2e38\4\u2e94\4\u2ef0\4\u2f4c\4\u2fa8"+
+    "\4\u3004\4\u3060\4\u30bc\4\u3118\4\u3174\4\u31d0\4\u322c\4\u3288"+
+    "\4\u32e4\4\u3340\4\u339c\4\u33f8\4\u3454\4\u34b0\4\u350c\4\u3568"+
+    "\4\u35c4\4\u3620\4\u367c\4\u36d8\4\u3734\4\u3790\2\u0e7c\4\u37ec"+
+    "\4\u3848\4\u38a4\4\u3900\4\u395c\4\u39b8\4\u3a14\4\u3a70\4\u3acc"+
+    "\4\u3b28\4\u3b84\4\u3be0\4\u3c3c\4\u3c98\4\u3cf4\4\u3d50\4\u3dac"+
+    "\4\u3e08\4\u3e64\4\u3ec0\4\u3f1c\4\u3f78\4\u3fd4\4\u4030\4\u408c"+
+    "\4\u40e8\4\u4144\4\u41a0\4\u41fc\4\u4258\4\u42b4\4\u4310\4\u436c"+
+    "\4\u43c8\4\u4424\4\u4480\4\u44dc\4\u4538\4\u4594\4\u45f0\4\u464c"+
+    "\4\u46a8\4\u4704\4\u4760\4\u47bc\4\u4818\4\u4874\4\u48d0\4\u492c"+
+    "\4\u4988\4\u49e4\4\u4a40\4\u4a9c\4\u4af8\4\u4b54\4\u4bb0\4\u4c0c"+
+    "\4\u4c68\4\u4cc4\4\u4d20\4\u4d7c\4\u4dd8\4\u4e34\4\u4e90\4\u4eec"+
+    "\4\u4f48\4\u4fa4\4\u5000\4\u505c\4\u50b8\4\u5114\4\u5170\4\u51cc"+
+    "\4\u5228\4\u5284\4\u52e0\4\u533c\4\u5398\4\u53f4\4\u5450\4\u54ac"+
+    "\4\u5508\4\u5564\4\u55c0\4\u561c\4\u5678\4\u56d4\4\u5730\4\u578c"+
+    "\4\u57e8\4\u5844\4\u58a0\4\u58fc\4\u5958\4\u59b4\4\u5a10\4\u5a6c"+
+    "\4\u5ac8\4\u5b24\4\u5b80\4\u5bdc\4\u5c38\4\u5c94\4\u5cf0\4\u5d4c"+
+    "\4\u5da8\4\u5e04\4\u5e60\4\u5ebc\4\u5f18\4\u5f74\4\u5fd0\4\u602c"+
+    "\4\u6088\4\u60e4\4\u6140\4\u619c\2\uf3c4\4\u61f8\4\u6254\4\u62b0"+
+    "\4\u630c\4\u6368\4\u63c4\4\u6420\4\u647c\4\u64d8\4\u6534\0\ueaac"+
+    "\4\u6590\4\u65ec\4\u6648\4\u66a4\4\u6700\4\u675c\1\uae2c\4\u67b8"+
+    "\4\u6814\4\u6870\4\u68cc\4\u6928\4\u6984\4\u69e0\4\u6a3c\4\u6a98"+
+    "\4\u6af4\4\u6b50\4\u6bac\4\u6c08\4\u6c64\4\u6cc0\4\u6d1c\4\u6d78"+
+    "\4\u6dd4\4\u6e30\4\u6e8c\4\u6ee8\4\u6f44\4\u6fa0\4\u6ffc\4\u7058"+
+    "\4\u70b4\4\u7110\4\u716c\4\u71c8\4\u7224\4\u7280\4\u72dc\4\u7338"+
+    "\4\u7394\4\u73f0\4\u744c\4\u74a8\4\u7504\4\u7560\4\u75bc\4\u7618"+
+    "\4\u7674\4\u76d0\4\u772c\4\u7788\4\u77e4\4\u7840\4\u789c\4\u78f8"+
+    "\4\u7954\4\u79b0\4\u7a0c\4\u7a68\4\u7ac4\4\u7b20\4\u7b7c\4\u7bd8"+
+    "\4\u7b20\4\u7c34\4\u7c90\4\u7cec\4\u7d48\4\u7da4\4\u7e00\4\u7e5c"+
+    "\4\u7eb8\4\u7f14\4\u7f70\4\u7fcc\4\u8028\4\u8084\4\u80e0\4\u813c"+
+    "\4\u8198\4\u81f4\4\u8250\4\u82ac\4\u8308\4\u8364\4\u83c0\4\u841c"+
+    "\4\u8478\4\u84d4\4\u8530\4\u858c\4\u85e8\4\u8644\4\u86a0\4\u86fc"+
+    "\4\u8758\4\u87b4\4\u8810\4\u886c\4\u88c8\4\u8924\4\u8980\4\u89dc"+
+    "\4\u8a38\4\u8a94\4\u8af0\4\u8b4c\4\u8ba8\4\u8c04\4\u8c60\4\u8cbc"+
+    "\4\u8d18\4\u8d74\4\u8dd0\4\u8e2c\4\u8e88\4\u8ee4\4\u8f40\4\u8f9c"+
+    "\4\u8ff8\4\u9054\4\u90b0\4\u910c\4\u9168\4\u91c4\4\u9220\4\u927c"+
+    "\4\u92d8\4\u9334\4\u9390\4\u93ec\4\u9448\4\u94a4\4\u9500\4\u955c"+
+    "\4\u95b8\4\u9614\4\u9670\4\u96cc\4\u9728\4\u9784\4\u97e0\4\u983c"+
+    "\4\u9898\4\u98f4\4\u9950\4\u99ac\4\u9a08\4\u9a64\4\u9ac0\4\u9b1c"+
+    "\4\u9b78\4\u6140\4\u9bd4\4\u9c30\4\u9c8c\4\u9ce8\4\u9d44\4\u9da0"+
+    "\4\u9dfc\4\u9e58\4\u9eb4\4\u9f10\4\u9f6c\4\u9fc8\4\ua024\4\ua080"+
+    "\4\ua0dc\4\ua138\4\ua194\4\ua1f0\4\ua24c\4\ua2a8\4\ua304\4\ua360"+
+    "\4\ua3bc\4\ua418\4\ua474\4\ua4d0\4\ua52c\4\ua588\4\ua5e4\4\ua640"+
+    "\4\ua69c\4\ua6f8\4\ua754\4\ua7b0\4\ua80c\4\ua868\4\ua8c4\4\ua920"+
+    "\4\ua97c\4\ua9d8\4\uaa34\4\uaa90\4\uaaec\4\uab48\4\uaba4\4\uac00"+
+    "\4\uac5c\4\uacb8\4\uad14\4\uad70\4\uadcc\4\uae28\4\uae84\4\uaee0"+
+    "\4\uaf3c\4\uaf98\4\uaff4\4\ub050\4\ub0ac\4\ub108\4\ub164\4\ub1c0"+
+    "\4\ub21c\4\ub278\4\ub2d4\4\ub330\4\ub38c\4\ub3e8\4\ub444\4\ub4a0"+
+    "\4\ub4fc\4\ub558\4\ub5b4\4\ub610\4\ub66c\4\ub6c8\4\ub724\4\ub780"+
+    "\4\ub7dc\4\ub838\4\ub894\4\ub8f0\4\ub94c\4\ub9a8\4\uba04\4\uba60"+
+    "\4\ubabc\4\ubb18\4\ubb74\4\ubbd0\4\ubc2c\4\ubc88\4\ubce4\4\ubd40"+
+    "\4\ubd9c\4\ubdf8\4\ube54\4\ubeb0\4\ubf0c\4\ubf68\4\ubfc4\4\uc020"+
+    "\4\uc07c\4\uc0d8\4\uc134\4\uc190\4\uc1ec\4\uc248\4\uc2a4\4\uc300"+
+    "\4\uc35c\4\uc3b8\4\uc414\4\uc470\4\uc4cc\4\uc528\4\uc584\4\uc5e0"+
+    "\4\uc63c\4\uc698\4\uc6f4\4\uc750\4\uc7ac\1\u6988\4\uc808\4\uc864"+
+    "\4\uc8c0\4\uc91c\4\uc978\4\uc9d4\4\uca30\4\uca8c\4\ucae8\4\ucb44"+
+    "\4\ucba0\4\ucbfc\4\ucc58\4\uccb4\4\ucd10\4\ucd6c\4\ucdc8\4\uce24"+
+    "\4\uce80\4\ucedc\4\ucf38\4\ucf94\4\ucff0\4\ud04c\4\ud0a8\4\ud104"+
+    "\4\ud160\4\ud1bc\4\ud218\4\ud274\4\ud2d0\4\ud32c\4\ud388\4\ud3e4"+
+    "\4\ud440\4\ud49c\4\ud4f8\4\ud554\4\ud5b0\4\ud60c\4\ud668\4\ud6c4"+
+    "\4\ud720\4\ud77c\4\ud7d8\4\ud834\4\ud890\4\ud8ec\4\ud948\4\ud9a4"+
+    "\4\uda00\4\uda5c\4\udab8\4\udb14\4\udb70\4\udbcc\4\udc28\4\udc84"+
+    "\4\udce0\4\udd3c\4\udd98\4\uddf4\4\ude50\4\udeac\4\udf08\4\udf64"+
+    "\4\udfc0\4\ue01c\4\ue078\4\ue0d4\4\ue130\4\ue18c\4\ue1e8\4\ue244"+
+    "\4\ue2a0\4\ue2fc\4\ue358\4\ue3b4\4\ue410\4\ue46c\4\ue4c8\4\ue524"+
+    "\4\ue580\4\ue5dc\4\ue638\4\ue694\4\ue6f0\4\ue74c\4\ue7a8\4\ue804"+
+    "\4\ue860\4\ue8bc\4\ue918\4\ue974\4\ue9d0\4\uea2c\4\uea88\4\ueae4"+
+    "\4\ueb40\4\ueb9c\4\uebf8\4\uec54\4\uecb0\4\ued0c\4\ued68\4\uedc4"+
+    "\4\uee20\4\uee7c\4\ueed8\4\uef34\4\uef90\4\uefec\4\uf048\4\uf0a4"+
+    "\4\uf100\4\uf15c\4\uf1b8\4\uf214\4\uf270\4\uf2cc\4\uf328\4\uf384"+
+    "\4\uf3e0\4\uf43c\4\uf498\4\uf4f4\4\uf550\4\uf5ac\4\uf608\4\uf664"+
+    "\4\uf6c0\4\uf71c\4\uf778\4\uf7d4\4\uf830\4\uf88c\4\uf8e8\4\uf944"+
+    "\4\uf9a0\4\uf9fc\4\ufa58\4\ufab4\4\ufb10\4\ufb6c\4\ufbc8\4\ufc24"+
+    "\4\ufc80\4\ufcdc\4\ufd38\4\ufd94\4\ufdf0\4\ufe4c\4\ufea8\4\uff04"+
+    "\4\uff60\4\uffbc\5\30\5\164\5\320\5\u012c\5\u0188\5\u01e4"+
+    "\5\u0240\5\u029c\5\u02f8\5\u0354\5\u03b0\5\u040c\5\u0468\5\u04c4"+
+    "\5\u0520\5\u057c\5\u05d8\5\u0634\5\u0690\5\u06ec\5\u0748\5\u07a4"+
+    "\5\u0800\5\u085c\5\u08b8\5\u0914\5\u0970\5\u09cc\5\u0a28\5\u0a84"+
+    "\5\u0ae0\5\u0b3c\1\ubbd4\5\u0b98\5\u0bf4\5\u0c50\5\u0cac\5\u0d08"+
+    "\5\u0d64\5\u0dc0\5\u0e1c\5\u0e78\5\u0ed4\5\u0f30\5\u0f8c\5\u0fe8"+
+    "\5\u1044\5\u10a0\5\u10fc\5\u1158\5\u11b4\5\u1210\5\u126c\5\u12c8"+
+    "\5\u1324\5\u1380\5\u13dc\5\u1438\5\u1494\5\u14f0\5\u154c\5\u15a8"+
+    "\5\u1604\5\u1660\5\u16bc\5\u1718\5\u1774\5\u17d0\5\u182c\5\u1888"+
+    "\5\u18e4\5\u1940\5\u199c\5\u19f8\5\u1a54\5\u1ab0\5\u1b0c\5\u1b68"+
+    "\5\u1bc4\5\u1c20\5\u1c7c\5\u1cd8\5\u1d34\5\u1d90\5\u1dec\5\u1e48"+
+    "\5\u1ea4\5\u1f00\5\u1f5c\5\u1fb8\5\u2014\5\u2070\5\u20cc\5\u2128"+
+    "\5\u2184\5\u21e0\5\u223c\5\u2298\5\u22f4\5\u2350\5\u23ac\5\u2408"+
+    "\5\u2464\5\u24c0\5\u251c\5\u2578\5\u25d4\5\u2630\5\u268c\5\u26e8"+
+    "\5\u2744\5\u27a0\5\u27fc\5\u2858\5\u28b4\5\u2910\5\u296c\5\u29c8"+
+    "\5\u2a24\5\u2a80\5\u2adc\5\u2b38\5\u2b94\5\u2bf0\5\u2c4c\5\u2ca8"+
+    "\5\u2d04\5\u2d60\5\u2dbc\5\u2e18\5\u2e74\5\u2ed0\5\u2f2c\5\u2f88"+
+    "\5\u2fe4\5\u3040\5\u309c\5\u30f8\5\u3154\5\u31b0\5\u320c\5\u3268"+
+    "\5\u32c4\5\u3320\5\u337c\5\u33d8\5\u3434\5\u3490\5\u34ec\5\u3548"+
+    "\5\u35a4\5\u3600\3\u35e4\5\u365c\5\u36b8\5\u3714\5\u3770\5\u37cc"+
+    "\5\u3828\5\u3884\5\u38e0\5\u393c\5\u3998\5\u39f4\5\u3a50\5\u3aac"+
+    "\5\u3b08\5\u3b64\5\u3bc0\5\u3c1c\5\u3c78\5\u3cd4\5\u3d30\5\u3d8c"+
+    "\5\u3de8\5\u3e44\5\u3ea0\5\u3efc\5\u3f58\5\u3fb4\5\u4010\5\u406c"+
+    "\5\u40c8\5\u4124\5\u4180\5\u41dc\5\u4238\5\u4294\5\u42f0\5\u434c"+
+    "\5\u43a8\5\u4404\5\u4460\5\u44bc\5\u4518\5\u4574\5\u45d0\5\u462c"+
+    "\5\u4688\5\u46e4\5\u4740\5\u479c\5\u47f8\5\u4854\5\u48b0\5\u490c"+
+    "\5\u4968\5\u49c4\5\u4a20\5\u4a7c\5\u4ad8\5\u4b34\5\u4b90\5\u4bec"+
+    "\5\u4c48\5\u4ca4\5\u4d00\5\u4d5c\5\u4db8\5\u4e14\5\u4e70\5\u4ecc"+
+    "\5\u4f28\5\u4f84\5\u4fe0\5\u503c\5\u5098\5\u50f4\5\u5150\5\u51ac"+
+    "\5\u5208\5\u5264\5\u52c0\5\u531c\5\u5378\5\u53d4\5\u5430\5\u548c"+
+    "\5\u54e8\5\u5544\5\u55a0\5\u55fc\5\u5658\5\u56b4\5\u5710\5\u576c"+
+    "\5\u57c8\5\u5824\5\u5880\5\u58dc\5\u5938\5\u5994\5\u59f0\5\u5a4c"+
+    "\5\u5aa8\5\u5b04\5\u5b60\5\u5bbc\5\u5c18\5\u5c74\5\u5cd0\5\u5d2c"+
+    "\5\u5d88\5\u5de4\5\u5e40\5\u5e9c\5\u5ef8\5\u5f54\5\u5fb0\5\u600c"+
+    "\5\u6068\5\u60c4\5\u6120\5\u617c\5\u61d8\5\u6234\5\u6290\5\u62ec"+
+    "\5\u6348\5\u63a4\5\u6400\5\u645c\5\u64b8\5\u6514\5\u6570\5\u65cc"+
+    "\5\u6628\5\u6684\5\u66e0\5\u673c\5\u6798\5\u67f4\5\u6850\5\u68ac"+
+    "\5\u6908\5\u6964\5\u69c0\5\u6a1c\5\u6a78\5\u6ad4\5\u6b30\5\u6b8c"+
+    "\5\u6be8\5\u6c44\5\u6ca0\5\u6cfc\5\u6d58\5\u6db4\5\u6e10\5\u6e6c"+
+    "\5\u6ec8\5\u6f24\5\u6f80\5\u6fdc\5\u7038\5\u7094\5\u70f0\5\u714c"+
+    "\5\u71a8\5\u7204\5\u7260\5\u72bc\5\u7318\5\u7374\5\u73d0\5\u742c"+
+    "\5\u7488\5\u74e4\5\u7540\5\u759c\5\u75f8\5\u7654\5\u76b0\5\u770c"+
+    "\1\u4878\5\u7768\5\u77c4\5\u7820\5\u787c\5\u78d8\5\u7934\5\u7990"+
+    "\5\u79ec\5\u7a48\5\u7aa4\5\u7b00\5\u7b5c\5\u7bb8\5\u7c14\5\u7c70"+
+    "\5\u7ccc\5\u7d28\5\u7d84\5\u7de0\5\u7e3c\5\u7e98\5\u7ef4\5\u7f50"+
+    "\5\u7fac\5\u8008\5\u8064\5\u80c0\5\u811c\5\u8178\5\u81d4\5\u8230"+
+    "\5\u828c\5\u82e8\5\u8344\5\u83a0\5\u83fc\5\u8458\5\u84b4\5\u8510"+
+    "\0\uff84\5\u856c\5\u85c8\5\u8624\5\u8680\5\u86dc\5\u8738\5\u8794"+
+    "\5\u87f0\5\u884c\5\u88a8\5\u8904\5\u8960\5\u89bc\5\u8a18\5\u8a74"+
+    "\5\u8ad0\5\u8b2c\5\u8b88\5\u8be4\5\u8c40\5\u8c9c\5\u8cf8\5\u8d54"+
+    "\5\u8db0\5\u8e0c\5\u8e68\5\u8ec4\5\u8f20\5\u8f7c\5\u8fd8\5\u9034"+
+    "\5\u9090\5\u90ec\5\u9148\5\u91a4\5\u9200\5\u925c\5\u92b8\5\u83fc"+
+    "\5\u9314\5\u9370\5\u93cc\5\u9428\5\u9484\5\u94e0\5\u953c\5\u9598"+
+    "\5\u95f4\5\u9650\5\u96ac\5\u9708\5\u9764\5\u97c0\5\u981c\5\u9878"+
+    "\5\u98d4\5\u9930\5\u998c\5\u99e8\5\u9a44\5\u9aa0\5\u9afc\5\u9b58"+
+    "\5\u9bb4\5\u9c10\5\u9c6c\5\u9cc8\5\u9d24\5\u9d80\5\u9ddc\5\u9e38"+
+    "\5\u9e94\5\u9ef0\5\u9f4c\5\u9fa8\5\ua004\5\ua060\5\ua0bc\5\ua118"+
+    "\5\ua174\5\ua1d0\5\ua22c\5\ua288\5\ua2e4\5\ua340\5\ua39c\5\ua3f8"+
+    "\5\ua454\5\ua4b0\5\ua50c\5\ua568\5\ua5c4\5\ua620\5\ua67c\5\ua6d8"+
+    "\5\ua734\5\ua790\5\ua7ec\5\ua848\5\ua8a4\5\ua900\5\ua95c\5\ua9b8"+
+    "\5\uaa14\5\uaa70\5\uaacc\5\uab28\5\uab84\5\uabe0\5\uac3c\4\u1904"+
+    "\5\uac98\5\uacf4\5\uad50\5\uadac\5\uae08\5\uae64\5\uaec0\5\uaf1c"+
+    "\5\uaf78\5\uafd4\5\ub030\5\ub08c\5\ub0e8\5\ub144\5\ub1a0\5\ub1fc"+
+    "\5\ub258\5\ub2b4\5\ub310\5\ub36c\5\ub3c8\5\ub424\5\ub480\5\ub4dc"+
+    "\5\ub538\5\ub594\5\ub5f0\5\ub64c\5\ub6a8\5\ub704\5\ub760\5\ub7bc"+
+    "\5\ub818\5\ub874\5\ub8d0\5\ub92c\5\ub988\5\ub9e4\5\uba40\5\uba9c"+
+    "\5\ubaf8\5\ubb54\5\ubbb0\5\ubc0c\5\ubc68\2\ubc6c\5\ubcc4\5\ubd20"+
+    "\5\ubd7c\5\ubdd8\5\ube34\5\ube90\5\ubeec\5\ubf48\5\ubfa4\5\uc000"+
+    "\5\uc05c\5\uc0b8\5\uc114\5\uc170\5\uc1cc\5\uc228\5\uc284\5\uc2e0"+
+    "\5\uc33c\5\uc398\5\uc3f4\5\uc450\5\uc4ac\5\uc508\5\uc564\5\uc5c0"+
+    "\5\uc61c\5\uc678\5\uc6d4\5\uc730\5\uc78c\5\uc7e8\5\uc844\5\uc8a0"+
+    "\5\uc8fc\5\uc958\5\uc9b4\5\uca10\5\uca6c\5\ucac8\5\ucb24\5\ucb80"+
+    "\5\ucbdc\5\ucc38\5\ucc94\5\uccf0\5\ucd4c\5\ucda8\5\uce04\5\uce60"+
+    "\5\ucebc\5\ucf18\5\ucf74\5\ucfd0\5\ud02c\5\ud088\5\ud0e4\5\ud140"+
+    "\5\ud19c\5\ud1f8\5\ud254\5\ud2b0\5\ud30c\5\ud368\5\ud3c4\5\ud420"+
+    "\5\ud47c\5\ud4d8\5\ud534\5\ud590\5\ud5ec\5\ud648\5\ud6a4\5\ud700"+
+    "\5\ud75c\5\ud7b8\5\ud814\5\ud870\5\ud8cc\5\ud928\5\ud984\5\ud9e0"+
+    "\5\uda3c\5\uda98\5\udaf4\5\udb50\5\udbac\5\udc08\5\udc64\5\udcc0"+
+    "\5\udd1c\5\udd78\5\uddd4\5\ude30\5\ude8c\5\udee8\5\udf44\5\udfa0"+
+    "\5\udffc\5\ue058\5\ue0b4\5\ue110\5\ue16c\5\ue1c8\5\ue224\5\ue280"+
+    "\5\ue2dc\5\ue338\5\ue394\5\ue3f0\5\ue44c\5\ue4a8\5\ue504\5\ue560"+
+    "\5\ue5bc\5\ue618\5\ue674\5\ue6d0\5\ue72c\5\ue788\5\ue7e4\5\ue840"+
+    "\5\ue89c\5\ue8f8\5\ue954\5\ue9b0\5\uea0c\5\uea68\5\ueac4\5\ueb20"+
+    "\5\ueb7c\5\uebd8\5\uec34\5\uec90\5\uecec\5\ued48\5\ueda4\5\uee00"+
+    "\5\uee5c\5\ueeb8\5\uef14\5\uef70\5\uefcc\5\uf028\5\uf084\5\uf0e0"+
+    "\5\uf13c\5\uf198\5\uf1f4\5\uf250\5\uf2ac\5\uf308\5\uf364\5\uf3c0"+
+    "\5\uf41c\5\uf478\5\uf4d4\5\uf530\5\uf58c\5\uf5e8\5\uf644\5\uf6a0"+
+    "\5\uf6fc\5\uf758\5\uf7b4\5\uf810\5\uf86c\5\uf8c8\5\uf924\5\uf980"+
+    "\5\uf9dc\5\ufa38\5\ufa94\5\ufaf0\5\ufb4c\5\ufba8\5\ufc04\5\ufc60"+
+    "\5\ufcbc\5\ufd18\5\ufd74\5\ufdd0\5\ufe2c\5\ufe88\5\ufee4\5\uff40"+
+    "\5\uff9c\5\ufff8\6\124\6\260\6\u010c\6\u0168\6\u01c4\6\u0220"+
+    "\6\u027c\6\u02d8\6\u0334\6\u0390\6\u03ec\6\u0448\6\u04a4\6\u0500"+
+    "\6\u055c\6\u05b8\6\u0614\6\u0670\6\u06cc\6\u0728\6\u0784\6\u07e0"+
+    "\6\u083c\6\u0898\6\u08f4\6\u0950\6\u09ac\6\u0a08\6\u0a64\6\u0ac0"+
+    "\6\u0b1c\6\u0b78\6\u0bd4\3\u72fc\6\u0c30\6\u0c8c\6\u0ce8\6\u0d44"+
+    "\6\u0da0\6\u0dfc\6\u0e58\6\u0eb4\6\u0f10\6\u0f6c\6\u0fc8\6\u1024"+
+    "\6\u1080\6\u10dc\6\u1138\6\u1194\6\u11f0\6\u124c\6\u12a8\6\u1304"+
+    "\6\u1360\6\u13bc\6\u1418\6\u1474\6\u14d0\6\u152c\6\u1588\6\u15e4"+
+    "\6\u1640\6\u169c\6\u16f8\6\u1754\6\u17b0\6\u180c\6\u1868\6\u18c4"+
+    "\6\u1920\6\u197c\6\u19d8\6\u1a34\6\u1a90\6\u1aec\6\u1b48\6\u1ba4"+
+    "\6\u1c00\6\u1c5c\6\u1cb8\6\u1d14\6\u1d70\6\u1dcc\6\u1e28\6\u1e84"+
+    "\6\u1ee0\6\u1f3c\6\u1f98\6\u1ff4\6\u2050\6\u20ac\6\u2108\0\u078c"+
+    "\6\u2164\0\u078c\0\u078c\6\u21c0\6\u221c\6\u2278\6\u22d4\6\u2330"+
+    "\6\u238c\6\u23e8\6\u2444\6\u24a0\6\u24fc\6\u2558\6\u25b4\6\u2610"+
+    "\6\u266c\6\u26c8\6\u2724\6\u2780\6\u27dc\6\u2838\6\u2894\6\u28f0"+
+    "\6\u294c\6\u29a8\6\u2a04\6\u2a60\6\u2abc\6\u2b18\6\u2b74\6\u2bd0"+
+    "\6\u2c2c\6\u2c88\6\u2ce4\6\u2d40\6\u2d9c\6\u2df8\6\u2e54\3\u5a30"+
+    "\6\u2eb0\6\u2f0c\6\u2f68\6\u2fc4\6\u3020\6\u307c\6\u30d8\6\u3134"+
+    "\6\u3190\6\u31ec\6\u3248\6\u32a4\6\u3300\6\u335c\6\u33b8\6\u3414"+
+    "\6\u3470\6\u34cc\6\u3528\6\u3584\6\u35e0\6\u363c\6\u3698\2\u4f88"+
+    "\6\u36f4\6\u3750\6\u37ac\6\u3808\3\uaf5c\6\u3864\6\u38c0\6\u391c"+
+    "\6\u3978\6\u39d4\6\u3a30\6\u3a8c\6\u3ae8\6\u3b44\6\u3ba0\6\u3bfc"+
+    "\6\u3c58\6\u3cb4\6\u3d10\6\u3d6c\6\u3dc8\6\u3e24\6\u3e80\6\u3edc"+
+    "\6\u3f38\6\u3f94\6\u3ff0\6\u404c\6\u40a8\6\u4104\6\u4160\6\u41bc"+
+    "\6\u4218\6\u4274\6\u42d0\6\u432c\6\u4388\6\u43e4\6\u4440\6\u449c"+
+    "\6\u44f8\6\u4554\6\u45b0\6\u460c\6\u4668\6\u46c4\6\u4720\6\u477c"+
+    "\6\u47d8\6\u4834\6\u4890\6\u48ec\6\u4948\6\u49a4\6\u4a00\6\u4a5c"+
+    "\1\u97e4\6\u4ab8\6\u4b14\6\u4b70\6\u4bcc\6\u4c28\6\u4c84\6\u4ce0"+
+    "\6\u4d3c\6\u4d98\6\u4df4\6\u4e50\6\u4eac\6\u4f08\6\u4f64\6\u4fc0"+
+    "\4\u5228\6\u501c\6\u5078\6\u50d4\6\u5130\6\u518c\6\u51e8\6\u5244"+
+    "\6\u52a0\6\u52fc\6\u5358\6\u53b4\6\u5410\6\u546c\6\u54c8\6\u5524"+
+    "\6\u5580\6\u55dc\6\u5638\6\u5694\6\u56f0\6\u574c\6\u57a8\6\u5804"+
+    "\6\u5860\6\u58bc\6\u5918\6\u5974\6\u59d0\6\u5a2c\6\u5a88\6\u5ae4"+
+    "\6\u5b40\6\u5b9c\6\u5bf8\6\u5c54\6\u5cb0\6\u5d0c\6\u5d68\6\u5dc4"+
+    "\6\u5e20\6\u5e7c\6\u5ed8\6\u5f34\6\u5f90\6\u5fec\6\u6048\6\u60a4"+
+    "\6\u6100\6\u615c\6\u61b8\6\u6214\6\u6270\6\u62cc\6\u6328\6\u6384"+
+    "\6\u63e0\6\u643c\6\u6498\6\u64f4\6\u6550\6\u65ac\6\u6608\6\u6664"+
+    "\6\u66c0\6\u671c\6\u6778\6\u67d4\6\u6830\6\u688c\6\u68e8\6\u6944"+
+    "\6\u69a0\6\u69fc\6\u6a58\6\u6ab4\6\u6b10\6\u6b6c\6\u6bc8\6\u6c24"+
+    "\6\u6c80\6\u6cdc\6\u6d38\6\u6d94\6\u6df0\6\u6e4c\6\u6ea8\6\u6f04"+
+    "\6\u6f60\6\u6fbc\6\u7018\6\u7074\6\u70d0\6\u712c\6\u7188\6\u71e4"+
+    "\6\u7240\6\u729c\6\u72f8\6\u7354\6\u73b0\6\u740c\6\u7468\6\u74c4"+
+    "\6\u7520\6\u757c\6\u75d8\6\u7634\6\u7690\6\u76ec\6\u7748\6\u77a4"+
+    "\6\u7800\6\u785c\6\u78b8\6\u7914\6\u7970\6\u79cc\6\u7a28\6\u7a84"+
+    "\6\u7ae0\6\u7b3c\6\u7b98\6\u7bf4\6\u7c50\6\u7cac\6\u7d08\6\u7d64"+
+    "\6\u7dc0\6\u7e1c\6\u7e78\6\u7ed4\6\u7f30\6\u7f8c\6\u7fe8\6\u8044"+
+    "\6\u80a0\6\u80fc\6\u8158\6\u81b4\6\u8210\6\u826c\6\u82c8\6\u8324"+
+    "\6\u8380\6\u83dc\6\u8438\6\u8494\6\u84f0\6\u854c\5\u55a0\6\u85a8"+
+    "\6\u8604\6\u8660\6\u86bc\6\u8718\6\u8774\6\u87d0\6\u882c\6\u8888"+
+    "\6\u88e4\6\u8940\6\u899c\6\u89f8\6\u8a54\6\u8ab0\6\u8b0c\6\u8b68"+
+    "\6\u8bc4\6\u8c20\6\u8c7c\6\u8cd8\6\u8d34\1\u4370\6\u8d90\6\u8dec"+
+    "\6\u8e48\6\u8ea4\6\u8f00\6\u8f5c\6\u8fb8\6\u9014\6\u9070\6\u90cc"+
+    "\6\u9128\6\u9184\6\u91e0\6\u923c\6\u9298\6\u92f4\6\u9350\6\u93ac"+
+    "\6\u9408\6\u9464\6\u94c0\6\u951c\6\u9578\6\u95d4\6\u9630\6\u968c"+
+    "\6\u96e8\6\u9744\6\u97a0\6\u97fc\6\u9858\6\u98b4\6\u9910\6\u996c"+
+    "\6\u99c8\6\u9a24\6\u9a80\6\u9adc\6\u9b38\6\u9b94\6\u9bf0\6\u9c4c"+
+    "\6\u9ca8\6\u9d04\6\u9d60\6\u9dbc\6\u9e18\6\u9e74\6\u9ed0\6\u9f2c"+
+    "\6\u9f88\6\u9fe4\6\ua040\6\ua09c\6\ua0f8\6\ua154\6\ua1b0\6\ua20c"+
+    "\6\ua268\3\u72a0\6\ua2c4\6\ua320\6\ua37c\6\ua3d8\6\ua434\6\ua490"+
+    "\6\ua4ec\6\ua548\6\ua5a4\6\ua600\6\ua65c\6\ua6b8\6\ua714\6\ua770"+
+    "\6\ua7cc\6\ua828\6\ua884\6\ua8e0\6\ua93c\6\ua998\6\ua9f4\6\uaa50"+
+    "\6\uaaac\6\uab08\6\uab64\6\uabc0\6\uac1c\6\uac78\6\uacd4\6\uad30"+
+    "\6\uad8c\6\uade8\6\uae44\6\uaea0\6\uaefc\6\uaf58\6\uafb4\6\ub010"+
+    "\6\ub06c\6\ub0c8\6\ub124\6\ub180\6\ub1dc\6\ub238\6\ub294\6\ub2f0"+
+    "\6\ub34c\6\ub3a8\6\ub404\6\ub460\5\u8d54\6\ub4bc\6\ub518\6\ub574"+
+    "\6\ub5d0\6\ub62c\6\ub688\6\ub6e4\6\ub740\6\ub79c\6\ub7f8\6\ub854"+
+    "\6\ub8b0\6\ub90c\6\ub968\6\ub9c4\6\uba20\6\uba7c\6\ubad8\6\ubb34"+
+    "\6\ubb90\6\ubbec\6\ubc48\6\ubca4\6\ubd00\6\ubd5c\6\ubdb8\6\ube14"+
+    "\6\ube70\6\ubecc\6\ubf28\6\ubf84\6\ubfe0\6\uc03c\6\uc098\6\uc0f4"+
+    "\6\uc150\6\uc1ac\6\uc208\6\uc264\6\uc2c0\6\uc31c\6\uc378\6\uc3d4"+
+    "\6\uc430\6\uc48c\6\uc4e8\6\uc544\6\uc5a0\6\uc5fc\6\uc658\6\uc6b4"+
+    "\6\uc710\6\uc76c\6\uc7c8\6\uc824\6\uc880\6\uc8dc\6\uc938\6\uc994"+
+    "\6\uc9f0\6\uca4c\6\ucaa8\6\ucb04\6\ucb60\6\ucbbc\6\ucc18\6\ucc74"+
+    "\6\uccd0\6\ucd2c\6\ucd88\6\ucde4\6\uce40\6\uce9c\6\ucef8\6\ucf54"+
+    "\6\ucfb0\6\ud00c\1\ua924\6\ud068\6\ud0c4\6\ud120\6\ud17c\6\ud1d8"+
+    "\6\ud234\6\ud290\6\ud2ec\6\ud348\6\ud3a4\6\ud400\6\ud45c\6\ud4b8"+
+    "\6\ud514\6\ud570\6\ud5cc\6\ud628\6\ud684\6\ud6e0\6\ud73c\6\ud798"+
+    "\6\ud7f4\6\ud850\6\ud8ac\6\ud908\6\ud964\6\ud9c0\6\uda1c\6\uda78"+
+    "\6\udad4\6\udb30\6\udb8c\6\udbe8\6\udc44\6\udca0\6\udcfc\6\udd58"+
+    "\6\uddb4\6\ude10\6\ude6c\6\udec8\6\udf24\6\udf80\6\udfdc\6\ue038"+
+    "\6\ue094\6\ue0f0\6\ue14c\6\ue1a8\6\ue204\6\ue260\6\ue2bc\6\ue318"+
+    "\6\ue374\6\ue3d0\6\ue42c\6\ue488\6\ue4e4\6\ue540\6\ue59c\6\ue5f8"+
+    "\6\ue654\6\ue6b0\6\ue70c\6\ue768\6\ue7c4\6\ue820\6\ue87c\6\ue8d8"+
+    "\6\ue934\6\ue990\6\ue9ec\6\uea48\6\ueaa4\6\ueb00\6\ueb5c\6\uebb8"+
+    "\6\uec14\6\uec70\6\ueccc\6\ued28\6\ued84\6\uede0\6\uee3c\6\uee98"+
+    "\6\ueef4\6\uef50\6\uefac\6\uf008\6\uf064\6\uf0c0\6\uf11c\6\uf178"+
+    "\6\uf1d4\6\uf230\6\uf28c\6\uf2e8\6\uf344\6\uf3a0\6\uf3fc\6\uf458"+
+    "\6\uf4b4\6\uf510\6\uf56c\6\uf5c8\6\uf624\6\uf680\6\uf6dc\6\uf738"+
+    "\6\uf794\6\uf7f0\6\uf84c\6\uf8a8\6\uf904\6\uf960\6\uf9bc\6\ufa18"+
+    "\6\ufa74\6\ufad0\6\ufb2c\6\ufb88\6\ufbe4\6\ufc40\6\ufc9c\6\ufcf8"+
+    "\6\ufd54\6\ufdb0\6\ufe0c\6\ufe68\6\ufec4\6\uff20\6\uff7c\6\uffd8"+
+    "\7\64\7\220\7\354\7\u0148\7\u01a4\7\u0200\7\u025c\7\u02b8"+
+    "\7\u0314\7\u0370\7\u03cc\7\u0428\7\u0484\7\u04e0\7\u053c\7\u0598"+
+    "\7\u05f4\7\u0650\7\u06ac\7\u0708\7\u0764\7\u07c0\7\u081c\7\u0878"+
+    "\7\u08d4\7\u0930\7\u098c\7\u09e8\7\u0a44\7\u0aa0\7\u0afc\7\u0b58"+
+    "\7\u0bb4\7\u0c10\7\u0c6c\7\u0cc8\7\u0d24\7\u0d80\7\u0ddc\7\u0e38"+
+    "\7\u0e94\7\u0ef0\7\u0f4c\7\u0fa8\7\u1004\7\u1060\7\u10bc\7\u1118"+
+    "\7\u1174\7\u11d0\7\u122c\7\u1288\7\u12e4\7\u1340\7\u139c\7\u13f8"+
+    "\7\u1454\7\u14b0\7\u150c\7\u1568\7\u15c4\7\u1620\7\u167c\7\u16d8"+
+    "\7\u1734\7\u1790\7\u17ec\7\u1848\7\u18a4\7\u1900\7\u195c\7\u19b8"+
+    "\7\u1a14\7\u1a70\7\u1acc\7\u1b28\7\u1b84\7\u1be0\7\u1c3c\7\u1c98"+
+    "\7\u1cf4\7\u1d50\7\u1dac\7\u1e08\7\u1e64\7\u1ec0\7\u1f1c\7\u1f78"+
+    "\7\u1fd4\7\u2030\7\u208c\7\u20e8\7\u2144\7\u21a0\7\u21fc\7\u2258"+
+    "\7\u22b4\7\u2310\7\u236c\7\u23c8\7\u2424\7\u2480\7\u24dc\7\u2538"+
+    "\7\u2594\7\u25f0\7\u264c\7\u26a8\7\u2704\7\u2760\7\u27bc\7\u2818"+
+    "\7\u2874\7\u28d0\7\u292c\7\u2988\7\u29e4\7\u2a40\7\u2a9c\7\u2af8"+
+    "\7\u2b54\7\u2bb0\7\u2c0c\7\u2c68\7\u2cc4\7\u2d20\7\u2d7c\7\u2dd8"+
+    "\7\u2e34\7\u2e90\7\u2eec\7\u2f48\7\u2fa4\7\u3000\7\u305c\7\u30b8"+
+    "\7\u3114\7\u3170\7\u31cc\7\u3228\7\u3284\7\u32e0\7\u333c\7\u3398"+
+    "\7\u33f4\7\u3450\7\u34ac\7\u3508\7\u3564\7\u35c0\7\u361c\7\u3678"+
+    "\7\u36d4\7\u3730\7\u378c\7\u37e8\7\u3844\7\u38a0\7\u38fc\7\u3958"+
+    "\7\u39b4\7\u3a10\7\u3a6c\7\u3ac8\7\u3b24\7\u3b80\7\u3bdc\7\u3c38"+
+    "\7\u3c94\7\u3cf0\7\u3d4c\7\u3da8\7\u3e04\7\u3e60\7\u3ebc\7\u3f18"+
+    "\7\u3f74\7\u3fd0\7\u402c\7\u4088\7\u40e4\7\u4140\4\u5bdc\7\u419c"+
+    "\7\u41f8\7\u4254\2\ufb50\7\u42b0\7\u430c\7\u4368\7\u43c4\7\u4420"+
+    "\7\u447c\7\u44d8\7\u4534\7\u4590\7\u45ec\7\u4648\7\u46a4\7\u4700"+
+    "\7\u475c\7\u47b8\7\u4814\7\u4870\7\u48cc\7\u4928\7\u4984\7\u49e0"+
+    "\7\u4a3c\7\u4a98\7\u4af4\7\u4b50\7\u4bac\7\u4c08\7\u4c64\7\u4cc0"+
+    "\7\u4d1c\7\u4d78\7\u4dd4\7\u4e30\7\u4e8c\7\u4ee8\7\u4f44\7\u4fa0"+
+    "\7\u4ffc\7\u5058\7\u50b4\7\u5110\7\u516c\7\u51c8\7\u5224\7\u5280"+
+    "\7\u52dc\7\u5338\7\u5394\7\u53f0\7\u544c\7\u54a8\7\u5504\7\u5560"+
+    "\7\u55bc\7\u5618\7\u5674\7\u56d0\7\u572c\7\u5788\7\u57e4\2\udd7c"+
+    "\7\u5840\7\u589c\7\u58f8\7\u5954\7\u59b0\7\u5a0c\7\u5a68\7\u5ac4"+
+    "\7\u5b20\7\u5b7c\7\u5bd8\7\u5c34\7\u5c90\7\u5cec\7\u5d48\7\u5da4"+
+    "\7\u5e00\7\u5e5c\7\u5eb8\7\u5f14\7\u5f70\7\u5fcc\7\u6028\7\u6084"+
+    "\7\u60e0\7\u613c\7\u6198\7\u61f4\7\u6250\7\u62ac\7\u6308\7\u6364"+
+    "\7\u63c0\7\u641c\7\u6478\7\u64d4\7\u6530\7\u658c\7\u65e8\7\u6644"+
+    "\7\u66a0\7\u66fc\7\u6758\7\u67b4\7\u6810\7\u686c\7\u68c8\7\u6924"+
+    "\7\u6980\7\u69dc\7\u6a38\7\u6a94\7\u6af0\7\u6b4c\7\u6ba8\7\u6c04"+
+    "\7\u6c60\7\u6cbc\7\u6d18\7\u6d74\7\u6dd0\7\u6e2c\7\u6e88\7\u6ee4"+
+    "\7\u6f40\7\u6f9c\7\u6ff8\7\u7054\7\u70b0\7\u710c\7\u7168\7\u71c4"+
+    "\7\u7220\7\u727c\7\u72d8\7\u7334\7\u7390\7\u73ec\7\u7448\7\u74a4"+
+    "\7\u7500\7\u755c\7\u75b8\7\u7614\7\u7670\7\u76cc\7\u7728\7\u7784"+
+    "\7\u77e0\7\u783c\7\u7898\7\u78f4\7\u7950\7\u79ac\7\u7a08\7\u7a64"+
+    "\7\u7ac0\7\u7b1c\7\u7b78\7\u7bd4\7\u7c30\7\u7c8c\7\u7ce8\7\u7d44"+
+    "\7\u7da0\7\u7dfc\7\u7e58\7\u7eb4\7\u7f10\7\u7f6c\7\u7fc8\7\u8024"+
+    "\7\u8080\7\u80dc\7\u8138\7\u8194\7\u81f0\7\u824c\7\u82a8\7\u8304"+
+    "\7\u8360\7\u83bc\7\u8418\7\u8474\7\u84d0\7\u852c\7\u8588\7\u85e4"+
+    "\7\u8640\7\u869c\7\u86f8\7\u8754\7\u87b0\7\u880c\7\u8868\7\u88c4"+
+    "\7\u8920\2\u2a28\7\u897c\7\u89d8\7\u8a34\7\u8a90\7\u8aec\7\u8b48"+
+    "\7\u8ba4\7\u8c00\7\u8c5c\7\u8cb8\7\u8d14\7\u8d70\7\u8dcc\7\u8e28"+
+    "\7\u8e84\7\u8ee0\7\u8f3c\7\u8f98\7\u8ff4\7\u9050\7\u90ac\7\u9108"+
+    "\7\u9164\7\u91c0\7\u921c\7\u9278\7\u92d4\7\u9330\7\u938c\7\u93e8"+
+    "\7\u9444\7\u94a0\4\u07c4\7\u94fc\7\u9558\7\u95b4\7\u9610\7\u966c"+
+    "\7\u96c8\7\u9724\7\u9780\7\u97dc\7\u9838\7\u9894\7\u98f0\7\u994c"+
+    "\7\u99a8\7\u9a04\7\u9a60\7\u9abc\7\u9b18\7\u9b74\7\u9bd0\7\u9c2c"+
+    "\7\u9c88\7\u9ce4\7\u9d40\7\u9d9c\7\u9df8\7\u9e54\7\u9eb0\7\u9f0c"+
+    "\7\u9f68\7\u9fc4\3\u82cc\7\ua020\7\ua07c\7\ua0d8\7\ua134\7\ua190"+
+    "\7\ua1ec\7\ua248\7\ua2a4\7\ua300\7\ua35c\7\ua3b8\7\ua414\7\ua470"+
+    "\7\ua4cc\7\ua528\7\ua584\7\ua5e0\7\ua63c\7\ua698\7\ua6f4\7\ua750"+
+    "\7\ua7ac\7\ua808\7\ua864\7\ua8c0\7\ua91c\7\ua978\7\ua9d4\7\uaa30"+
+    "\7\uaa8c\7\uaae8\7\uab44\7\uaba0\7\uabfc\7\uac58\7\uacb4\7\uad10"+
+    "\7\uad6c\7\uadc8\7\uae24\7\uae80\7\uaedc\7\uaf38\7\uaf94\7\uaff0"+
+    "\7\ub04c\7\ub0a8\7\ub104\7\ub160\7\ub1bc\7\ub218\7\ub274\7\ub2d0"+
+    "\7\ub32c\7\ub388\7\ub3e4\7\ub440\7\ub49c\7\ub4f8\7\ub554\7\ub5b0"+
+    "\7\ub60c\7\ub668\7\ub6c4\7\ub720\7\ub77c\7\ub7d8\7\ub834\7\ub890"+
+    "\7\ub8ec\7\ub948\7\ub9a4\7\uba00\7\uba5c\7\ubab8\7\ubb14\7\ubb70"+
+    "\7\ubbcc\7\ubc28\7\ubc84\7\ubce0\7\ubd3c\7\ubd98\7\ubdf4\7\ube50"+
+    "\7\ubeac\7\ubf08\7\ubf64\7\ubfc0\7\uc01c\7\uc078\7\uc0d4\7\uc130"+
+    "\7\uc18c\7\uc1e8\7\uc244\7\uc2a0\7\uc2fc\7\uc358\7\uc3b4\7\uc410"+
+    "\7\uc46c\7\uc4c8\7\uc524\6\u3528\7\uc580\7\uc5dc\7\uc638\7\uc694"+
+    "\7\uc6f0\7\uc74c\7\uc7a8\7\uc804\7\uc860\7\uc8bc\7\uc918\7\uc974"+
+    "\7\uc9d0\7\uca2c\7\uca88\7\ucae4\7\ucb40\7\ucb9c\7\ucbf8\7\ucc54"+
+    "\7\uccb0\7\ucd0c\7\ucd68\7\ucdc4\7\uce20\7\uce7c\7\uced8\7\ucf34"+
+    "\7\ucf90\7\ucfec\7\ud048\7\ud0a4\7\ud100\7\ud15c\7\ud1b8\7\ud214"+
+    "\7\ud270\7\ud2cc\7\ud328\7\ud384\7\ud3e0\7\ud43c\7\ud498\7\ud4f4"+
+    "\7\ud550\7\ud5ac\7\ud608\7\ud664\7\ud6c0\7\ud71c\7\ud778\7\ud7d4"+
+    "\7\ud830\7\ud88c\7\ud8e8\7\ud944\7\ud9a0\7\ud9fc\7\uda58\7\udab4"+
+    "\7\udb10\7\udb6c\7\udbc8\7\udc24\7\udc80\7\udcdc\7\udd38\7\udd94"+
+    "\7\uddf0\7\ude4c\7\udea8\7\udf04\7\udf60\7\udfbc\7\ue018\7\ue074"+
+    "\7\ue0d0\7\ue12c\7\ue188\7\ue1e4\7\ue240\7\ue29c\7\ue2f8\7\ue354"+
+    "\7\ue3b0\7\ue40c\7\ue468\7\ue4c4\7\ue520\7\ue57c\7\ue5d8\7\ue634"+
+    "\7\ue690\7\ue6ec\7\ue748\7\ue7a4\7\ue800\7\ue85c\7\ue8b8\7\ue914"+
+    "\7\ue970\7\ue9cc\7\uea28\7\uea84\7\ueae0\7\ueb3c\7\ueb98\7\uebf4"+
+    "\7\uec50\7\uecac\7\ued08\7\ued64\7\uedc0\7\uee1c\7\uee78\7\ueed4"+
+    "\7\uef30\7\uef8c\7\uefe8\7\uf044\5\uca10\7\uf0a0\7\uf0fc\7\uf158"+
+    "\7\uf1b4\7\uf210\7\uf26c\7\uf2c8\7\uf324\7\uf380\7\uf3dc\7\uf438"+
+    "\7\uf494\7\uf4f0\7\uf54c\7\uf5a8\7\uf604\7\uf660\7\uf6bc\7\uf718"+
+    "\7\uf774\7\uf7d0\7\uf82c\7\uf888\7\uf8e4\7\uf940\7\uf99c\7\uf9f8"+
+    "\7\ufa54\7\ufab0\7\ufb0c\7\ufb68\7\ufbc4\7\ufc20\7\ufc7c\7\ufcd8"+
+    "\7\ufd34\7\ufd90\7\ufdec\7\ufe48\7\ufea4\7\uff00\7\uff5c\7\uffb8"+
+    "\10\24\10\160\10\314\10\u0128\10\u0184\10\u01e0\10\u023c\10\u0298"+
+    "\10\u02f4\10\u0350\10\u03ac\10\u0408\10\u0464\10\u04c0\10\u051c\10\u0578"+
+    "\10\u05d4\10\u0630\10\u068c\10\u06e8\10\u0744\10\u07a0\10\u07fc\10\u0858"+
+    "\10\u08b4\10\u0910\10\u096c\10\u09c8\10\u0a24\10\u0a80\10\u0adc\10\u0b38"+
+    "\10\u0b94\10\u0bf0\10\u0c4c\10\u0ca8\10\u0d04\10\u0d60\10\u0dbc\10\u0e18"+
+    "\10\u0e74\10\u0ed0\10\u0f2c\10\u0f88\10\u0fe4\10\u1040\10\u109c\10\u10f8"+
+    "\10\u1154\10\u11b0\10\u120c\10\u1268\10\u12c4\10\u1320\10\u137c\10\u13d8"+
+    "\10\u1434\10\u1490\10\u14ec\10\u1548\10\u15a4\10\u1600\10\u165c\10\u16b8"+
+    "\10\u1714\10\u1770\10\u17cc\10\u1828\10\u1884\10\u18e0\10\u193c\10\u1998"+
+    "\10\u19f4\10\u1a50\10\u1aac\10\u1b08\10\u1b64\10\u1bc0\10\u1c1c\10\u1c78"+
+    "\10\u1cd4\10\u1d30\10\u1d8c\10\u1de8\10\u1e44\10\u1ea0\10\u1efc\10\u1f58"+
+    "\10\u1fb4\10\u2010\10\u206c\10\u20c8\10\u2124\10\u2180\10\u21dc\10\u2238"+
+    "\10\u2294\10\u22f0\10\u234c\10\u23a8\10\u2404\10\u2460\10\u24bc\10\u2518"+
+    "\10\u2574\10\u25d0\10\u262c\10\u2688\10\u26e4\10\u2740\10\u279c\10\u27f8"+
+    "\10\u2854\10\u28b0\10\u290c\10\u2968\10\u29c4\10\u2a20\10\u2a7c\10\u2ad8"+
+    "\10\u2b34\10\u2b90\10\u2bec\10\u2c48\10\u2ca4\10\u2d00\10\u2d5c\10\u2db8"+
+    "\10\u2e14\10\u2e70\10\u2ecc\10\u2f28\10\u2f84\10\u2fe0\10\u303c\10\u3098"+
+    "\10\u30f4\10\u3150\10\u31ac\10\u3208\10\u3264\10\u32c0\10\u331c\10\u3378"+
+    "\10\u33d4\10\u3430\10\u348c\10\u34e8\10\u3544\10\u35a0\10\u35fc\10\u3658"+
+    "\10\u36b4\10\u3710\10\u376c\10\u37c8\10\u3824\10\u3880\10\u38dc\10\u3938"+
+    "\10\u3994\10\u39f0\10\u3a4c\10\u3aa8\10\u3b04\10\u3b60\10\u3bbc\10\u3c18"+
+    "\10\u3c74\10\u3cd0\10\u3d2c\10\u3d88\10\u3de4\10\u3e40\10\u3e9c\10\u3ef8"+
+    "\10\u3f54\10\u3fb0\10\u400c\10\u4068\10\u40c4\10\u4120\10\u417c\10\u41d8"+
+    "\10\u4234\10\u4290\10\u42ec\10\u4348\10\u43a4\10\u4400\10\u445c\10\u44b8"+
+    "\10\u4514\10\u4570\10\u45cc\10\u4628\10\u4684\10\u46e0\10\u473c\10\u4798"+
+    "\10\u47f4\10\u4850\10\u48ac\10\u4908\10\u4964\10\u49c0\10\u4a1c\10\u4a78"+
+    "\10\u4ad4\10\u4b30\10\u4b8c\10\u4be8\10\u4c44\10\u4ca0\10\u4cfc\10\u4d58"+
+    "\10\u4db4\6\u52fc\10\u4e10\10\u4e6c\10\u4ec8\10\u4f24\10\u4f80\10\u4fdc"+
+    "\10\u5038\10\u5094\10\u50f0\10\u514c\10\u51a8\10\u5204\10\u5260\10\u52bc"+
+    "\10\u5318\10\u5374\10\u53d0\10\u542c\10\u5488\10\u54e4\10\u5540\10\u559c"+
+    "\10\u55f8\10\u5654\10\u56b0\10\u570c\10\u5768\10\u57c4\10\u5820\10\u587c"+
+    "\10\u58d8\10\u5934\10\u5990\10\u59ec\10\u5a48\10\u5aa4\10\u5b00\1\ucf3c"+
+    "\10\u5b5c\10\u5bb8\10\u5c14\10\u5c70\10\u5ccc\10\u5d28\10\u5d84\10\u5de0"+
+    "\10\u5e3c\10\u5e98\10\u5ef4\10\u5f50\10\u5fac\10\u6008\10\u6064\10\u60c0"+
+    "\10\u611c\10\u6178\10\u61d4\10\u6230\10\u628c\10\u62e8\10\u6344\10\u63a0"+
+    "\10\u63fc\10\u6458\10\u64b4\10\u6510\10\u656c\10\u65c8\10\u6624\10\u6680"+
+    "\10\u66dc\10\u6738\10\u6794\10\u67f0\10\u684c\10\u68a8\10\u6904\10\u6960"+
+    "\10\u69bc\10\u6a18\10\u6a74\10\u6ad0\10\u6b2c\10\u6b88\10\u6be4\10\u6c40"+
+    "\10\u6c9c\10\u6cf8\10\u6d54\10\u6db0\10\u6e0c\10\u6e68\10\u6ec4\10\u6f20"+
+    "\10\u6f7c\10\u6fd8\10\u7034\10\u7090\10\u70ec\10\u7148\10\u71a4\3\264"+
+    "\10\u7200\10\u725c\10\u72b8\10\u7314\10\u7370\10\u73cc\10\u7428\10\u7484"+
+    "\10\u74e0\10\u753c\10\u7598\10\u75f4\10\u7650\10\u76ac\10\u7708\10\u7764"+
+    "\10\u77c0\10\u781c\10\u7878\10\u78d4\10\u7930\10\u798c\10\u79e8\10\u7a44"+
+    "\10\u7aa0\10\u7afc\10\u7b58\10\u7bb4\10\u7c10\10\u7c6c\10\u7cc8\10\u7d24"+
+    "\10\u7d80\10\u7ddc\10\u7e38\10\u7e94\10\u7ef0\10\u7f4c\10\u7fa8\10\u8004"+
+    "\10\u8060\10\u80bc\10\u8118\10\u8174\10\u81d0\10\u822c\10\u8288\10\u82e4"+
+    "\10\u8340\10\u839c\10\u83f8\10\u8454\10\u84b0\10\u850c\10\u8568\10\u85c4"+
+    "\10\u8620\10\u867c\10\u86d8\10\u8734\10\u8790\10\u87ec\10\u8848\10\u88a4"+
+    "\10\u8900\10\u895c\10\u89b8\10\u8a14\10\u8a70\10\u8acc\10\u8b28\10\u8b84"+
+    "\10\u8be0\10\u8c3c\10\u8c98\10\u8cf4\10\u8d50\10\u8dac\10\u8e08\10\u8e64"+
+    "\10\u8ec0\10\u8f1c\10\u8f78\10\u8fd4\10\u9030\10\u908c\10\u90e8\10\u9144"+
+    "\10\u91a0\10\u91fc\10\u9258\10\u92b4\10\u9310\10\u936c\10\u93c8\10\u9424"+
+    "\10\u9480\10\u94dc\10\u9538\10\u9594\10\u95f0\10\u964c\10\u96a8\10\u9704"+
+    "\10\u9760\10\u97bc\10\u9818\10\u9874\10\u98d0\10\u992c\10\u9988\10\u99e4"+
+    "\10\u9a40\10\u9a9c\10\u9af8\10\u9b54\10\u9bb0\10\u9c0c\10\u9c68\10\u9cc4"+
+    "\10\u9d20\10\u9d7c\10\u9dd8\10\u9e34\10\u9e90\10\u9eec\10\u9f48\10\u9fa4"+
+    "\10\ua000\10\ua05c\10\ua0b8\10\ua114\10\ua170\10\ua1cc\10\ua228\10\ua284"+
+    "\10\ua2e0\10\ua33c\10\ua398\10\ua3f4\10\ua450\10\ua4ac\10\ua508\10\ua564"+
+    "\10\ua5c0\10\u0dbc\10\ua61c\10\ua678\10\ua6d4\10\ua730\10\ua78c\10\ua7e8"+
+    "\10\ua844\10\ua8a0\10\ua8fc\10\ua958\10\ua9b4\10\uaa10\10\uaa6c\10\uaac8"+
+    "\10\uab24\10\uab80\10\uabdc\10\uac38\10\uac94\10\uacf0\10\uad4c\10\uada8"+
+    "\10\uae04\10\uae60\10\uaebc\10\uaf18\10\uaf74\10\uafd0\10\ub02c\10\ub088"+
+    "\3\u8328\10\ub0e4\10\ub140\10\ub19c\10\ub1f8\10\ub254\10\ub2b0\10\ub30c"+
+    "\10\ub368\10\ub3c4\10\ub420\10\ub47c\10\ub4d8\10\ub534\10\ub590\10\ub5ec"+
+    "\10\ub648\10\ub6a4\10\ub700\10\ub75c\10\ub7b8\10\ub814\10\ub870\10\ub8cc"+
+    "\10\ub928\10\ub984\10\ub9e0\10\uba3c\10\uba98\10\ubaf4\10\ubb50\10\ubbac"+
+    "\10\ubc08\10\ubc64\10\ubcc0\10\ubd1c\10\ubd78\10\ubdd4\10\ube30\10\ube8c"+
+    "\10\ubee8\10\ubf44\10\ubfa0\10\ubffc\10\uc058\10\uc0b4\10\uc110\10\uc16c"+
+    "\10\uc1c8\10\uc224\10\uc280\10\uc2dc\10\uc338\10\uc394\10\uc3f0\10\uc44c"+
+    "\10\uc4a8\10\uc504\10\uc560\10\uc5bc\10\uc618\10\uc674\10\uc6d0\10\uc72c"+
+    "\10\uc788\10\uc7e4\10\uc840\10\uc89c\10\uc8f8\10\uc954\10\uc9b0\10\uca0c"+
+    "\10\uca68\10\ucac4\10\ucb20\10\ucb7c\10\ucbd8\10\ucc34\10\ucc90\10\uccec"+
+    "\10\ucd48\10\ucda4\10\uce00\10\uce5c\10\uceb8\10\ucf14\10\ucf70\10\ucfcc"+
+    "\10\ud028\10\ud084\10\ud0e0\10\ud13c\10\ud198\10\ud1f4\10\ud250\10\ud2ac"+
+    "\10\ud308\10\ud364\10\ud3c0\10\ud41c\10\ud478\10\ud4d4\10\ud530\10\ud58c"+
+    "\10\ud5e8\10\ud644\10\ud6a0\10\ud6fc\10\ud758\10\ud7b4\10\ud810\10\ud86c"+
+    "\10\ud8c8\10\ud924\10\ud980\10\ud9dc\10\uda38\10\uda94\10\udaf0\10\udb4c"+
+    "\10\udba8\10\udc04\10\udc60\10\udcbc\10\udd18\10\udd74\10\uddd0\10\ude2c"+
+    "\10\ude88\10\udee4\10\udf40\10\udf9c\10\udff8\10\ue054\10\ue0b0\10\ue10c"+
+    "\10\ue168\10\ue1c4\10\ue220\10\ue27c\10\ue2d8\10\ue334\10\ue390\10\ue3ec"+
+    "\10\ue448\10\ue4a4\10\ue500\10\ue55c\10\ue5b8\10\ue614\10\ue670\10\ue6cc"+
+    "\10\ue728\10\ue784\10\ue7e0\10\ue83c\10\ue898\10\ue8f4\10\ue950\10\ue9ac"+
+    "\10\uea08\10\uea64\10\ueac0\10\ueb1c\10\ueb78\10\uebd4\10\uec30\10\uec8c"+
+    "\10\uece8\10\ued44\10\ueda0\10\uedfc\10\uee58\10\ueeb4\10\uef10\10\uef6c"+
+    "\10\uefc8\10\uf024\10\uf080\10\uf0dc\10\uf138\10\uf194\10\uf1f0\10\uf24c"+
+    "\10\uf2a8\10\uf304\10\uf360\10\uf3bc\0\ud23c\10\uf418\10\uf474\10\uf4d0"+
+    "\10\uf52c\10\uf588\10\uf5e4\10\uf640\10\uf69c\10\uf6f8\10\uf754\10\uf7b0"+
+    "\10\uf80c\10\uf868\10\uf8c4\10\uf920\10\uf97c\10\uf9d8\10\ufa34\10\ufa90"+
+    "\10\ufaec\10\ufb48\10\ufba4\10\ufc00\10\ufc5c\10\ufcb8\10\ufd14\10\ufd70"+
+    "\10\ufdcc\10\ufe28\10\ufe84\10\ufee0\10\uff3c\10\uff98\10\ufff4\11\120"+
+    "\11\254\11\u0108\11\u0164\11\u01c0\11\u021c\11\u0278\11\u02d4\11\u0330"+
+    "\11\u038c\11\u03e8\11\u0444\11\u04a0\11\u04fc\11\u0558\11\u05b4\11\u0610"+
+    "\11\u066c\11\u06c8\11\u0724\11\u0780\11\u07dc\11\u0838\11\u0894\11\u08f0"+
+    "\11\u094c\11\u09a8\11\u0a04\11\u0a60\11\u0abc\11\u0b18\11\u0b74\11\u0bd0"+
+    "\11\u0c2c\11\u0c88\11\u0ce4\11\u0d40\11\u0d9c\11\u0df8\11\u0e54\11\u0eb0"+
+    "\11\u0f0c\11\u0f68\11\u0fc4\11\u1020\11\u107c\11\u10d8\11\u1134\11\u1190"+
+    "\11\u11ec\11\u1248\11\u12a4\11\u1300\11\u135c\11\u13b8\11\u1414\11\u1470"+
+    "\11\u14cc\11\u1528\11\u1584\11\u15e0\11\u163c\11\u1698\11\u16f4\11\u1750"+
+    "\11\u17ac\11\u1808\11\u1864\11\u18c0\11\u191c\11\u1978\11\u19d4\11\u1a30"+
+    "\4\u9bd4\11\u1a8c\11\u1ae8\11\u1b44\11\u1ba0\11\u1bfc\11\u1c58\11\u1cb4"+
+    "\11\u1d10\11\u1d6c\11\u1dc8\11\u1e24\11\u1e80\11\u1edc\11\u1f38\11\u1f94"+
+    "\11\u1ff0\11\u204c\11\u20a8\11\u2104\11\u2160\11\u21bc\5\u5e40\11\u2218"+
+    "\11\u2274\11\u22d0\11\u232c\11\u2388\11\u23e4\11\u2440\11\u249c\11\u24f8"+
+    "\11\u2554\11\u25b0\11\u260c\11\u2668\11\u26c4\11\u2720\11\u277c\11\u27d8"+
+    "\11\u2834\11\u2890\11\u28ec\11\u2948\11\u29a4\11\u2a00\11\u2a5c\11\u2ab8"+
+    "\11\u2b14\11\u2b70\11\u2bcc\11\u2c28\11\u2c84\11\u2ce0\11\u2d3c\11\u2d98"+
+    "\11\u2df4\11\u2e50\11\u2eac\11\u2f08\11\u2f64\11\u2fc0\11\u301c\11\u3078"+
+    "\11\u30d4\11\u3130\11\u318c\11\u31e8\11\u3244\11\u32a0\11\u32fc\11\u3358"+
+    "\11\u33b4\11\u3410\11\u346c\11\u34c8\11\u3524\11\u3580\11\u35dc\11\u3638"+
+    "\11\u3694\11\u36f0\11\u374c\11\u37a8\11\u3804\11\u3860\11\u38bc\11\u3918"+
+    "\11\u3974\11\u39d0\11\u3a2c\11\u3a88\11\u3ae4\11\u3b40\11\u3b9c\11\u3bf8"+
+    "\11\u3c54\11\u3cb0\11\u3d0c\11\u3d68\11\u3dc4\11\u3e20\11\u3e7c\11\u3ed8"+
+    "\11\u3f34\11\u3f90\11\u3fec\11\u4048\11\u40a4\11\u4100\11\u415c\11\u41b8"+
+    "\11\u4214\11\u4270\11\u42cc\11\u4328\11\u4384\11\u43e0\11\u443c\11\u4498"+
+    "\11\u44f4\11\u4550\11\u45ac\11\u4608\11\u4664\11\u46c0\11\u471c\11\u4778"+
+    "\11\u47d4\11\u4830\11\u488c\11\u48e8\11\u4944\11\u49a0\11\u49fc\11\u4a58"+
+    "\11\u4ab4\11\u4b10\11\u4b6c\11\u4bc8\11\u4c24\11\u4c80\11\u4cdc\11\u4d38"+
+    "\11\u4d94\11\u4df0\7\u6f9c\11\u4e4c\11\u4ea8\11\u4f04\11\u4f60\11\u4fbc"+
+    "\11\u5018\11\u5074\11\u50d0\11\u512c\11\u5188\11\u51e4\11\u5240\11\u529c"+
+    "\11\u52f8\11\u5354\11\u53b0\11\u540c\11\u5468\11\u54c4\11\u5520\11\u557c"+
+    "\11\u55d8\11\u5634\11\u5690\11\u56ec\11\u5748\11\u57a4\11\u5800\11\u585c"+
+    "\11\u58b8\11\u5914\11\u5970\11\u59cc\11\u5a28\11\u5a84\11\u5ae0\11\u5b3c"+
+    "\11\u5b98\11\u5bf4\11\u5c50\11\u5cac\11\u5d08\11\u5d64\11\u5dc0\11\u5e1c"+
+    "\11\u5e78\11\u5ed4\11\u5f30\11\u5f8c\11\u5fe8\11\u6044\11\u60a0\11\u60fc"+
+    "\11\u6158\11\u61b4\11\u6210\11\u626c\11\u62c8\11\u6324\11\u6380\11\u63dc"+
+    "\11\u6438\11\u6494\11\u64f0\11\u654c\11\u65a8\11\u6604\11\u6660\11\u66bc"+
+    "\11\u6718\11\u6774\11\u67d0\11\u682c\11\u6888\2\ub650\11\u68e4\11\u6940"+
+    "\11\u699c\11\u69f8\11\u6a54\11\u6ab0\11\u6b0c\11\u6b68\11\u6bc4\11\u6c20"+
+    "\11\u39d0\11\u6c7c\11\u6cd8\11\u6d34\11\u6d90\11\u6dec\11\u6e48\11\u6ea4"+
+    "\11\u6f00\11\u6f5c\11\u6fb8\11\u7014\11\u7070\11\u70cc\11\u7128\11\u7184"+
+    "\11\u71e0\11\u723c\11\u7298\11\u72f4\11\u7350\11\u73ac\11\u7408\11\u7464"+
+    "\11\u74c0\11\u751c\11\u7578\11\u75d4\11\u7630\11\u768c\11\u76e8\11\u7744"+
+    "\11\u77a0\11\u77fc\11\u7858\11\u78b4\11\u7910\11\u796c\11\u79c8\11\u7a24"+
+    "\11\u7a80\11\u7adc\11\u7b38\11\u7b94\11\u7bf0\11\u7c4c\11\u7ca8\11\u7d04"+
+    "\11\u7d60\11\u7dbc\11\u7e18\11\u7e74\11\u7ed0\11\u7f2c\11\u7f88\11\u7fe4"+
+    "\11\u8040\11\u809c\11\u80f8\11\u8154\7\ubab8\11\u81b0\11\u820c\11\u8268"+
+    "\11\u82c4\11\u8320\11\u837c\11\u83d8\11\u8434\11\u8490\11\u84ec\11\u8548"+
+    "\11\u85a4\11\u8600\11\u865c\11\u86b8\11\u8714\11\u8770\11\u87cc\11\u8828"+
+    "\11\u8884\11\u88e0\11\u893c\11\u8998\11\u89f4\11\u8a50\11\u8aac\11\u8b08"+
+    "\11\u8b64\11\u8bc0\11\u8c1c\11\u8c78\11\u8cd4\11\u8d30\11\u8d8c\11\u8de8"+
+    "\11\u8e44\11\u8ea0\11\u8efc\11\u8f58\11\u8fb4\11\u9010\11\u906c\11\u90c8"+
+    "\11\u9124\11\u9180\11\u91dc\11\u9238\11\u9294\11\u92f0\11\u934c\11\u93a8"+
+    "\11\u9404\11\u9460\11\u94bc\11\u9518\11\u9574\6\u2bd0\11\u95d0\11\u962c"+
+    "\11\u9688\11\u96e4\11\u9740\11\u979c\11\u97f8\11\u9854\11\u98b0\11\u990c"+
+    "\11\u9968\11\u99c4\11\u9a20\11\u9a7c\11\u9ad8\11\u9b34\11\u9b90\11\u9bec"+
+    "\11\u9c48\11\u9ca4\11\u9d00\11\u9d5c\11\u9db8\11\u9e14\11\u9e70\11\u9ecc"+
+    "\11\u9f28\10\ufee0\11\u9f84\11\u9fe0\11\ua03c\11\ua098\11\ua0f4\11\ua150"+
+    "\11\ua1ac\11\ua208\11\ua264\11\ua2c0\11\ua31c\11\ua378\11\ua3d4\11\ua430"+
+    "\11\ua48c\11\ua4e8\11\ua544\11\ua5a0\11\ua5fc\11\ua658\11\ua6b4\11\ua710"+
+    "\11\ua76c\11\ua7c8\11\ua824\11\ua880\11\ua8dc\11\ua938\11\ua994\11\ua9f0"+
+    "\11\uaa4c\11\uaaa8\11\uab04\11\uab60\11\uabbc\11\uac18\11\uac74\11\uacd0"+
+    "\11\uad2c\11\uad88\11\uade4\11\uae40\11\uae9c\11\uaef8\11\uaf54\11\uafb0"+
+    "\11\ub00c\11\ub068\11\ub0c4\11\ub120\11\ub17c\11\ub1d8\11\ub234\10\u1bc0"+
+    "\11\ub290\11\ub2ec\11\ub348\11\ub3a4\11\ub400\11\ub45c\11\ub4b8\11\ub514"+
+    "\11\ub570\11\ub5cc\11\ub628\11\ub684\11\ub6e0\11\ub73c\11\ub798\11\ub7f4"+
+    "\11\ub850\11\ub8ac\11\ub908\11\ub964\11\ub9c0\11\uba1c\11\uba78\11\ubad4"+
+    "\11\ubb30\11\ubb8c\11\ubbe8\11\ubc44\11\ubca0\11\ubcfc\11\ubd58\11\ubdb4"+
+    "\11\ube10\11\ube6c\11\ubec8\11\ubf24\11\ubf80\11\ubfdc\11\uc038\11\uc094"+
+    "\11\uc0f0\11\uc14c\11\uc1a8\11\uc204\11\uc260\11\uc2bc\11\uc318\11\uc374"+
+    "\11\uc3d0\11\uc42c\11\uc488\11\uc4e4\11\uc540\11\uc59c\11\uc5f8\11\uc654"+
+    "\11\uc6b0\11\uc70c\11\uc768\11\uc7c4\11\uc820\11\uc87c\11\uc8d8\11\uc934"+
+    "\11\uc990\11\uc9ec\11\uca48\11\ucaa4\11\ucb00\11\ucb5c\11\ucbb8\11\ucc14"+
+    "\11\ucc70\11\ucccc\11\ucd28\11\ucd84\11\ucde0\11\uce3c\11\uce98\11\ucef4"+
+    "\11\ucf50\11\ucfac\11\ud008\11\ud064\11\ud0c0\11\ud11c\11\ud178\11\ud1d4"+
+    "\11\ud230\11\ud28c\11\ud2e8\11\ud344\11\ud3a0\11\ud3fc\11\ud458\11\ud4b4"+
+    "\11\ud510\11\ud56c\11\ud5c8\11\ud624\11\ud680\11\ud6dc\11\ud738\11\ud794"+
+    "\11\ud7f0\11\ud84c\11\ud8a8\11\ud904\11\ud960\11\ud9bc\11\uda18\11\uda74"+
+    "\11\udad0\11\udb2c\11\udb88\11\udbe4\11\udc40\11\udc9c\11\udcf8\11\udd54"+
+    "\11\uddb0\11\ude0c\11\ude68\11\udec4\11\udf20\11\udf7c\11\udfd8\11\ue034"+
+    "\11\ue090\11\ue0ec\11\ue148\5\u8cf8\3\u3c5c\11\ue1a4\11\ue200\11\ue25c"+
+    "\11\ue2b8\11\ue314\11\ue370\11\ue3cc\11\ue428\11\ue484\11\ue4e0\11\ue53c"+
+    "\11\ue598\11\ue5f4\11\ue650\11\ue6ac\11\ue708\11\ue764\11\ue7c0\11\ue81c"+
+    "\11\ue878\11\ue8d4\11\ue930\11\ue98c\11\ue9e8\11\uea44\11\ueaa0\11\ueafc"+
+    "\11\ueb58\11\uebb4\11\uec10\11\uec6c\11\uecc8\11\ued24\11\ued80\11\ueddc"+
+    "\11\uee38\11\uee94\11\ueef0\11\uef4c\11\uefa8\11\uf004\11\uf060\11\uf0bc"+
+    "\11\uf118\11\uf174\11\uf1d0\11\uf22c\11\uf288\11\uf2e4\11\uf340\11\uf39c"+
+    "\11\uf3f8\11\uf454\11\uf4b0\11\uf50c\11\uf568\11\uf5c4\11\uf620\11\uf67c"+
+    "\11\uf6d8\11\uf734\11\uf790\11\uf7ec\11\uf848\11\uf8a4\11\uf900\11\uf95c"+
+    "\11\uf9b8\11\ufa14\11\ufa70\11\ufacc\11\ufb28\11\ufb84\11\ufbe0\11\ufc3c"+
+    "\11\ufc98\11\ufcf4\11\ufd50\11\ufdac\11\ufe08\11\ufe64\11\u3cb0\11\ufec0"+
+    "\11\uff1c\11\uff78\11\uffd4\12\60\12\214\12\350\12\u0144\12\u01a0"+
+    "\12\u01fc\12\u0258\12\u02b4\12\u0310\12\u036c\12\u03c8\12\u0424\12\u0480"+
+    "\12\u04dc\12\u0538\12\u0594\12\u05f0\12\u064c\12\u06a8\12\u0704\12\u0760"+
+    "\12\u07bc\12\u0818\12\u0874\12\u08d0\12\u092c\12\u0988\12\u09e4\12\u0a40"+
+    "\12\u0a9c\12\u0af8\12\u0b54\12\u0bb0\12\u0c0c\12\u0c68\12\u0cc4\12\u0d20"+
+    "\12\u0d7c\12\u0dd8\12\u0e34\12\u0e90\12\u0eec\12\u0f48\12\u0fa4\12\u1000"+
+    "\12\u105c\12\u10b8\12\u1114\12\u1170\12\u11cc\12\u1228\12\u1284\12\u12e0"+
+    "\12\u133c\12\u1398\12\u13f4\12\u1450\12\u14ac\12\u1508\12\u1564\12\u15c0"+
+    "\12\u161c\12\u1678\12\u16d4\12\u1730\12\u178c\12\u17e8\12\u1844\12\u18a0"+
+    "\12\u18fc\12\u1958\12\u19b4\12\u1a10\12\u1a6c\12\u1ac8\12\u1b24\12\u1b80"+
+    "\12\u1bdc\12\u1c38\12\u1c94\12\u1cf0\12\u1d4c\12\u1da8\12\u1e04\12\u1e60"+
+    "\12\u1ebc\12\u1f18\12\u1f74\12\u1fd0\12\u202c\12\u2088\12\u20e4\12\u2140"+
+    "\12\u219c\12\u21f8\12\u2254\12\u22b0\12\u230c\12\u2368\12\u23c4\12\u2420"+
+    "\12\u247c\12\u24d8\12\u2534\12\u2590\12\u25ec\12\u2648\7\ufc7c\12\u26a4"+
+    "\12\u2700\12\u275c\12\u27b8\12\u2814\12\u2870\12\u28cc\12\u2928\12\u2984"+
+    "\12\u29e0\5\ubb54\12\u2a3c\12\u2a98\12\u2af4\12\u2b50\12\u2bac\12\u2c08"+
+    "\12\u2c64\12\u2cc0\12\u2d1c\12\u2d78\12\u2dd4\12\u2e30\12\u2e8c\12\u2ee8"+
+    "\12\u2f44\12\u2fa0\12\u2ffc\12\u3058\12\u30b4\12\u3110\12\u316c\12\u31c8"+
+    "\12\u3224\12\u3280\11\u8998\12\u32dc\12\u3338\12\u3394\12\u33f0\12\u344c"+
+    "\12\u34a8\12\u3504\12\u3560\12\u35bc\12\u3618\12\u3674\12\u36d0\12\u372c"+
+    "\12\u3788\12\u37e4\12\u3840\12\u389c\12\u38f8\12\u3954\12\u39b0\12\u3a0c"+
+    "\12\u3a68\12\u3ac4\12\u3b20\12\u3b7c\12\u3bd8\12\u3c34\12\u3c90\12\u3cec"+
+    "\12\u3d48\12\u3da4\12\u3e00\12\u3e5c\12\u3eb8\12\u3f14\12\u3f70\12\u3fcc"+
+    "\12\u4028\12\u4084\12\u40e0\12\u413c\12\u4198\12\u41f4\12\u4250\12\u42ac"+
+    "\12\u4308\12\u4364\12\u43c0\12\u441c\12\u4478\12\u44d4\12\u4530\12\u458c"+
+    "\12\u45e8\12\u4644\12\u46a0\12\u46fc\12\u4758\12\u47b4\12\u4810\12\u486c"+
+    "\12\u48c8\12\u4924\12\u4980\12\u49dc\12\u4a38\12\u4a94\12\u4af0\12\u4b4c"+
+    "\12\u4ba8\12\u4c04\12\u4c60\12\u4cbc\12\u4d18\12\u4d74\12\u4dd0\12\u4e2c"+
+    "\12\u4e88\12\u4ee4\12\u4f40\12\u4f9c\12\u4ff8\12\u5054\12\u50b0\12\u510c"+
+    "\12\u5168\12\u51c4\12\u5220\12\u527c\12\u52d8\12\u5334\12\u5390\12\u53ec"+
+    "\12\u5448\12\u54a4\12\u5500\12\u555c\12\u55b8\12\u5614\12\u5670\12\u56cc"+
+    "\12\u5728\12\u5784\12\u57e0\12\u583c\12\u5898\12\u58f4\12\u5950\12\u59ac"+
+    "\12\u5a08\12\u5a64\12\u5ac0\12\u5b1c\12\u5b78\12\u5bd4\12\u5c30\12\u5c8c"+
+    "\12\u5ce8\12\u5d44\12\u5da0\12\u5dfc\12\u5e58\12\u5eb4\12\u5f10\12\u5f6c"+
+    "\12\u5fc8\12\u6024\12\u6080\12\u60dc\4\u7b7c\12\u6138\12\u6194\12\u61f0"+
+    "\12\u624c\12\u62a8\12\u6304\12\u6360\12\u63bc\12\u6418\12\u6474\12\u64d0"+
+    "\12\u652c\12\u6588\12\u65e4\12\u6640\12\u669c\12\u66f8\12\u6754\12\u67b0"+
+    "\12\u680c\12\u6868\12\u68c4\12\u6920\12\u697c\12\u69d8\12\u6a34\12\u6a90"+
+    "\12\u6aec\12\u6b48\12\u6ba4\12\u6c00\12\u6c5c\12\u6cb8\12\u6d14\12\u6d70"+
+    "\12\u6dcc\12\u6e28\12\u6e84\12\u6ee0\12\u6f3c\12\u6f98\12\u6ff4\12\u7050"+
+    "\12\u70ac\12\u7108\12\u7164\12\u71c0\12\u721c\12\u7278\12\u72d4\12\u7330"+
+    "\12\u738c\12\u73e8\12\u7444\12\u74a0\12\u74fc\12\u7558\12\u75b4\12\u7610"+
+    "\12\u766c\12\u76c8\12\u7724\12\u7780\12\u77dc\12\u7838\12\u7894\12\u78f0"+
+    "\12\u794c\12\u79a8\12\u7a04\12\u7a60\12\u7abc\12\u7b18\12\u7b74\12\u7bd0"+
+    "\12\u7c2c\12\u7c88\12\u7ce4\12\u7d40\12\u7d9c\12\u7df8\12\u7e54\12\u7eb0"+
+    "\12\u7f0c\12\u7f68\12\u7fc4\12\u8020\12\u807c\12\u80d8\12\u8134\12\u8190"+
+    "\12\u81ec\12\u8248\12\u82a4\12\u8300\12\u835c\12\u83b8\12\u8414\12\u8470"+
+    "\12\u84cc\12\u8528\12\u8584\12\u85e0\12\u863c\12\u8698\12\u86f4\12\u8750"+
+    "\12\u87ac\12\u8808\12\u8864\12\u88c0\12\u891c\12\u8978\12\u89d4\12\u8a30"+
+    "\12\u8a8c\12\u8ae8\12\u8b44\12\u8ba0\12\u8bfc\12\u8c58\12\u8cb4\12\u8d10"+
+    "\12\u8d6c\12\u8dc8\12\u8e24\12\u8e80\12\u8edc\12\u8f38\12\u8f94\12\u8ff0"+
+    "\12\u904c\12\u90a8\12\u9104\12\u9160\12\u91bc\12\u9218\12\u9274\12\u92d0"+
+    "\12\u932c\12\u9388\12\u93e4\12\u9440\12\u949c\12\u94f8\12\u9554\12\u95b0"+
+    "\12\u960c\12\u9668\12\u96c4\12\u9720\12\u977c\12\u97d8\12\u9834\12\u9890"+
+    "\12\u98ec\12\u9948\12\u99a4\12\u9a00\12\u9a5c\12\u9ab8\12\u9b14\12\u9b70"+
+    "\12\u9bcc\12\u9c28\12\u9c84\12\u9ce0\12\u9d3c\12\u9d98\12\u9df4\12\u9e50"+
+    "\12\u9eac\12\u9f08\12\u9f64\12\u9fc0\12\ua01c\12\ua078\12\ua0d4\12\ua130"+
+    "\12\ua18c\12\ua1e8\12\ua244\12\ua2a0\12\ua2fc\12\ua358\12\ua3b4\12\ua410"+
+    "\10\u9a40";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[7729];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\24\1\25\1\26\1\27\1\30\1\31\126\24\2\32"+
+    "\1\33\35\32\1\34\20\32\1\35\4\32\1\36\3\32"+
+    "\1\37\41\32\2\40\1\41\14\40\1\42\114\40\1\43"+
+    "\1\44\1\0\1\45\1\30\2\43\1\46\1\47\6\43"+
+    "\1\50\25\43\1\51\23\43\1\52\42\43\2\53\1\0"+
+    "\1\53\1\54\2\53\2\54\1\55\1\56\1\57\1\60"+
+    "\1\61\1\62\1\54\3\53\1\63\1\53\1\64\7\53"+
+    "\1\65\1\66\1\67\5\53\1\54\6\53\1\60\1\53"+
+    "\1\62\1\57\1\67\1\66\1\70\1\65\1\55\1\61"+
+    "\1\71\2\53\1\54\1\53\1\70\1\72\1\73\1\53"+
+    "\2\74\1\75\1\64\1\53\1\76\1\77\1\100\1\71"+
+    "\2\53\1\63\1\76\1\56\1\72\1\73\1\75\1\53"+
+    "\1\100\2\53\1\77\7\53\3\101\1\102\3\101\1\103"+
+    "\124\101\3\104\1\102\65\104\1\103\42\104\1\43\1\44"+
+    "\1\0\1\45\1\30\2\43\1\105\1\106\6\43\1\107"+
+    "\25\43\1\51\23\43\1\110\42\43\3\101\1\102\3\101"+
+    "\1\111\124\101\3\104\1\102\65\104\1\111\42\104\1\112"+
+    "\1\30\1\113\1\114\1\30\1\115\1\116\1\117\1\120"+
+    "\3\121\1\122\2\121\1\123\1\121\1\124\1\125\1\121"+
+    "\1\124\1\126\1\127\2\112\2\121\1\130\4\121\1\131"+
+    "\1\132\1\133\1\116\1\134\4\130\3\51\1\135\1\136"+
+    "\1\137\1\140\1\141\1\142\1\143\1\144\1\145\1\146"+
+    "\1\121\1\112\1\133\1\147\1\150\2\121\1\151\12\121"+
+    "\1\124\1\121\1\152\1\121\1\153\1\121\1\154\1\155"+
+    "\1\121\1\156\3\121\3\124\1\121\3\124\2\157\1\160"+
+    "\25\157\1\161\40\157\1\162\42\157\2\163\1\164\4\163"+
+    "\1\165\20\163\1\166\103\163\2\167\1\170\1\171\27\167"+
+    "\1\172\25\167\1\35\4\167\1\36\3\167\1\37\41\167"+
+    "\2\173\1\174\1\175\55\173\1\176\4\173\1\177\3\173"+
+    "\1\200\41\173\1\112\1\30\1\201\1\202\1\30\1\115"+
+    "\1\116\1\203\1\204\6\121\1\123\1\121\1\124\1\125"+
+    "\1\121\1\124\1\205\1\116\1\206\1\112\1\207\1\210"+
+    "\1\130\4\121\1\131\1\132\1\133\1\116\1\134\4\130"+
+    "\1\211\2\51\1\212\1\213\1\214\1\215\1\216\1\217"+
+    "\1\220\1\221\1\222\1\223\1\224\1\225\1\133\1\226"+
+    "\1\227\5\121\1\230\7\121\1\124\1\121\1\231\1\232"+
+    "\1\233\1\234\1\235\1\236\1\237\1\240\1\241\1\242"+
+    "\1\243\3\124\1\244\3\124\2\245\1\246\30\245\1\247"+
+    "\25\245\1\35\4\245\1\36\3\245\1\37\41\245\2\250"+
+    "\1\251\4\250\1\252\20\250\1\253\1\250\1\254\101\250"+
+    "\2\157\1\255\25\157\1\256\40\157\1\257\42\157\2\24"+
+    "\4\0\127\24\1\25\2\0\1\30\1\0\126\24\144\0"+
+    "\1\260\1\261\5\262\1\0\6\262\6\0\4\262\10\0"+
+    "\1\263\1\264\2\0\10\262\1\261\2\262\3\0\42\262"+
+    "\1\0\1\30\2\0\1\30\127\0\4\31\1\0\1\31"+
+    "\1\265\125\31\2\32\1\0\35\32\1\0\20\32\1\0"+
+    "\4\32\1\0\3\32\1\0\41\32\40\0\1\266\147\0"+
+    "\1\267\1\0\1\270\133\0\1\271\147\0\1\272\41\0"+
+    "\2\40\1\0\14\40\1\0\114\40\2\43\1\0\1\43"+
+    "\1\0\2\43\2\0\6\43\1\0\25\43\1\0\23\43"+
+    "\1\0\43\43\1\44\1\0\1\43\1\30\2\43\2\0"+
+    "\6\43\1\0\25\43\1\0\23\43\1\0\44\43\1\0"+
+    "\1\43\1\0\2\43\2\0\6\43\1\0\25\43\1\0"+
+    "\3\43\1\273\17\43\1\0\42\43\17\0\1\50\114\0"+
+    "\2\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\1\53\1\274\2\53\1\275\1\276\1\0"+
+    "\5\53\1\277\11\53\1\300\5\53\1\0\10\53\1\276"+
+    "\1\53\1\300\1\53\1\301\2\53\1\275\3\53\1\0"+
+    "\1\53\1\301\1\302\2\53\2\303\1\53\1\277\11\53"+
+    "\1\274\1\302\20\53\1\0\1\53\1\0\2\53\2\0"+
+    "\3\53\1\304\2\53\1\0\17\53\1\305\5\53\1\0"+
+    "\6\53\1\304\3\53\1\305\1\53\1\306\6\53\1\0"+
+    "\1\53\1\306\1\307\20\53\1\307\20\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\5\53\1\310\17\53"+
+    "\1\0\23\53\1\0\10\53\1\310\33\53\1\0\1\53"+
+    "\1\0\2\53\2\0\1\311\5\53\1\0\15\53\1\312"+
+    "\1\313\6\53\1\0\13\53\1\313\1\53\1\312\1\311"+
+    "\4\53\1\0\3\53\1\314\1\53\2\315\15\53\1\314"+
+    "\17\53\1\0\1\53\1\0\2\53\2\0\2\53\1\316"+
+    "\3\53\1\0\15\53\1\317\7\53\1\0\11\53\1\316"+
+    "\2\53\1\320\1\317\5\53\1\0\1\53\1\320\42\53"+
+    "\1\0\1\53\1\0\2\53\2\0\2\53\1\77\1\321"+
+    "\1\53\1\77\1\0\3\53\1\322\12\53\1\323\1\324"+
+    "\5\53\1\0\6\53\1\321\1\53\2\77\1\324\1\323"+
+    "\1\325\3\53\1\326\2\53\1\0\1\53\1\325\5\53"+
+    "\1\77\5\53\1\326\2\53\1\322\4\53\1\77\16\53"+
+    "\1\0\1\53\1\0\2\53\2\0\2\53\1\77\1\315"+
+    "\2\53\1\0\5\53\1\327\7\53\1\330\7\53\1\0"+
+    "\6\53\1\315\1\331\1\53\1\77\2\53\1\332\1\330"+
+    "\5\53\1\0\1\53\1\332\1\333\4\53\1\334\1\327"+
+    "\1\331\11\53\1\333\1\53\1\334\16\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\15\53\1\77\7\53"+
+    "\1\0\15\53\1\77\5\53\1\0\44\53\1\0\1\53"+
+    "\1\0\2\53\2\0\3\53\1\335\2\53\1\0\17\53"+
+    "\1\336\5\53\1\0\6\53\1\335\3\53\1\336\1\53"+
+    "\1\337\6\53\1\0\1\53\1\337\42\53\1\0\1\53"+
+    "\1\0\2\53\2\0\2\53\1\340\1\341\2\53\1\0"+
+    "\25\53\1\0\6\53\1\341\2\53\1\340\11\53\1\0"+
+    "\2\53\1\342\20\53\1\342\20\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\23\53\1\0"+
+    "\5\53\2\343\5\53\1\344\12\53\1\344\14\53\1\0"+
+    "\1\53\1\0\2\53\2\0\1\345\1\346\1\347\1\53"+
+    "\1\350\1\53\1\0\3\53\1\351\1\53\1\352\17\53"+
+    "\1\0\11\53\1\347\4\53\1\345\1\350\3\53\1\0"+
+    "\7\53\1\353\1\352\7\53\1\351\1\53\1\346\2\53"+
+    "\1\353\16\53\1\0\1\53\1\0\2\53\2\0\2\53"+
+    "\1\77\2\53\1\354\1\0\17\53\1\355\5\53\1\0"+
+    "\10\53\1\354\1\77\1\355\10\53\1\0\16\53\1\77"+
+    "\14\53\3\77\1\53\2\77\3\53\1\0\1\53\1\0"+
+    "\2\53\2\0\4\53\1\356\1\53\1\0\3\53\1\357"+
+    "\1\53\1\360\7\53\1\77\7\53\1\0\15\53\1\77"+
+    "\1\53\1\356\3\53\1\0\10\53\1\360\7\53\1\357"+
+    "\23\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\17\53\1\361\5\53\1\0\12\53\1\361\1\53\1\362"+
+    "\6\53\1\0\1\53\1\362\1\363\20\53\1\363\20\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\5\53"+
+    "\1\364\11\53\1\365\5\53\1\0\12\53\1\365\1\53"+
+    "\1\366\6\53\1\0\1\53\1\366\6\53\1\364\33\53"+
+    "\1\0\1\53\1\0\2\53\2\0\3\53\1\367\1\53"+
+    "\1\77\1\0\15\53\1\77\1\370\1\371\5\53\1\0"+
+    "\6\53\1\367\1\53\1\77\1\53\1\371\1\370\1\372"+
+    "\1\77\5\53\1\0\1\53\1\372\5\53\1\77\15\53"+
+    "\1\77\16\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\3\53\1\373\13\53\1\374\5\53\1\0\12\53"+
+    "\1\374\10\53\1\0\20\53\1\373\23\53\1\0\1\53"+
+    "\1\0\2\53\2\0\3\53\1\375\2\53\1\0\25\53"+
+    "\1\0\6\53\1\375\5\53\1\376\6\53\1\0\1\53"+
+    "\1\376\40\53\3\101\1\0\3\101\1\0\124\101\51\0"+
+    "\1\377\62\0\3\104\1\0\65\104\1\0\42\104\17\0"+
+    "\1\u0100\114\0\1\112\10\0\6\112\1\0\6\112\1\0"+
+    "\4\112\1\0\4\112\14\0\14\112\2\0\42\112\3\0"+
+    "\1\u0101\4\0\1\u0102\34\0\1\51\3\0\1\264\67\0"+
+    "\1\51\37\0\1\51\66\0\10\u0103\1\u0104\17\u0103\1\u0105"+
+    "\2\u0103\1\u0106\11\u0103\1\u0107\66\u0103\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0109\15\121\17\0"+
+    "\1\u010a\25\0\1\51\66\0\1\u010b\10\0\6\u010b\1\0"+
+    "\1\u010b\2\124\1\u010b\1\124\1\u010b\1\0\4\u010b\1\0"+
+    "\1\u010b\1\u010c\1\u010d\1\u010e\1\0\1\u010f\12\0\4\u010b"+
+    "\1\u010e\1\u010d\1\u010b\1\u010c\4\u010b\2\0\7\u010b\1\u010d"+
+    "\6\u010b\1\124\6\u010b\1\u010d\5\u010b\3\124\1\u010b\3\124"+
+    "\1\u010b\10\0\6\u010b\1\0\1\u010b\1\u0110\1\u0111\1\u010b"+
+    "\1\u0111\1\u010b\1\0\4\u010b\1\0\1\u0112\1\u010c\1\u010d"+
+    "\1\u010e\1\0\1\u010f\12\0\4\u010b\1\u010e\1\u010d\1\u010b"+
+    "\1\u010c\4\u010b\2\0\7\u010b\1\u010d\6\u010b\1\u0111\6\u010b"+
+    "\1\u010d\2\u010b\1\u0112\2\u010b\3\u0111\1\u010b\2\u0111\1\u0110"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0113\15\121\45\0\1\51\126\0\1\51\4\0\1\51"+
+    "\107\0\2\u010f\1\0\1\u010f\63\0\1\u010f\14\0\3\u010f"+
+    "\1\0\3\u010f\44\0\2\51\66\0\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u0114\2\121\1\u0115\2\121\1\112\2\0"+
+    "\6\121\1\u0116\15\121\1\u0117\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0118\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0119\6\121\1\u011a\1\112"+
+    "\2\0\26\121\1\u011b\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u011c\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u011d\1\u011e\2\121\1\112\2\0"+
+    "\24\121\1\u011f\2\121\1\u0120\1\u0121\11\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0122\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0123\5\121\1\u0124\1\u0125\3\121"+
+    "\1\112\2\0\23\121\1\u0126\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u0127\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0128"+
+    "\16\121\1\112\10\0\6\121\1\0\5\121\1\u0129\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u012a"+
+    "\7\121\1\u012b\1\112\2\0\1\u012c\25\121\1\u012d\13\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u012e\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u012f\2\121"+
+    "\1\u0130\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0131\11\121\1\u0132\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0133\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0134\7\121"+
+    "\1\112\2\0\23\121\1\u0135\2\121\1\u0136\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0137\1\u0138\2\121\1\u0139"+
+    "\1\112\2\0\23\121\1\u013a\16\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u013b\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u013c\1\121\1\u013d\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u013e"+
+    "\6\121\1\112\2\0\23\121\1\u013f\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0126\4\121\1\112\2\0\23\121"+
+    "\1\u0140\16\121\2\157\1\0\25\157\1\0\40\157\1\0"+
+    "\42\157\2\u0141\1\0\22\u0141\1\u0142\74\u0141\1\u0143\11\u0141"+
+    "\2\163\1\0\4\163\1\0\20\163\1\0\103\163\2\167"+
+    "\2\0\27\167\1\0\25\167\1\0\4\167\1\0\3\167"+
+    "\1\0\41\167\10\0\1\u0144\133\0\1\u0145\123\0\2\173"+
+    "\2\0\55\173\1\0\4\173\1\0\3\173\1\0\41\173"+
+    "\10\0\1\u0146\177\0\1\u0147\1\0\1\u0148\133\0\1\u0149"+
+    "\147\0\1\u014a\44\0\1\u0101\41\0\1\51\76\0\1\206"+
+    "\22\0\1\u014b\11\0\1\51\66\0\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u014c\1\u014d\2\121\1\u014e\1\121\1\u014f"+
+    "\2\121\1\112\2\0\6\121\1\u0150\12\121\1\u014e\1\u0151"+
+    "\1\121\1\u0152\15\121\2\206\1\0\131\206\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0153\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\u0154\1\0\1\u0154\2\121\1\u0154\1\121\1\u0154"+
+    "\1\0\1\112\1\u0108\1\u0154\1\121\1\0\4\u0154\14\0"+
+    "\13\u0154\1\112\2\0\16\u0154\1\121\14\u0154\3\121\1\u0154"+
+    "\3\121\17\0\1\u0155\114\0\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0156\1\u0157\2\121\1\u0114\2\121\1\u0158\1\u0159"+
+    "\1\121\1\112\2\0\6\121\1\u015a\11\121\1\u015b\1\121"+
+    "\1\u015c\1\121\1\u015d\1\u015e\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u015f\1\u0160\2\121\1\u0161\3\121\1\112"+
+    "\2\0\6\121\1\u0162\14\121\1\u0118\1\121\1\u0163\3\121"+
+    "\1\u0164\10\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0165\2\121"+
+    "\1\u0166\1\u0167\1\121\1\u0168\3\121\1\u0169\1\112\2\0"+
+    "\6\121\1\u016a\13\121\1\u016b\1\u016c\2\121\1\u016d\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u016e\1\121\1\u016f"+
+    "\1\121\1\u0170\1\121\1\u0171\1\u0172\1\121\1\112\2\0"+
+    "\6\121\1\u0173\14\121\1\u0174\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0175\2\121\1\u0176\1\u0177\1\u0178\2\121"+
+    "\1\112\2\0\6\121\1\u0179\11\121\1\u017a\1\121\1\u017b"+
+    "\1\u017c\1\u017d\2\121\1\u017e\1\u017f\1\u0180\10\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0181\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0182\1\u0183\1\u0184\1\u0185"+
+    "\1\u0186\1\u0187\1\u0124\1\u0188\1\u0189\1\u018a\1\121\1\112"+
+    "\2\0\1\u018b\5\121\1\u018c\11\121\1\u018d\1\121\1\u018e"+
+    "\1\u018f\1\u0190\15\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0191\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0192\1\u0193\1\u0194\3\121\1\u0195\1\u0196\1\u0197"+
+    "\1\121\1\112\2\0\20\121\1\u0198\1\121\1\u0199\1\121"+
+    "\1\u019a\1\u019b\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u019c"+
+    "\1\121\1\u016e\1\121\1\u019d\1\121\1\u019e\1\121\1\u019f"+
+    "\2\121\1\112\2\0\22\121\1\u01a0\1\u01a1\1\121\1\u01a2"+
+    "\3\121\1\u01a3\10\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u01a4\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u01a5\1\121\1\u01a6\1\u01a7\1\u01a8\1\121\1\u01a9\1\u01aa"+
+    "\1\u01ab\1\u01ac\1\u01ad\1\112\2\0\1\u01ae\20\121\1\u01af"+
+    "\1\u01b0\1\u01b1\1\u01b2\1\121\1\u01b3\3\121\1\u01b4\7\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u01b5\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u01b6\1\u01b7\1\121"+
+    "\1\u01b8\1\121\1\u01b9\1\u01ba\3\121\1\u01bb\1\112\2\0"+
+    "\22\121\1\u01bc\1\u01bd\1\u01be\1\u01bf\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u01c0\1\121\1\u01c1\1\121\1\u01c2\1\121"+
+    "\1\u01c3\4\121\1\112\2\0\1\u01c4\25\121\1\u01c5\13\121"+
+    "\1\112\10\0\6\u01c6\1\0\1\u01c6\2\112\1\u01c6\1\112"+
+    "\1\u01c6\1\0\2\112\2\u01c6\1\0\4\u01c6\14\0\13\u01c6"+
+    "\1\112\2\0\16\u01c6\1\112\14\u01c6\3\112\1\u01c6\4\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u01c7\6\121\1\u0132\1\112"+
+    "\2\0\23\121\1\u01c8\1\121\1\u01c9\11\121\1\u01ca\2\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u01cb\1\121\1\u01cc\1\121"+
+    "\1\u01cd\1\121\1\u01ce\1\121\1\u01cf\1\121\1\u01d0\1\112"+
+    "\2\0\20\121\1\u01d1\1\u01d2\1\u01d3\1\u01d4\1\121\1\u01d5"+
+    "\1\u01d6\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u01d7\2\121"+
+    "\1\u0134\1\u01d8\1\121\1\u01d9\4\121\1\112\2\0\22\121"+
+    "\1\u01da\6\121\1\u01db\10\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u01dc\2\121\1\u014e\1\u01dd\3\121\1\u0171\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u01de"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u01df\1\u01e0\1\u01e1\1\u01e2\1\u01e3\2\121\1\u01e4\1\112"+
+    "\2\0\22\121\1\u01e5\1\u01e6\2\121\1\u01e7\13\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u01e8\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u01e9\1\121\1\u01ea"+
+    "\1\121\1\u01eb\1\121\1\u01ec\1\121\1\112\2\0\1\u01ed"+
+    "\17\121\1\u01ee\1\121\1\u01ef\2\121\1\u01f0\1\121\1\u01f1"+
+    "\12\121\1\112\10\0\6\121\1\0\5\121\1\u01f2\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u01f3"+
+    "\2\121\1\u01f4\1\121\1\u01f5\1\u01f6\1\u01f7\2\121\1\112"+
+    "\2\0\23\121\1\u01f8\16\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u01f9\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u01fa\1\u01f3\1\121\1\u01fb\1\u01fc\1\121\1\u01fd"+
+    "\1\u01fe\1\u01ff\2\121\1\112\2\0\20\121\1\u0200\1\121"+
+    "\1\u0201\1\u0202\1\u0203\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0204\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0205\3\121\1\u0206\1\u0207\1\u0208\1\121"+
+    "\1\u0207\1\u0209\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u020a\5\121\1\u020b\1\121\1\u020c\1\u020d"+
+    "\1\121\1\112\2\0\6\121\1\u020e\14\121\1\u0126\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u020f\3\121\1\u0210\2\121"+
+    "\1\u0211\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0212\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0213\14\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0214\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0215\1\121"+
+    "\1\u0216\2\121\1\u0217\1\121\1\112\2\0\23\121\1\u0218"+
+    "\1\121\1\u0219\14\121\2\245\1\0\30\245\1\0\25\245"+
+    "\1\0\4\245\1\0\3\245\1\0\41\245\10\0\1\u021a"+
+    "\123\0\2\250\1\0\4\250\1\0\20\250\1\0\1\250"+
+    "\1\0\101\250\2\u021b\1\0\131\u021b\11\0\6\u021c\1\0"+
+    "\1\u021c\2\0\1\u021c\1\0\1\u021c\3\0\1\u021c\2\0"+
+    "\4\u021c\14\0\13\u021c\3\0\16\u021c\1\0\14\u021c\3\0"+
+    "\1\u021c\3\0\2\u021d\1\0\131\u021d\11\0\6\u021e\1\0"+
+    "\6\u021e\6\0\4\u021e\14\0\13\u021e\3\0\42\u021e\11\0"+
+    "\1\262\1\u021f\4\262\1\0\6\262\6\0\4\262\14\0"+
+    "\13\262\3\0\22\262\1\u021f\17\262\11\0\6\262\1\0"+
+    "\6\262\6\0\4\262\14\0\13\262\3\0\42\262\40\0"+
+    "\1\u0220\160\0\1\u0221\65\0\1\u0222\177\0\1\u0223\135\0"+
+    "\1\u0224\124\0\1\u0225\147\0\1\u0226\41\0\2\43\1\0"+
+    "\1\43\1\0\2\43\2\0\6\43\1\0\25\43\1\0"+
+    "\17\43\1\u0227\3\43\1\0\42\43\2\53\1\0\1\53"+
+    "\1\0\2\53\2\0\2\53\1\u0228\3\53\1\0\25\53"+
+    "\1\0\11\53\1\u0228\11\53\1\0\44\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\25\53\1\0\14\53"+
+    "\1\u0229\6\53\1\0\1\53\1\u0229\42\53\1\0\1\53"+
+    "\1\0\2\53\2\0\2\53\1\u022a\3\53\1\0\25\53"+
+    "\1\0\11\53\1\u022a\11\53\1\0\4\53\1\310\21\53"+
+    "\1\310\15\53\1\0\1\53\1\0\2\53\2\0\4\53"+
+    "\1\77\1\53\1\0\3\53\1\77\21\53\1\0\17\53"+
+    "\1\77\3\53\1\0\20\53\1\77\23\53\1\0\1\53"+
+    "\1\0\2\53\2\0\1\53\1\u022b\1\u022c\3\53\1\0"+
+    "\15\53\1\u022d\7\53\1\0\11\53\1\u022c\3\53\1\u022d"+
+    "\5\53\1\0\22\53\1\u022b\21\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\23\53\1\0"+
+    "\5\53\2\u022e\35\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\5\53\1\u022f\17\53\1\0\23\53\1\0"+
+    "\10\53\1\u022f\33\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\14\53\1\u0230\6\53\1\0"+
+    "\1\53\1\u0230\42\53\1\0\1\53\1\0\2\53\2\0"+
+    "\5\53\1\u0231\1\0\25\53\1\0\10\53\1\u0231\12\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\3\53\1\u0232\20\53"+
+    "\1\u0232\17\53\1\0\1\53\1\0\2\53\2\0\4\53"+
+    "\1\u022b\1\53\1\0\25\53\1\0\17\53\1\u022b\3\53"+
+    "\1\0\3\53\1\u0233\20\53\1\u0233\17\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\15\53\1\u0234\7\53"+
+    "\1\0\15\53\1\u0234\5\53\1\0\5\53\2\u0235\1\u0231"+
+    "\15\53\1\u0231\16\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\15\53\1\u0231\7\53\1\0\15\53\1\u0231"+
+    "\5\53\1\0\44\53\1\0\1\53\1\0\2\53\2\0"+
+    "\3\53\1\u0236\2\53\1\0\25\53\1\0\6\53\1\u0236"+
+    "\14\53\1\0\44\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\14\53\1\u0237\6\53\1\0"+
+    "\1\53\1\u0237\42\53\1\0\1\53\1\0\2\53\2\0"+
+    "\2\53\1\u0238\3\53\1\0\25\53\1\0\11\53\1\u0238"+
+    "\11\53\1\0\44\53\1\0\1\53\1\0\2\53\2\0"+
+    "\1\77\3\53\1\u0239\1\53\1\0\25\53\1\0\16\53"+
+    "\1\77\1\u0239\3\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\7\53\1\77"+
+    "\13\53\1\0\11\53\1\77\32\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\17\53\1\77\5\53\1\0"+
+    "\12\53\1\77\10\53\1\0\2\53\1\u023a\20\53\1\u023a"+
+    "\20\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\14\53\1\u023b\6\53\1\0\1\53\1\u023b"+
+    "\42\53\1\0\1\53\1\0\2\53\2\0\2\53\1\u023c"+
+    "\3\53\1\0\25\53\1\0\11\53\1\u023c\11\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\5\53\1\310"+
+    "\1\0\25\53\1\0\10\53\1\310\12\53\1\0\5\53"+
+    "\2\u0231\35\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\2\53\1\333\20\53"+
+    "\1\333\20\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\2\53\1\u023d\20\53"+
+    "\1\u023d\20\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\14\53\1\u023e\10\53\1\0\23\53\1\0\30\53"+
+    "\1\u023e\13\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\3\53\1\310\21\53\1\0\23\53\1\0\20\53"+
+    "\1\310\23\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\17\53\1\u023f\5\53\1\0\12\53\1\u023f\10\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\5\53"+
+    "\1\u0240\1\0\25\53\1\0\10\53\1\u0240\12\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\3\53\1\u0241"+
+    "\2\53\1\0\25\53\1\0\6\53\1\u0241\14\53\1\0"+
+    "\2\53\1\u0242\20\53\1\u0242\20\53\1\0\1\53\1\0"+
+    "\2\53\2\0\1\u0243\5\53\1\0\25\53\1\0\16\53"+
+    "\1\u0243\4\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\1\u0244\5\53\1\0\25\53\1\0\16\53\1\u0244"+
+    "\4\53\1\0\44\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\23\53\1\0\7\53\1\u0245"+
+    "\15\53\1\u0245\16\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\23\53\1\0\2\53\1\77"+
+    "\20\53\1\77\20\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\23\53\1\0\3\53\1\u0246"+
+    "\20\53\1\u0246\17\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\7\53\1\u0247\13\53\1\0"+
+    "\11\53\1\u0247\32\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\3\53\1\u0248\21\53\1\0\23\53\1\0"+
+    "\4\53\1\u0249\13\53\1\u0248\5\53\1\u0249\15\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\25\53\1\0"+
+    "\14\53\1\u024a\6\53\1\0\1\53\1\u024a\42\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\17\53\1\u024b"+
+    "\5\53\1\0\7\53\1\u024c\2\53\1\u024b\10\53\1\0"+
+    "\11\53\1\u024c\32\53\1\0\1\53\1\0\2\53\2\0"+
+    "\2\53\1\u024d\3\53\1\0\25\53\1\0\11\53\1\u024d"+
+    "\11\53\1\0\2\53\1\u0232\1\u024e\17\53\1\u0232\1\u024e"+
+    "\17\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\3\53\1\u024f\21\53\1\0\23\53\1\0\20\53\1\u024f"+
+    "\23\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\17\53\1\u0250\5\53\1\0\12\53\1\u0250\10\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\3\53\1\u0251"+
+    "\2\53\1\0\25\53\1\0\6\53\1\u0251\14\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\2\53\1\u0252"+
+    "\3\53\1\0\25\53\1\0\11\53\1\u0252\11\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\5\53\1\u0253"+
+    "\1\0\17\53\1\u0254\5\53\1\0\10\53\1\u0253\1\53"+
+    "\1\u0254\10\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\4\53\1\u0255\1\53\1\0\25\53\1\0\17\53"+
+    "\1\u0255\3\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\3\53\1\376\21\53\1\0\23\53"+
+    "\1\0\20\53\1\376\23\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\7\53"+
+    "\1\u0256\15\53\1\u0256\16\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\7\53"+
+    "\1\u0257\15\53\1\u0257\16\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\5\53"+
+    "\2\u0258\35\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\14\53\1\u0259\6\53\1\0\1\53"+
+    "\1\u0259\42\53\1\0\1\53\1\0\2\53\2\0\5\53"+
+    "\1\u025a\1\0\25\53\1\0\10\53\1\u025a\12\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\17\53\1\u022d\16\53\1\u022d"+
+    "\5\53\1\0\1\53\1\0\2\53\2\0\5\53\1\u025b"+
+    "\1\0\25\53\1\0\10\53\1\u025b\12\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\1\u024e\5\53\1\0"+
+    "\25\53\1\0\16\53\1\u024e\4\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\25\53\1\0"+
+    "\23\53\1\0\14\53\1\77\12\53\1\77\14\53\1\0"+
+    "\1\53\1\0\2\53\2\0\1\u025c\5\53\1\0\3\53"+
+    "\1\376\11\53\1\312\1\u025d\1\u025e\5\53\1\0\12\53"+
+    "\1\u025e\1\u025d\1\53\1\312\1\u025c\4\53\1\0\20\53"+
+    "\1\376\23\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\15\53\1\u025f\7\53\1\0\15\53\1\u025f\5\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\5\53"+
+    "\1\u0260\1\0\25\53\1\0\10\53\1\u0260\12\53\1\0"+
+    "\3\53\1\u0261\20\53\1\u0261\17\53\1\0\1\53\1\0"+
+    "\2\53\2\0\2\53\1\u0262\1\53\1\77\1\53\1\0"+
+    "\25\53\1\0\11\53\1\u0262\5\53\1\77\3\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\2\53\1\77"+
+    "\3\53\1\0\25\53\1\0\11\53\1\77\2\53\1\u0263"+
+    "\6\53\1\0\1\53\1\u0263\12\53\1\77\12\53\1\77"+
+    "\14\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\3\53\1\77\20\53\1\77"+
+    "\17\53\1\0\1\53\1\0\2\53\2\0\5\53\1\u0264"+
+    "\1\0\15\53\1\77\7\53\1\0\10\53\1\u0264\4\53"+
+    "\1\77\5\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\5\53\1\u0265\1\0\25\53\1\0\10\53\1\u0265"+
+    "\12\53\1\0\44\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\23\53\1\0\7\53\1\77"+
+    "\15\53\1\77\16\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\23\53\1\0\4\53\1\u0266"+
+    "\21\53\1\u0266\15\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\23\53\1\0\7\53\1\u0267"+
+    "\15\53\1\u0267\16\53\1\0\1\53\1\0\2\53\2\0"+
+    "\2\53\1\77\3\53\1\0\25\53\1\0\11\53\1\77"+
+    "\11\53\1\0\42\53\65\0\1\u0268\57\0\1\u0269\52\0"+
+    "\1\u0269\47\0\10\u0103\1\u026a\17\u0103\1\u0105\105\u0103\1\0"+
+    "\131\u0103\33\0\1\u026b\100\0\1\112\10\0\6\112\1\0"+
+    "\5\112\1\u026c\1\0\4\112\1\0\4\112\14\0\14\112"+
+    "\2\0\43\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u026d\5\121"+
+    "\1\112\2\0\42\121\17\0\1\130\25\0\1\51\66\0"+
+    "\1\u010b\10\0\6\u010b\1\0\6\u010b\1\0\4\u010b\1\0"+
+    "\4\u010b\14\0\14\u010b\2\0\43\u010b\10\0\6\u010b\1\0"+
+    "\1\u010b\2\u026e\1\u010b\1\u026e\1\u010b\1\0\4\u010b\1\0"+
+    "\4\u010b\1\u026f\3\0\1\u026f\7\0\14\u010b\2\0\16\u010b"+
+    "\1\u026e\14\u010b\3\u026e\1\u010b\3\u026e\1\u010b\10\0\6\u010b"+
+    "\1\0\1\u010b\2\u010f\1\u010b\1\u010f\1\u010b\1\0\4\u010b"+
+    "\1\0\2\u010b\1\u010d\1\u010e\14\0\4\u010b\1\u010e\1\u010d"+
+    "\6\u010b\2\0\7\u010b\1\u010d\6\u010b\1\u010f\6\u010b\1\u010d"+
+    "\5\u010b\3\u010f\1\u010b\3\u010f\1\u010b\10\0\6\u010b\1\0"+
+    "\1\u010b\2\u0110\1\u010b\1\u0110\1\u010b\1\0\4\u010b\1\0"+
+    "\2\u010b\1\u010d\1\u010e\1\0\1\u010f\12\0\4\u010b\1\u010e"+
+    "\1\u010d\6\u010b\2\0\7\u010b\1\u010d\6\u010b\1\u0110\6\u010b"+
+    "\1\u010d\5\u010b\3\u0110\1\u010b\3\u0110\1\u010b\10\0\6\u010b"+
+    "\1\0\1\u010b\1\u0110\1\u0111\1\u010b\1\u0111\1\u010b\1\0"+
+    "\4\u010b\1\0\1\u010b\1\u0270\1\u010d\1\u010e\1\0\1\u010f"+
+    "\12\0\4\u010b\1\u010e\1\u010d\1\u010b\1\u0270\4\u010b\2\0"+
+    "\7\u010b\1\u010d\6\u010b\1\u0111\6\u010b\1\u010d\5\u010b\3\u0111"+
+    "\1\u010b\2\u0111\1\u0110\1\u010b\10\0\1\u010b\1\u0271\4\u010b"+
+    "\1\0\1\u010b\4\u0271\1\u010b\1\0\4\u010b\1\0\2\u010b"+
+    "\2\u0271\14\0\4\u010b\3\u0271\5\u010b\2\0\1\u010b\1\u0271"+
+    "\5\u010b\1\u0271\6\u010b\1\u0271\1\u010b\1\u0271\1\u010b\1\u0271"+
+    "\2\u010b\1\u0271\5\u010b\3\u0271\1\u010b\3\u0271\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0272\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\2\121\1\u0273\1\121\14\0\13\121\1\112"+
+    "\2\0\3\121\1\u0274\36\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0275\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0276\5\121\1\u0277\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0278"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0279\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u027a\4\121\1\112\2\0\26\121\1\u0114"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u027b\2\121\1\u027c"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u027d\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u027e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u027f\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0280\17\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0281\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0282\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0283\6\121\1\u0284\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0285\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0286\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0287\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0288\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0114\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0289\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u028a"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u028b\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u028c\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u028d\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u028e\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u028f\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u0290\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0291\12\121\1\112\2\0\23\121\1\u0292\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0293\7\121\1\112\2\0"+
+    "\22\121\1\u0294\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0295\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0296\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\3\121\1\u0114\36\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0297\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0298\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0299\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u029a\5\121\1\u027f\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u029b"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u029c\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u029d\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u029e\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\u0114\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u029f\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u02a0\1\121\1\u02a1\3\121\1\112\2\0"+
+    "\20\121\1\u02a2\21\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u02a3\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u019a\6\121\1\u02a4\3\121\1\112\2\0\42\121\12\0"+
+    "\1\u02a5\6\0\4\u02a5\11\0\2\u02a5\20\0\3\u02a5\10\0"+
+    "\1\u02a5\5\0\1\u02a5\6\0\1\u02a5\1\0\1\u02a5\1\0"+
+    "\1\u02a5\2\0\1\u02a5\5\0\3\u02a5\1\0\3\u02a5\12\0"+
+    "\1\u02a6\6\0\4\u02a6\11\0\2\u02a6\20\0\3\u02a6\10\0"+
+    "\1\u02a6\5\0\1\u02a6\6\0\1\u02a6\1\0\1\u02a6\1\0"+
+    "\1\u02a6\2\0\1\u02a6\5\0\3\u02a6\1\0\3\u02a6\11\0"+
+    "\1\u02a7\52\0\1\u02a7\60\0\1\u02a8\52\0\1\u02a8\132\0"+
+    "\1\u02a9\135\0\1\u02aa\124\0\1\u02ab\147\0\1\u02ac\41\0"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u02ad\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u02ae"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0171\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u02af\2\121\1\u02b0\3\121\1\112"+
+    "\2\0\23\121\1\u02b1\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u02b2\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u02b3\5\121\1\112\2\0\1\u02b4"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u02b5\2\121\1\u02b6"+
+    "\3\121\1\u02b7\1\u02b8\1\u02b9\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\1\121\1\u02ba\4\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\2\121\1\u02bb\1\121\14\0"+
+    "\1\121\1\u02bc\1\u02bd\10\121\1\112\2\0\3\121\1\u02be"+
+    "\1\121\1\u02bf\1\121\1\u02c0\12\121\1\u02c1\17\121\1\112"+
+    "\10\0\6\u0154\1\0\6\u0154\1\0\1\112\1\u0108\1\u0154"+
+    "\1\121\1\0\4\u0154\14\0\13\u0154\1\112\2\0\42\u0154"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u02c2\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u02c3"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u02c4\1\121\1\0\4\121"+
+    "\14\0\1\u02c5\1\121\1\u02c6\1\u02c7\1\u02c8\1\u02c9\1\u02ca"+
+    "\1\u02cb\1\u02cc\1\u02cd\1\u02ce\1\112\2\0\1\u02cf\21\121"+
+    "\1\u02d0\2\121\1\u02d1\2\121\1\u02d2\5\121\1\u02d3\3\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u02d4\10\121\1\112"+
+    "\2\0\33\121\1\u02d5\6\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u02d6\2\121\1\u02d7\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u02d8\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u02d9\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u02da\1\121\1\0\4\121"+
+    "\14\0\1\u02db\1\121\1\u02dc\1\121\1\u02dd\1\u02de\2\121"+
+    "\1\u02df\2\121\1\112\2\0\22\121\1\u02e0\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u02e1\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u02e2\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u02e3\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u02e4\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u02e5\1\u02e6\1\121\1\112"+
+    "\2\0\6\121\1\u02e7\16\121\1\u02e8\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u02e9\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u02ea\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u02eb\1\u02ec\1\u02ed\1\u02ee"+
+    "\1\u02ef\1\u02c9\2\121\1\u02f0\1\u02f1\1\121\1\112\2\0"+
+    "\1\u018b\21\121\1\u02f2\1\u02f3\1\121\1\u02f4\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u02f5\10\121\1\112\2\0"+
+    "\6\121\1\u02f6\16\121\1\u02f7\14\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u02f8\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u02f9\12\121\1\112\2\0\26\121\1\u0114"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0282\3\121"+
+    "\1\112\2\0\6\121\1\u02fa\21\121\1\u02fb\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u02fc\1\121\1\u02fd\7\121"+
+    "\1\112\2\0\24\121\1\u02fe\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u02ff\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0300\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0301\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0302\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u0303\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0304\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0305\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0306"+
+    "\1\u027e\3\121\1\u0307\1\u0308\1\u0309\1\u030a\1\121\1\112"+
+    "\2\0\1\u030b\5\121\1\u030c\13\121\1\u030d\1\121\1\u030e"+
+    "\5\121\1\u030f\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0310\7\121\1\112\2\0\1\u0311\23\121\1\u0312\1\u0313"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u02b1\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0314\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u0315\14\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0316\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0317\4\121\1\u0318"+
+    "\3\121\1\112\2\0\1\u0319\41\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u031a\1\u031b\1\121\1\u031c\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u031d"+
+    "\2\121\1\112\2\0\22\121\1\u031e\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u031f\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0320\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0321"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0322\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0278\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u01fe\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0323\3\121"+
+    "\1\u0324\4\121\1\112\2\0\25\121\1\u0325\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u029e\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0326\1\121\1\u0327"+
+    "\1\121\1\u0328\4\121\1\u0329\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u032a\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u032b\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u032c\1\u032d\2\121\1\u032e\3\121\1\112\2\0"+
+    "\24\121\1\u032f\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0330\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0331\1\u01dc\3\121\1\u019f\1\u0332\1\121"+
+    "\1\112\2\0\23\121\1\u0333\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0334\3\121\1\u0335\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0336\10\121\1\112"+
+    "\2\0\23\121\1\u017c\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0337\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0338\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0339"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u033a\1\121"+
+    "\1\u033b\6\121\1\112\2\0\22\121\1\u033c\1\u033d\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u033e\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u033f\2\121"+
+    "\1\u0340\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0341\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u02c5"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0342\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0343\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0344\5\121\1\u0345\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0346\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0347\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0348\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0349\3\121\1\u034a\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u034b\4\121\1\u0171\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u034c\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u034d\7\121\1\u034e\2\121"+
+    "\1\112\2\0\22\121\1\u034f\1\u02b1\4\121\1\u0350\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0351\2\121\1\u0352"+
+    "\1\121\1\112\2\0\25\121\1\u0353\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0354\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0355\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0114\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0356\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0357\2\121\1\112\2\0\24\121"+
+    "\1\u0358\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u0359\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u035a\2\121\1\112\2\0\24\121\1\u035b\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u033a\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u035c"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u035d\4\121\1\u035e\4\121\1\112\2\0\22\121"+
+    "\1\u035f\1\u0360\1\u0361\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0362\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u0363\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u0364\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0365\15\121\1\u02fe\4\121\1\u0366\10\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0367\2\121\1\u0368"+
+    "\4\121\1\112\2\0\6\121\1\u0369\14\121\1\u036a\1\121"+
+    "\1\u036b\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0316"+
+    "\4\121\1\112\2\0\22\121\1\u036c\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u036d\1\u036e\1\u0333\2\121\1\u036f"+
+    "\1\u0370\2\121\1\112\2\0\6\121\1\u0371\15\121\1\u0372"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u0373\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0374\1\121\1\u0375\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0376\3\121\1\112\2\0"+
+    "\22\121\1\u033c\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u033f\1\u0377\2\121\1\u0378\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0379\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u037a\1\121"+
+    "\1\u037b\4\121\1\112\2\0\6\121\1\u037c\14\121\1\u037d"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u028e\4\121\1\u037e"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u037f\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0380\3\121\1\u0381\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u0382\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0383"+
+    "\7\121\1\112\2\0\22\121\1\u0384\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0385\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0386\2\121\1\112"+
+    "\2\0\6\121\1\u0387\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0383\3\121\1\u0388\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0389\10\121\1\112"+
+    "\2\0\20\121\1\u038a\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u038b\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u038c\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u038d\3\121\1\u038e\6\121\1\112"+
+    "\2\0\23\121\1\u038f\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0390\1\u0391\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0392\1\u0393\4\121\1\u0394"+
+    "\2\121\1\112\2\0\22\121\1\u0333\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0395\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0343\3\121\1\112"+
+    "\2\0\23\121\1\u0396\1\u0397\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0398\1\u0345\1\121\1\112\2\0\1\u01fe"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0399\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u039a\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u039b\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u039c\10\121\1\112\2\0"+
+    "\6\121\1\u039d\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u039e\4\121\1\112\2\0\20\121\1\u039f\7\121\1\u03a0"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u03a1\2\121"+
+    "\1\112\2\0\24\121\1\u03a2\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u03a3\1\121\1\0"+
+    "\4\121\14\0\6\121\1\u03a4\1\121\1\u019f\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u03a5"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\u01c6\1\0"+
+    "\6\u01c6\1\0\1\112\1\u03a6\2\u01c6\1\0\4\u01c6\14\0"+
+    "\13\u01c6\1\112\2\0\42\u01c6\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u03a7\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u03a8\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u03a9"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\33\121\1\u03aa\6\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u03ab\13\121\1\u03ac\1\121\1\u03ad"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u03ae\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u03af"+
+    "\10\121\1\112\2\0\6\121\1\u03b0\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u03b1\1\u03b2\6\121\1\u03b3\2\121\1\112"+
+    "\2\0\30\121\1\u01fe\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u03b4\2\121\1\u03b5\6\121\1\112\2\0\32\121"+
+    "\1\u0282\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u03b6"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u03b7\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u03b8\10\121\1\112\2\0\25\121\1\u0315"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u03b9\2\121"+
+    "\1\u03ba\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u03bb\7\121\1\112\2\0\24\121\1\u03bc"+
+    "\2\121\1\u03bd\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u03be\6\121\1\112\2\0\16\121\1\u03bf\23\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u03c0\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u03c1\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u03c2\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u03c3\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u03c4\1\121\1\u03c5\1\u03c6"+
+    "\1\121\1\112\2\0\6\121\1\u03c7\13\121\1\u03c8\2\121"+
+    "\1\u03c9\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u03ca"+
+    "\1\u03cb\1\u0187\5\121\1\112\2\0\1\u018b\21\121\1\u02f2"+
+    "\1\u02f3\1\121\1\u03cc\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0282\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u03cd\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u03ce\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u03cf"+
+    "\1\121\1\u03d0\4\121\1\112\2\0\22\121\1\u03d1\3\121"+
+    "\1\u03d2\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0282\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0122\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u029a\4\121\1\u03d3\1\u027f\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u03d4\3\121\1\u03d5"+
+    "\1\121\1\u03d6\4\121\1\112\2\0\23\121\1\u03d7\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u03d8\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u03d9\1\u03da\1\121"+
+    "\1\u03db\1\u03dc\1\121\1\u03dd\4\121\1\112\2\0\6\121"+
+    "\1\u018c\14\121\1\u03de\1\121\1\u0315\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u03df\12\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u03e0\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u02fe\1\u03e1"+
+    "\1\121\1\112\2\0\6\121\1\u03e2\15\121\1\u03e3\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u03e4\7\121\1\112"+
+    "\2\0\20\121\1\u03e5\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u03e6\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u03e7\4\121\1\112\2\0\25\121"+
+    "\1\u01fe\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u03e8"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u03e9\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u03ea\1\121\1\u03eb\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u03ec\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u03ed\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\36\121\1\u03ee\3\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u03ef\1\121\1\u03a0\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u03f0\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u03f1\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u03f2\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u03f3\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\u0114\27\121\1\u03f4\11\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u03f5\10\121\1\112\2\0\6\121\1\u03f6"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u03f7\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\33\121\1\u03f8\6\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u03f9\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u03fa\1\u03fb\7\121\1\112\2\0"+
+    "\25\121\1\u03fc\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u03fd\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u03fe\1\u0114\3\121\1\u03ff\2\121\1\112"+
+    "\2\0\23\121\1\u0400\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0401\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0402\3\121\1\u0403\1\u0404\1\u0405"+
+    "\1\u0406\2\121\1\112\2\0\20\121\1\u0407\1\121\1\u0408"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0409\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u040a\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u040b\1\u019f\2\121\1\112\2\0\6\121"+
+    "\1\u040c\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u01f3"+
+    "\6\121\1\u019f\2\121\1\112\2\0\24\121\1\u040d\15\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u040e\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u040f\10\121"+
+    "\1\112\2\0\6\121\1\u0410\13\121\1\u0411\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u01f3\6\121\1\u0412\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0413\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0414\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0415\3\121\1\u0416\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0417"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0418\3\121\1\u0419\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u033f\7\121\1\112"+
+    "\2\0\23\121\1\u041a\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u041b\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u041c\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u041d\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u041e"+
+    "\3\121\1\u041f\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0420\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0421\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0422\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0423\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0424\6\121\1\112\2\0\23\121\1\u0425"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0426\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0427\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\1\u0428\41\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u0429\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u01be\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u042a\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u042b\10\121\1\112\2\0\6\121\1\u042c\16\121\1\u042d"+
+    "\14\121\11\0\6\u021c\1\0\6\u021c\3\0\1\u021c\2\0"+
+    "\4\u021c\14\0\13\u021c\3\0\42\u021c\11\0\2\262\1\u042e"+
+    "\3\262\1\0\6\262\6\0\4\262\14\0\3\262\1\u042e"+
+    "\7\262\3\0\42\262\40\0\1\u042f\161\0\1\u0430\125\0"+
+    "\1\u0224\125\0\1\u0431\146\0\1\u0432\107\0\1\u0433\72\0"+
+    "\2\43\1\0\1\43\1\0\2\43\2\0\6\43\1\0"+
+    "\25\43\1\0\20\43\1\u0434\2\43\1\0\42\43\2\53"+
+    "\1\0\1\53\1\0\2\53\2\0\3\53\1\u0435\2\53"+
+    "\1\0\25\53\1\0\6\53\1\u0435\14\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\1\53\1\u0249\4\53"+
+    "\1\0\25\53\1\0\23\53\1\0\3\53\1\77\16\53"+
+    "\1\u0249\1\53\1\77\17\53\1\0\1\53\1\0\2\53"+
+    "\2\0\3\53\1\u0436\2\53\1\0\25\53\1\0\6\53"+
+    "\1\u0436\14\53\1\0\2\53\1\u0437\20\53\1\u0437\20\53"+
+    "\1\0\1\53\1\0\2\53\2\0\5\53\1\u0438\1\0"+
+    "\25\53\1\0\10\53\1\u0438\12\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\25\53\1\0"+
+    "\23\53\1\0\14\53\1\u0249\12\53\1\u0249\14\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\17\53\1\u0439"+
+    "\5\53\1\0\12\53\1\u0439\10\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\4\53\1\77\1\53\1\0"+
+    "\25\53\1\0\17\53\1\77\3\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\2\53\1\u043a\3\53\1\0"+
+    "\25\53\1\0\11\53\1\u043a\11\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\15\53\1\u0258"+
+    "\7\53\1\0\15\53\1\u0258\5\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\17\53\1\77"+
+    "\5\53\1\0\12\53\1\77\10\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\5\53\1\u0249\1\0\25\53"+
+    "\1\0\10\53\1\u0249\12\53\1\0\44\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\25\53\1\0\23\53"+
+    "\1\0\14\53\1\u043b\12\53\1\u043b\14\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\25\53\1\0\7\53"+
+    "\1\u043c\13\53\1\0\11\53\1\u043c\32\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\25\53\1\0\23\53"+
+    "\1\0\5\53\2\u043d\35\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\3\53"+
+    "\1\u043e\20\53\1\u043e\17\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\4\53"+
+    "\1\u0249\21\53\1\u0249\15\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\14\53\1\u043f\6\53"+
+    "\1\0\1\53\1\u043f\42\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\5\53\1\u024e\17\53\1\0\23\53"+
+    "\1\0\10\53\1\u024e\33\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\7\53\1\u0257\13\53"+
+    "\1\0\11\53\1\u0257\32\53\1\0\1\53\1\0\2\53"+
+    "\2\0\3\53\1\u0440\2\53\1\0\25\53\1\0\6\53"+
+    "\1\u0440\14\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\14\53\1\u024d\6\53"+
+    "\1\0\1\53\1\u024d\42\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\2\53"+
+    "\1\u024e\20\53\1\u024e\20\53\1\0\1\53\1\0\2\53"+
+    "\2\0\5\53\1\u0441\1\0\25\53\1\0\10\53\1\u0441"+
+    "\12\53\1\0\44\53\1\0\1\53\1\0\2\53\2\0"+
+    "\6\53\1\0\25\53\1\0\14\53\1\373\6\53\1\0"+
+    "\1\53\1\373\42\53\1\0\1\53\1\0\2\53\2\0"+
+    "\5\53\1\u0442\1\0\25\53\1\0\10\53\1\u0442\12\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\1\53"+
+    "\1\u0443\4\53\1\0\25\53\1\0\23\53\1\0\22\53"+
+    "\1\u0443\21\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\2\53\1\u0444\20\53"+
+    "\1\u0444\20\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\17\53\1\u0445\5\53\1\0\12\53\1\u0445\10\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\4\53\1\77\21\53"+
+    "\1\77\15\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\12\53\1\77\6\53"+
+    "\1\77\22\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\17\53\1\u0446\5\53\1\0\12\53\1\u0446\10\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\17\53\1\u0258\5\53\1\0\12\53\1\u0258\10\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\17\53\1\376\5\53\1\0\12\53\1\376\10\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\5\53\2\u0447\35\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\15\53"+
+    "\1\u0448\7\53\1\0\15\53\1\u0448\5\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\5\53"+
+    "\1\u0449\17\53\1\0\23\53\1\0\10\53\1\u0449\33\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\23\53\1\0\5\53\2\77\35\53\1\0\1\53"+
+    "\1\0\2\53\2\0\5\53\1\77\1\0\25\53\1\0"+
+    "\10\53\1\77\12\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\17\53\1\373\5\53\1\0"+
+    "\12\53\1\373\10\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\23\53\1\0"+
+    "\3\53\1\u044a\20\53\1\u044a\17\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\23\53\1\0"+
+    "\7\53\1\u0231\15\53\1\u0231\16\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\23\53\1\0"+
+    "\2\53\1\u044b\20\53\1\u044b\20\53\1\0\1\53\1\0"+
+    "\2\53\2\0\3\53\1\u044c\2\53\1\0\25\53\1\0"+
+    "\6\53\1\u044c\14\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\14\53\1\77"+
+    "\6\53\1\0\1\53\1\77\42\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\15\53\1\u044d\7\53\1\0"+
+    "\15\53\1\u044d\5\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\3\53\1\334\2\53\1\0\25\53\1\0"+
+    "\6\53\1\334\14\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\2\53\1\u044e\3\53\1\0\25\53\1\0"+
+    "\11\53\1\u044e\11\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\25\53\1\0\23\53\1\0"+
+    "\7\53\1\u044f\15\53\1\u044f\16\53\1\0\1\53\1\0"+
+    "\2\53\2\0\3\53\1\u0442\2\53\1\0\25\53\1\0"+
+    "\6\53\1\u0442\1\u043c\13\53\1\0\11\53\1\u043c\32\53"+
+    "\1\0\1\53\1\0\2\53\2\0\4\53\1\u0239\1\53"+
+    "\1\0\25\53\1\0\17\53\1\u0239\3\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\1\53\1\274\4\53"+
+    "\1\0\25\53\1\0\23\53\1\0\22\53\1\274\21\53"+
+    "\1\0\1\53\1\0\2\53\2\0\2\53\1\u0450\3\53"+
+    "\1\0\25\53\1\0\11\53\1\u0450\11\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\23\53\1\0\5\53\2\u0451\35\53\1\0\1\53"+
+    "\1\0\2\53\2\0\5\53\1\u0452\1\0\25\53\1\0"+
+    "\10\53\1\u0452\12\53\1\0\44\53\1\0\1\53\1\0"+
+    "\2\53\2\0\6\53\1\0\17\53\1\376\5\53\1\0"+
+    "\12\53\1\376\1\53\1\77\6\53\1\0\1\53\1\77"+
+    "\42\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\5\53\1\77\17\53\1\0\23\53\1\0\10\53\1\77"+
+    "\33\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\12\53\1\77\1\u0453\5\53"+
+    "\1\77\10\53\1\u0453\11\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\15\53\1\u0454\7\53\1\0\15\53"+
+    "\1\u0454\5\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\14\53\1\u0455\6\53"+
+    "\1\0\1\53\1\u0455\42\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\14\53\1\u0456\6\53"+
+    "\1\0\1\53\1\u0456\42\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\7\53\1\u0457\13\53"+
+    "\1\0\11\53\1\u0457\32\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\17\53\1\334\5\53\1\0\12\53"+
+    "\1\334\10\53\1\0\42\53\66\0\1\u0458\57\0\1\u0459"+
+    "\101\0\1\u0459\73\0\2\u026a\22\0\1\u026a\43\0\1\u045a"+
+    "\123\0\1\112\10\0\1\112\1\u045b\4\112\1\0\1\112"+
+    "\4\u045b\1\112\1\0\4\112\1\0\2\112\2\u045b\14\0"+
+    "\4\112\3\u045b\5\112\2\0\1\112\1\u045b\5\112\1\u045b"+
+    "\6\112\1\u045b\1\112\1\u045b\1\112\1\u045b\2\112\1\u045b"+
+    "\5\112\3\u045b\1\112\3\u045b\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u045c\12\121\1\112\2\0\42\121\1\u010b\10\0\6\u010b"+
+    "\1\0\1\u010b\2\u026e\1\u010b\1\u026e\1\u010b\1\0\4\u010b"+
+    "\1\0\2\u010b\1\u010d\1\u010b\14\0\5\u010b\1\u010d\6\u010b"+
+    "\2\0\7\u010b\1\u010d\6\u010b\1\u026e\6\u010b\1\u010d\5\u010b"+
+    "\3\u026e\1\u010b\3\u026e\21\0\2\u026e\1\0\1\u026e\63\0"+
+    "\1\u026e\14\0\3\u026e\1\0\3\u026e\1\u010b\10\0\1\u010b"+
+    "\1\u0271\4\u010b\1\0\1\u010b\4\u0271\1\u010b\1\0\4\u010b"+
+    "\1\0\1\u010b\1\u0270\2\u0271\14\0\4\u010b\3\u0271\1\u0270"+
+    "\4\u010b\2\0\1\u010b\1\u0271\5\u010b\1\u0271\6\u010b\1\u0271"+
+    "\1\u010b\1\u0271\1\u010b\1\u0271\2\u010b\1\u0271\5\u010b\3\u0271"+
+    "\1\u010b\3\u0271\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u011e"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u045d\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u045e\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u045f\3\121\1\112\2\0"+
+    "\23\121\1\u0460\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0461\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0462\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0114"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0463\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0464\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0114\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0465"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0466\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0467\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0114\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u016d\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0114\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u01fe"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0468\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0460\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0469\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u046a"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0279\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u046b\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u046c\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u046d"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0126\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u046e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u046b\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u029a"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u046f\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u046e\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\27\121"+
+    "\1\u0470\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0471"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0472\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u0473\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0114\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u027f\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0474\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0475\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u046d\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0295\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u027b\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u046d\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0476\5\121\1\u0357\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0114\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0477\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0478\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0479\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u047a"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u047b\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u047c\4\121\1\112\2\0\42\121\12\0"+
+    "\1\u047d\6\0\4\u047d\11\0\2\u047d\20\0\3\u047d\10\0"+
+    "\1\u047d\5\0\1\u047d\6\0\1\u047d\1\0\1\u047d\1\0"+
+    "\1\u047d\2\0\1\u047d\5\0\3\u047d\1\0\3\u047d\12\0"+
+    "\1\u047e\6\0\4\u047e\11\0\2\u047e\20\0\3\u047e\10\0"+
+    "\1\u047e\5\0\1\u047e\6\0\1\u047e\1\0\1\u047e\1\0"+
+    "\1\u047e\2\0\1\u047e\5\0\3\u047e\1\0\3\u047e\12\0"+
+    "\1\u047f\101\0\1\u047f\31\0\1\u0480\101\0\1\u0480\77\0"+
+    "\1\u02aa\125\0\1\u0481\146\0\1\u0482\107\0\1\u0483\72\0"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\41\121"+
+    "\1\u0484\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0485\6\121"+
+    "\1\112\2\0\25\121\1\u0486\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0487\1\121\1\0"+
+    "\4\121\14\0\3\121\1\u0488\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0374\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0383"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0333\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0489\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u048a"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\30\121\1\u048b\1\121\1\u048c\7\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u048d\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u048e\12\121\1\112\2\0\23\121"+
+    "\1\u048f\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0490"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u048f\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\1\121\1\u0491\2\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\3\121\1\u0492\2\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\10\121\1\u0493\31\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0494\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0495\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\121"+
+    "\1\u0496\40\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\3\121\1\u0497\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\3\121\1\u0498\2\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u01dc\4\121\1\112\2\0\23\121\1\u0499"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u049a\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u049b\7\121\1\112\2\0\6\121\1\u01fe\33\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u049c\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u049d\2\121\1\u049e\1\u02c8"+
+    "\1\u049f\1\u04a0\1\u04a1\1\u04a2\2\121\1\112\2\0\1\u04a3"+
+    "\17\121\1\u04a4\1\121\1\u04a5\1\u04a6\1\u04a7\1\u04a8\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u01fe\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u04a9"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u04aa\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\30\121\1\u04ab\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u02f5\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u04ac\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u04ad"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u04ae\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0357\1\121\1\u04af\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u04ac\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0350"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u04b0\6\121\1\u04b1\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u04b2"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u04b3\12\121\1\112"+
+    "\2\0\23\121\1\u0383\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u02ce\1\112\2\0\6\121\1\u0282\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u04b4\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u04b5\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u04b6\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u04b7\7\121\1\u04b8\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u04b9\3\121"+
+    "\1\112\2\0\23\121\1\u04ba\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u04bb\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u04bc"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u04bd\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u04be\1\121\1\0\4\121\14\0"+
+    "\2\121\1\u01fe\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u04bf\6\121\1\112\2\0\27\121"+
+    "\1\u0120\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u04c0"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u01fe\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0462\1\121\1\u04c1\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u04c2"+
+    "\3\121\1\u04c3\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u04c4\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u04c5\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u04c6"+
+    "\1\0\1\112\1\u0108\1\u04c7\1\121\1\0\4\121\14\0"+
+    "\1\u04c8\1\u04c9\1\u04ca\1\u04cb\1\u04cc\1\u04cd\1\u04ce\1\u04cf"+
+    "\1\u04d0\1\u04d1\1\u04d2\1\112\2\0\1\u04d3\5\121\1\u04d4"+
+    "\11\121\1\u04d5\1\121\1\u04d6\1\u04d7\1\u04d8\1\u04d9\1\121"+
+    "\1\u04da\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u04db\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u04dc\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u04dd\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u04de"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u04b4\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u04df"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u04e0\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u04e1\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u04e2\6\121\1\112"+
+    "\2\0\31\121\1\u04e3\10\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u01dc\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u04e4\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u017c\1\u04e5\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u033b\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u04e6\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0340\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0343\3\121\1\112"+
+    "\2\0\23\121\1\u04e7\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0345\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u04e1\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0304\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u04e8"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u04e9\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0463\6\121\1\112\2\0\24\121"+
+    "\1\u04ea\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u04eb"+
+    "\11\121\1\112\2\0\6\121\1\u01fe\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u04ec\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u04ed\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u04ee\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u04ef\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u01fe\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u04f0\6\121\1\112\2\0"+
+    "\23\121\1\u013c\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u02c9\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\1\u04f1\41\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u031e\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u04f2\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u01fe"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u04f3\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u04f4\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u04f5\1\u04f6\2\121\1\112\2\0"+
+    "\25\121\1\u04f7\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u04f8\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u04f9\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u04fa\1\121\1\u0383\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u04fb"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u04fc\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u04fd\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u04fe"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u04ff\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0500\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0501\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0502\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0304\11\121\1\112\2\0\25\121"+
+    "\1\u01fe\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\33\121\1\u0503\6\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0504\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u04b3\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u02c5\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0505\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0506"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0507\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0508\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0509\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0304"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u050a\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u050b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u050c\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u050d"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u050e\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u050f\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u0510"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0511\4\121\1\u0512"+
+    "\2\121\1\u0513\2\121\1\112\2\0\1\u0514\24\121\1\u0515"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0114\2\121"+
+    "\1\u0516\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0517\1\u0518\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0519\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u051a"+
+    "\3\121\1\112\2\0\6\121\1\u051b\14\121\1\u02b1\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u051c\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u051d\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u051e\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u051f\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0520\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u029e"+
+    "\4\121\1\112\2\0\25\121\1\u01fe\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0521\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0522\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0523\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\21\121\1\u01fe\20\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u0524\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0525\1\121\1\u02c5\4\121\1\112"+
+    "\2\0\24\121\1\u0526\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0527\17\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0338\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u031e\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0528\4\121"+
+    "\1\112\2\0\22\121\1\u0333\1\u04b3\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0383\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0333\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0529"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u052a\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u052b\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u052c\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0394\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u04b4"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\32\121\1\u052d\7\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u031c\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u052e\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u042a"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u052f\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0530\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0531\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0532"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0533\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0534\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u042a\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u02fe\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0535\3\121\1\u0536\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0537\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0282\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0538\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0539\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u053a\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u02fe\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u053b\1\121\1\0\4\121\14\0\4\121\1\u053c"+
+    "\1\u053d\1\u053e\1\121\1\u053f\2\121\1\112\2\0\22\121"+
+    "\1\u0540\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0114"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u0541\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0542\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0543\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0544"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0545\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\40\121\1\u0546\1\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0547"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0548\4\121"+
+    "\1\112\2\0\21\121\1\u01fe\20\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u0549\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u054a\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u054b\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u054c\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u054d\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u054e\10\121\1\u054f\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0550\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0551\1\121\1\0\4\121\14\0"+
+    "\1\u0552\1\121\1\u0553\1\u0554\1\u0555\1\u04de\1\121\1\u0345"+
+    "\1\u0556\1\u0557\1\121\1\112\2\0\22\121\1\u0558\1\121"+
+    "\1\u0559\2\121\1\u0120\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u055a\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u055b\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u055c\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\1\121\1\u055d\4\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u055e\1\121\1\u055f\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u04ac\1\0\1\112"+
+    "\1\u0108\1\u0560\1\121\1\0\4\121\14\0\1\u0561\1\121"+
+    "\1\u0562\1\u0563\1\121\1\u0564\1\u0565\1\u0566\1\u0567\1\u0568"+
+    "\1\u0569\1\112\2\0\6\121\1\u056a\11\121\1\u056b\1\121"+
+    "\1\u056c\1\u056d\1\u04ee\1\u056e\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u056f\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0570\1\u0114\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0571\1\121"+
+    "\1\u0572\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0573\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0574\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0547\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u04ac"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u0575\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0576\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0577"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0578\1\121\1\0\4\121\14\0\1\u0579\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u057a\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u057b\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\40\121\1\u03bf"+
+    "\1\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u057c\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u057d\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\1\u057e\41\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u057f\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u0580\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\u0581"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0582\3\121"+
+    "\1\112\2\0\24\121\1\u0173\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0583\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0584"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u01fe\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\21\121\1\u0585\20\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u0586\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0587\4\121\1\u0588\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u02cb\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0589\1\121\1\0"+
+    "\4\121\14\0\1\u058a\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u058b\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u058c\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u01fe\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u058d\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u058e\1\u058f\1\u0590\1\u0591\1\u0592\1\u0593"+
+    "\1\u0594\1\u0595\1\u0596\1\u0597\1\u0598\1\112\2\0\6\121"+
+    "\1\u0599\13\121\1\u059a\1\u059b\1\u059c\1\u059d\1\121\1\u04da"+
+    "\2\121\1\u059e\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u059f\2\121\1\u0470\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u05a0\3\121\1\u05a1\3\121"+
+    "\1\u05a2\1\121\1\112\2\0\27\121\1\u05a3\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0471\10\121\1\112\2\0"+
+    "\22\121\1\u05a4\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u033d\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u05a5\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u02e9\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u05a6\3\121\1\u05a7"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u05a8\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u05a9\1\121"+
+    "\1\0\4\121\14\0\1\u04df\12\121\1\112\2\0\22\121"+
+    "\1\u05aa\4\121\1\u04da\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u05ab\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u05ac\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u05ad\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\33\121\1\u05ae\6\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u05af\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u05b0\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u05b1\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u05b2\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u05b3\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u05b4\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u05b5\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u05b6"+
+    "\1\121\1\0\4\121\14\0\5\121\1\u05b7\1\u05b8\1\121"+
+    "\1\u05b9\2\121\1\112\2\0\22\121\1\u05ba\1\121\1\u02c6"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u02f5\14\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u05bb\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u05bc\1\u05bd\1\121\1\u05be\1\u05bf\1\u05c0\1\u05c1\1\121"+
+    "\1\u05c2\1\u05c3\1\121\1\112\2\0\1\u05c4\5\121\1\u05c5"+
+    "\13\121\1\u05c6\1\u05c7\1\u05c8\1\u05c9\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u05ca\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0383\16\121\1\112\10\0\6\112\1\0\5\112\1\u05cb"+
+    "\1\0\4\112\1\0\4\112\14\0\14\112\2\0\43\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u05cc\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u05cd\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\30\121\1\u05ce\11\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u05cf\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u05d0\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u05d1\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u05d2\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u05d3\1\121\1\u05d4\4\121\1\u05d5\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u05d6\3\121\1\u05d7\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u05d8\1\u05d9"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u01fe\3\121"+
+    "\1\112\2\0\24\121\1\u01fe\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u05da\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u05db\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u05dc\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u05dd\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u05de\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u05df\1\u05e0\1\121\1\u05e1\1\u05e2\2\121\1\u05e3"+
+    "\1\u05e4\1\u05e5\1\u05e6\1\112\2\0\22\121\1\u05e7\1\u05e8"+
+    "\1\121\1\u05e9\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u05ea"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u05eb\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u05ec\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u05ed\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u05ee"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u05ef\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u05f0\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0300\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\32\121\1\u05f1\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u05f2\5\121\1\u05f3\6\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u05f4\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u05f5\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u02c5\14\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u05f6\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u05f7\7\121\1\u02b1"+
+    "\7\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u05f8\16\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0282\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u02c5\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u05f9\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u05fa\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u05fb\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u05fc\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u04e0\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u05fd"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u05fe\3\121\1\u05ff"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0600\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0601\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\37\121"+
+    "\1\u0602\2\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0383"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0603\1\121\1\0\4\121"+
+    "\14\0\7\121\1\u0604\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0605\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0606\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u0607\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0608\2\121\1\112\2\0\24\121\1\u0609"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u060a\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u060b\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u04ac\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u03a5"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u060c\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u060d\7\121\1\112\2\0\24\121\1\u060e\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u01fe\1\121\1\112\2\0"+
+    "\1\u042a\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u060f"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0610\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u01fe\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0517\1\121\1\112"+
+    "\2\0\6\121\1\u0611\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0612\5\121\1\u0613\2\121\1\112\2\0\24\121"+
+    "\1\u0614\2\121\1\u0615\12\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0616\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0617\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0618\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0619\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u061a"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u061b\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u061c\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u061d\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u061e\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u061f\1\u0620"+
+    "\1\u0621\1\121\1\u0622\1\u0187\1\121\1\u0623\1\u0624\2\121"+
+    "\1\112\2\0\22\121\1\u0625\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0626\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0627"+
+    "\1\121\1\0\4\121\14\0\1\u0628\2\121\1\u0629\1\u062a"+
+    "\1\u062b\1\121\1\u062c\1\u062d\1\u062e\1\121\1\112\2\0"+
+    "\1\u062f\17\121\1\u0630\1\121\1\u0631\1\121\1\u0632\1\u0633"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0634\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0635\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0636\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u0637\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0638\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0639"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0171\2\121\1\112\2\0\22\121\1\u063a\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u063b\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u063c"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u04b3\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u063d\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u063e\1\121\1\u063f"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u056f\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0640\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0641\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0324"+
+    "\4\121\1\112\2\0\21\121\1\u0642\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0643\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u0644\41\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\33\121"+
+    "\1\u0645\6\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0646\5\121"+
+    "\1\u0478\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0647\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0648\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0649\17\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u064a\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u04c2\3\121\1\u064b\2\121\1\u064c\1\112\2\0"+
+    "\20\121\1\u0218\2\121\1\u064d\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u064e\1\121\1\u064f\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u055e\4\121"+
+    "\1\112\2\0\23\121\1\u0650\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0651\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u058e\2\121\1\u0652\1\u0653\1\u0654\5\121"+
+    "\1\112\2\0\22\121\1\u018e\1\u02f3\1\u0655\1\u0656\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u01f3\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u0657\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0658\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0659\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u065a"+
+    "\11\121\1\112\10\0\6\121\1\0\5\121\1\u065b\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0562"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u065c\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u065d\2\121\1\u065e\1\u02b3\1\u01dc\4\121"+
+    "\1\112\2\0\6\121\1\u065f\13\121\1\u033a\1\121\1\u02c6"+
+    "\1\121\1\u0660\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0661\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0662\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0663"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u033f\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0664\1\121\1\0\4\121\14\0"+
+    "\1\u0665\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0666\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0667\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0668\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0669\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u066a\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u066b\1\121\1\0"+
+    "\4\121\14\0\2\121\1\u066c\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u066d\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u066e"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u066f\1\121\1\0\4\121"+
+    "\14\0\3\121\1\u0670\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0671"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u0672\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u0673\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u03e1\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0674\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0675\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0676\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0677"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0678\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u01fe\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0679\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u067a\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u067b\4\121\1\112\2\0\42\121\11\0\3\262"+
+    "\1\u067c\2\262\1\0\6\262\6\0\4\262\14\0\1\u067c"+
+    "\12\262\3\0\42\262\65\0\1\u067d\56\0\1\u067e\175\0"+
+    "\1\u0431\11\0\1\u0224\54\0\2\u067f\1\0\7\u0433\1\0"+
+    "\6\u0433\1\0\1\u067f\1\0\1\u067f\1\u0433\1\u067f\4\u0433"+
+    "\2\u067f\1\0\3\u067f\1\0\5\u067f\13\u0433\3\u067f\42\u0433"+
+    "\2\43\1\0\1\43\1\0\2\43\2\0\6\43\1\0"+
+    "\25\43\1\0\17\43\1\u0680\3\43\1\0\42\43\2\53"+
+    "\1\0\1\53\1\0\2\53\2\0\4\53\1\u024e\1\53"+
+    "\1\0\25\53\1\0\17\53\1\u024e\3\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\23\53\1\0\12\53\1\u0231\6\53\1\u0231\22\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\23\53\1\0\3\53\1\315\20\53\1\315\17\53"+
+    "\1\0\1\53\1\0\2\53\2\0\3\53\1\u0442\2\53"+
+    "\1\0\25\53\1\0\6\53\1\u0442\14\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\1\53\1\u024e\4\53"+
+    "\1\0\25\53\1\0\23\53\1\0\22\53\1\u024e\21\53"+
+    "\1\0\1\53\1\0\2\53\2\0\1\53\1\u0231\4\53"+
+    "\1\0\25\53\1\0\23\53\1\0\22\53\1\u0231\21\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\14\53\1\u0681\6\53\1\0\1\53\1\u0681\42\53"+
+    "\1\0\1\53\1\0\2\53\2\0\2\53\1\u0682\3\53"+
+    "\1\0\25\53\1\0\11\53\1\u0682\11\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\17\53"+
+    "\1\u0683\5\53\1\0\12\53\1\u0683\1\53\1\u0446\6\53"+
+    "\1\0\1\53\1\u0446\42\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\7\53"+
+    "\1\u0684\15\53\1\u0684\16\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\25\53\1\0\23\53\1\0\5\53"+
+    "\2\u0231\35\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\3\53\1\u0685\20\53"+
+    "\1\u0685\17\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\14\53\1\u0686\6\53\1\0\1\53"+
+    "\1\u0686\42\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\2\53\1\370\20\53"+
+    "\1\370\20\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\12\53\1\u0687\6\53"+
+    "\1\u0687\22\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\5\53\1\u0446\17\53\1\0\23\53\1\0\10\53"+
+    "\1\u0446\33\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\16\53\1\u0688\6\53\1\0\13\53\1\u0688\7\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\3\53\1\373\20\53"+
+    "\1\373\17\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\17\53\1\u0689\5\53\1\0\12\53\1\u0689\10\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\7\53\1\u068a\15\53"+
+    "\1\u068a\16\53\1\0\1\53\1\0\2\53\2\0\2\53"+
+    "\1\u0231\3\53\1\0\25\53\1\0\11\53\1\u0231\11\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\5\53"+
+    "\1\u068b\1\0\25\53\1\0\10\53\1\u068b\12\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\3\53\1\u068c\20\53\1\u068c"+
+    "\17\53\1\0\1\53\1\0\2\53\2\0\1\53\1\310"+
+    "\4\53\1\0\25\53\1\0\23\53\1\0\22\53\1\310"+
+    "\21\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\17\53\1\u024e\5\53\1\0\12\53\1\u024e\10\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\17\53\1\u068d\5\53\1\0\12\53\1\u068d\10\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\14\53\1\u068e\6\53\1\0\1\53\1\u068e"+
+    "\42\53\1\0\1\53\1\0\2\53\2\0\3\53\1\u068f"+
+    "\2\53\1\0\25\53\1\0\6\53\1\u068f\14\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\5\53\1\u0690\17\53\1\0\23\53\1\0\10\53\1\u0690"+
+    "\33\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\2\53\1\315\20\53\1\315"+
+    "\20\53\1\0\1\53\1\0\2\53\2\0\3\53\1\u0691"+
+    "\2\53\1\0\25\53\1\0\6\53\1\u0691\14\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\5\53\1\u0692"+
+    "\1\0\15\53\1\u0693\7\53\1\0\7\53\1\u0694\1\u0692"+
+    "\4\53\1\u0693\5\53\1\0\11\53\1\u0694\32\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\17\53\1\370"+
+    "\5\53\1\0\12\53\1\370\10\53\1\0\42\53\65\0"+
+    "\1\u0695\61\0\1\u0696\43\0\1\u0696\54\0\1\112\10\0"+
+    "\1\112\1\u0697\4\112\1\0\1\112\4\u0697\1\112\1\0"+
+    "\4\112\1\0\2\112\2\u0697\14\0\4\112\3\u0697\5\112"+
+    "\2\0\1\112\1\u0697\5\112\1\u0697\6\112\1\u0697\1\112"+
+    "\1\u0697\1\112\1\u0697\2\112\1\u0697\5\112\3\u0697\1\112"+
+    "\3\u0697\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0698\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0341\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\3\121\1\u01fe\36\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0699\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0357\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u069a\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u069b\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u069c\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u069d\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0511\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u069e\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u069f\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u06a0\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u06a1"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u046d\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u06a2\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u06a3\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u06a4\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0479"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u06a5\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u06a6\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u06a7\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\21\121\1\u0114\20\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u06a8\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u06a9\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u027f"+
+    "\12\121\1\112\10\0\6\121\1\0\5\121\1\u06aa\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u027f"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u06ab\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0299\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0132\10\121\1\112"+
+    "\2\0\42\121\13\0\1\u06ac\43\0\1\u06ac\67\0\1\u06ad"+
+    "\43\0\1\u06ad\64\0\1\u06ae\175\0\1\u0481\11\0\1\u02aa"+
+    "\54\0\2\u06af\1\0\7\u0483\1\0\6\u0483\1\0\1\u06af"+
+    "\1\0\1\u06af\1\u0483\1\u06af\4\u0483\2\u06af\1\0\3\u06af"+
+    "\1\0\5\u06af\13\u0483\3\u06af\42\u0483\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u02ae\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u04e5\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u04e5\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u06b0"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u06b1\1\121\1\0\4\121"+
+    "\14\0\7\121\1\u040b\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0651\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u06b2\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u06b3\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u02c5\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u06b4\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u06b5\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0333\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0114\1\u036e\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\121\1\u06b6"+
+    "\40\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\1\121\1\u06b7\2\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\3\121\1\u06b8\36\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u06b9\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u06ba\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\5\121\1\u06bb\34\121\1\112\10\0\5\121\1\u06bc\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\2\121\1\u06bd"+
+    "\3\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u06be\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u06bf\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u06c0"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u06c1\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u06c2\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u06c3\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u06c4\6\121"+
+    "\1\u06c5\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u06c6\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u04ad\12\121\1\112\2\0\23\121"+
+    "\1\u06c7\16\121\1\112\10\0\6\121\1\0\5\121\1\u06c8"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u06c9\10\121\1\112\2\0\22\121\1\u06ca\1\u06cb\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u06cc\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u06cd"+
+    "\3\121\1\112\2\0\23\121\1\u06ce\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u06cf\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u06d0\21\121\1\112\10\0\6\121\1\0\5\121\1\u06d1"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u042a\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u04b3\12\121\1\112\2\0\23\121\1\u06d2\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\30\121"+
+    "\1\u0383\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u06d3"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u06d4\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u01fe\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0333\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u06d5"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u06d6\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u06d7\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u06d8\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u06d9\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u01fe"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0304\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u06da\4\121\1\u06db\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u06c7\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u06dc\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u06dd\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0699\6\121\1\112\2\0"+
+    "\23\121\1\u06de\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u06df\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u06e0\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u06e1"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u06e2\1\121"+
+    "\1\u06e3\2\121\1\u06e4\1\121\1\u04ef\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u06e5\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u06e6\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u06e7\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u06d9\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u06e8\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u06e9\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u06ea\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u06eb\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u06ec\2\121\1\u06ed\1\u06ee\1\121"+
+    "\1\u06ef\1\u06f0\1\u06f1\1\u06f2\1\u06f3\1\112\2\0\6\121"+
+    "\1\u06f4\11\121\1\u06f5\1\121\1\u06f6\1\u06f7\1\u06f8\1\u06f9"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u06fa\10\121"+
+    "\1\112\2\0\6\121\1\u06fb\15\121\1\u06fc\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u06fd\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u06fe\3\121\1\u04a9"+
+    "\6\121\1\112\2\0\26\121\1\u016d\13\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u06ff\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0700\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0701\3\121"+
+    "\1\112\2\0\24\121\1\u05fa\15\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0702\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0703\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0704\4\121\1\u0705\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0706\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0707\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0708\1\121\1\u0709\1\121\1\u070a\5\121"+
+    "\1\u070b\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u070c\1\u070d\1\121\1\u070e\4\121\1\112\2\0"+
+    "\23\121\1\u070f\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0710\6\121\1\112\2\0\23\121\1\u0711\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0712\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u03b8\1\121\1\u0713"+
+    "\6\121\1\112\2\0\26\121\1\u0714\1\121\1\u0715\11\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0716\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u03b8\1\u0717"+
+    "\6\121\1\u0718\1\112\2\0\1\u02c5\41\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0383\1\121\1\112\2\0\1\u0719"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u071a\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u071b\1\121\1\u04b4\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u071c\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u071d\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u071e"+
+    "\1\u071f\1\121\1\u0720\1\121\1\u0517\1\u0721\1\u0722\1\u0723"+
+    "\1\u0724\1\u0725\1\112\2\0\6\121\1\u03c7\13\121\1\u0726"+
+    "\1\u04b3\1\u0727\1\u0728\2\121\1\u0729\5\121\1\u072a\3\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u03b8\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u072b\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u072c\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u072d\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u072e\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\u018b\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u02c5\4\121\1\112\2\0\1\u072f\41\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u051a\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0730\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0731\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0732\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0733\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u02e8\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0734\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0735\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0736\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u05ea\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0383\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0737"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0738\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0739\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u01fe\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u073a"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u073b\1\121\1\0\4\121"+
+    "\14\0\11\121\1\u073c\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u042a"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u073d\1\121\1\0\4\121\14\0\1\121\1\u073e"+
+    "\3\121\1\u02c9\1\121\1\u073f\3\121\1\112\2\0\25\121"+
+    "\1\u0315\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u0740\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0741\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0742\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0743\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0744\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u0745\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0746\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0747\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0748\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0749\2\121\1\u040b\3\121\1\112\2\0\22\121\1\u018e"+
+    "\1\u02f3\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u014d"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0727\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u074a\1\121\1\112\2\0\32\121"+
+    "\1\u074b\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0582"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u02b9\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u074c\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u074d\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u074e\1\121\1\0\4\121\14\0\1\u074f"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0750\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0511\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0751\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\26\121\1\u0114\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0752"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0753\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0754\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u0114\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0755\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\1\u012c\41\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u0132\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0756\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0757\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u064d\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0758\15\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u04b4\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u06de\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\40\121"+
+    "\1\u01fe\1\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0759\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u075a\1\121\1\0\4\121"+
+    "\14\0\2\121\1\u075b\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u075c\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u075d\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u075e\1\121\1\0\4\121\14\0"+
+    "\1\u075f\1\u04c9\1\u0562\3\121\1\u04de\1\121\1\u0760\1\u0761"+
+    "\1\121\1\112\2\0\6\121\1\u04de\13\121\1\u04de\1\u0762"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0763\2\121"+
+    "\1\112\2\0\22\121\1\u0764\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u04ea\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0765\1\121\1\u0766\1\u0767"+
+    "\1\u0768\1\u0769\1\u076a\1\u076b\1\u076c\1\121\1\112\2\0"+
+    "\6\121\1\u076d\13\121\1\u076e\1\121\1\u076f\1\u0656\4\121"+
+    "\1\u0770\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0771\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0487\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0772\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0773\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0774\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u017c\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\21\121\1\u0775\20\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u01fe\2\121\1\112\2\0\22\121\1\u0776"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0777\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0778\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u029a\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0302\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0779\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u077a\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u077b\1\121\1\0"+
+    "\4\121\14\0\1\u077c\3\121\1\u077d\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u01fe\1\112"+
+    "\2\0\33\121\1\u01fe\6\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u077e\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u077f\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0780\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0781\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u0782\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0783\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0784\2\121\1\u0785\3\121\1\u0786"+
+    "\2\121\1\112\2\0\20\121\1\u0787\1\121\1\u0788\2\121"+
+    "\1\u0789\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u05be"+
+    "\7\121\1\112\2\0\24\121\1\u078a\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u078b\15\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u078c\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u01dc\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u078d\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u06c9\4\121\1\u078e\2\121\1\u0280\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u078f\2\121"+
+    "\1\112\2\0\23\121\1\u0790\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0791\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0792"+
+    "\1\121\1\0\4\121\14\0\1\u0793\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0794\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\27\121\1\u0795\12\121\1\112\10\0\6\121"+
+    "\1\0\2\121\1\u01fe\3\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u01fe\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0796\1\112"+
+    "\2\0\30\121\1\u0350\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0797\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0798\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\33\121\1\u0799"+
+    "\6\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u079a\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u072c\1\u079b\1\121\1\u03cc\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u079c\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u079d\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u079e\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u017c\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u074e\2\121\1\u079f\4\121\1\u07a0"+
+    "\1\u05fb\1\121\1\112\2\0\1\u07a1\41\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u07a2\1\u07a3\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u01fe\7\121"+
+    "\1\112\2\0\23\121\1\u07a4\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u07a5\3\121\1\u05fa\4\121\1\u07a6\1\121\1\112"+
+    "\2\0\22\121\1\u07a7\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u07a8\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u04b3\6\121\1\u042a\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u03b8"+
+    "\10\121\1\112\2\0\20\121\1\u07a9\2\121\1\u0730\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u07aa\1\121\1\u07ab"+
+    "\1\121\1\u04b3\1\112\2\0\6\121\1\u04ac\14\121\1\u01dc"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u07ac\4\121"+
+    "\1\112\2\0\22\121\1\u07ad\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u07ae\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u07af\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0138\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u07b0\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u07b1\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u07b2\1\121\1\u07b3\1\121\1\u07b4\1\u07b5"+
+    "\1\u07b6\1\u07b7\3\121\1\112\2\0\6\121\1\u07b8\13\121"+
+    "\1\u07b9\1\u03d2\1\u07ba\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u07bb\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u016d\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u07bc\5\121\1\u07bd\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u07be\7\121\1\112\2\0\23\121\1\u07bf\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u07c0\10\121\1\112\2\0"+
+    "\22\121\1\u078d\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u07c1"+
+    "\3\121\1\u07c2\6\121\1\112\2\0\23\121\1\u07c3\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u07c4\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u07c5"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0383\3\121\1\u0710\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u07c6\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u0716\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u07c7"+
+    "\4\121\1\112\2\0\23\121\1\u07c8\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u07c9\3\121\1\112\2\0\23\121"+
+    "\1\u07ca\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u07cb\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u07cc\3\121\1\u071b\6\121\1\112\2\0\23\121\1\u07cd"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u07ce\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u07cf\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u07d0\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u07d1\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u04ef\1\121\1\u07d2"+
+    "\2\121\1\u07d3\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u07d4\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u07d5\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u04ef\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u07d6"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u07d7\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u07d8\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u02f5\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u07d9"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u07da\1\121\1\u07db\2\121\1\u07dc\2\121\1\u07dd"+
+    "\1\121\1\112\2\0\25\121\1\u07de\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u07df\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u07e0\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u07e1\1\u07e2"+
+    "\1\u07e3\1\u07e4\1\u07e5\1\u07e6\1\u07e7\1\u07e8\1\u07e9\1\121"+
+    "\1\112\2\0\6\121\1\u07ea\13\121\1\u07eb\1\u07ec\1\u07ed"+
+    "\1\u07ee\1\121\1\u07ef\12\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u07f0\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u07f1\1\121\1\u07f1"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u07f1\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u07f2\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u064c\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u07f3\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u07f4\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u07f5"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u038b\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u07f6\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u07f7\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u05fa\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u07f8\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u07f9\1\121\1\112\2\0\24\121\1\u07fa"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u07fb\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u07fc\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u03e1\1\u07fd\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u07fe\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u07ff"+
+    "\4\121\1\u0800\2\121\1\112\2\0\24\121\1\u0801\3\121"+
+    "\1\u05b5\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0802\2\121"+
+    "\1\u0803\1\u0804\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u0805\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0806\4\121\1\112"+
+    "\2\0\23\121\1\u0807\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0808\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0809\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u06c7\5\121\1\u080a\4\121\1\112"+
+    "\2\0\22\121\1\u080b\1\u02b1\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0651\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u080c\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u080d\1\u080e"+
+    "\3\121\1\112\2\0\6\121\1\u080f\14\121\1\u0810\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u063f\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0811"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0812\6\121\1\112\2\0\20\121\1\u02fc\21\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0813\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0814\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0815\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0816"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0817\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0818\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0819"+
+    "\1\121\1\0\4\121\14\0\4\121\1\u081a\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u081b\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u081c\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u081d\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u081e\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u02fc"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u081f"+
+    "\6\121\1\u0820\1\u0821\2\121\1\112\2\0\22\121\1\u0822"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0823\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0824\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0825\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u0826"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u0827\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0828\1\u0829"+
+    "\1\u082a\1\u082b\1\u082c\1\u082d\1\u082e\1\u082f\1\u0830\1\u0831"+
+    "\1\121\1\112\2\0\6\121\1\u0832\11\121\1\u0833\1\121"+
+    "\1\u0834\1\u0835\1\u0836\1\u0656\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0837\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0838"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0839\1\121\1\0\4\121\14\0\4\121\1\u083a\3\121"+
+    "\1\u083b\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u083c\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u083d\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0717\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u083e\4\121\1\112\2\0\22\121\1\u083f\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0840\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0841\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0842"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u0843\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0844\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0845"+
+    "\1\u015e\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0846"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0847\7\121\1\112\2\0\25\121\1\u0848\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0849\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u084a"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u033a\1\121\1\u084b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u084c\12\121\1\112\2\0"+
+    "\22\121\1\u080b\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u02de\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u084d\4\121\1\112\2\0\23\121\1\u084e\3\121"+
+    "\1\u01fe\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0343"+
+    "\1\121\1\u01fe\1\u084f\1\112\2\0\23\121\1\u0850\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0851\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u0852\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0853\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0854\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0855\6\121\1\112\2\0\23\121"+
+    "\1\u0856\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0857\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\1\112\1\u0858\4\112"+
+    "\1\0\1\112\4\u0858\1\112\1\0\4\112\1\0\2\112"+
+    "\2\u0858\14\0\4\112\3\u0858\5\112\2\0\1\112\1\u0858"+
+    "\5\112\1\u0858\6\112\1\u0858\1\112\1\u0858\1\112\1\u0858"+
+    "\2\112\1\u0858\5\112\3\u0858\1\112\3\u0858\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0859\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\u085a"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u085b\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u085c"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u085d\1\121\1\0\4\121"+
+    "\14\0\2\121\1\u0562\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u04de"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u085e\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u085f"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0316\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u05d4\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0860\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0861\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0862\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0863\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0864\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0865"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0866\1\121\1\u0867\4\121\1\u0868\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0869"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u086a\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u086b\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u086c\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u086d\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u086e\7\121\1\112\2\0";
+
+  private static final String ZZ_TRANS_PACKED_1 =
+    "\24\121\1\u086f\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0870"+
+    "\5\121\1\u0871\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0872\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0873\1\121\1\u0874\4\121"+
+    "\1\u0875\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0876\2\121\1\u0877\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0878\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0879\16\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u087a\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u087b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0304\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u087c"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u087d\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u087e\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u087f\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0880\1\121\1\0\4\121\14\0\2\121\1\u02de\6\121"+
+    "\1\u0881\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0882\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0883\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0884\1\121\1\0\4\121\14\0\2\121\1\u0885"+
+    "\1\121\1\u0717\4\121\1\u0886\1\121\1\112\2\0\22\121"+
+    "\1\u0887\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u064c"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0888\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0889\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u04ee\7\121"+
+    "\1\u088a\5\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u01fe\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u02f5\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\1\u088b\41\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u04ac"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u01fe\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u02c5\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u088c\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0653\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u07bf\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u088d\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u088e\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u088f\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\33\121"+
+    "\1\u01fe\6\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u04df\1\121"+
+    "\1\u0890\2\121\1\u0891\5\121\1\112\2\0\25\121\1\u0892"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0893\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0894\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0895\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0896\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0897\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0898"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u0899\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u089a\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\21\121"+
+    "\1\u089b\20\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u089c"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u089d\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u089e\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u089f\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0383\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u06a9\3\121"+
+    "\1\u07bf\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u08a0\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u08a1\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u08a2\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u08a3\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u08a4\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u08a5\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u08a6\1\121\1\u08a7"+
+    "\1\u08a8\1\u08a9\1\121\1\u08aa\1\121\1\u08ab\1\121\1\112"+
+    "\2\0\20\121\1\u072f\1\121\1\u08ac\1\u02f3\1\u08ad\1\u02de"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u08ae\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u01e1\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u08af\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0588\1\u08b0\2\121\1\112"+
+    "\2\0\25\121\1\u0315\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u08b1\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u08b2\13\121"+
+    "\1\u08b3\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u08b4"+
+    "\6\121\1\112\2\0\31\121\1\u08b5\10\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u08b6\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u08b7"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u08b8\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u08b9"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u08ba\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u08bb\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u08bc\2\121\1\u08bd\1\u062a"+
+    "\1\u08be\1\121\1\u08bf\1\u08c0\1\u08c1\1\121\1\112\2\0"+
+    "\20\121\1\u08c2\1\121\1\u08c3\1\121\1\u08c4\1\u08c5\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u08c6\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u08c7"+
+    "\6\121\1\112\2\0\23\121\1\u08c8\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u08c9\7\121\1\112\2\0\30\121"+
+    "\1\u08ca\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u08cb"+
+    "\1\u08cc\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u08cd\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u08ce\1\121\1\u08cf\1\121"+
+    "\1\u08d0\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u08d1\1\u08d2\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u08d3\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u08d4\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u08d5\1\u08d6\3\121\1\112\2\0\23\121\1\u08d7\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u08d8\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u08d9\2\121"+
+    "\1\u08d2\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u08da\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u08db"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u08dc\3\121\1\u08dd"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u08de\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u08df\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u02c6\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u08e0\1\121\1\0\4\121\14\0\5\121"+
+    "\1\u08e1\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u08e2\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u08e3\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u08e4\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u08e5"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u08e6\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u03ea\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u08e7\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u08e8\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u08e9\1\121\1\0\4\121\14\0\5\121"+
+    "\1\u08ea\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u08eb\1\u03ca\1\121\1\u08ec\2\121\1\u08ed"+
+    "\2\121\1\112\2\0\1\u018b\21\121\1\u018e\1\u02f3\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u08ee\3\121\1\112"+
+    "\2\0\22\121\1\u08ef\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u05fb\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u08f0\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u08f1\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u08f2"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u08f3\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u08f4\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u08f5\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0816"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0383\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u08f6\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u08f7"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u08f8\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0383"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u08f9\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\30\121\1\u08fa\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u08fb\3\121\1\u052f\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u08fc\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0812\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u08fd\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u08fe\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u08ff"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u0900\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0901\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0902\11\121\1\112"+
+    "\2\0\22\121\1\u0903\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0904\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0905\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0906\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0907"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0120\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0908\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0909\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u090a\6\121\1\112"+
+    "\2\0\25\121\1\u090b\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u090c\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0763\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u090d\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u090e\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u090f\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0910\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\30\121"+
+    "\1\u0911\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0912\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0913\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u0914\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0915\2\121\1\u0916\3\121\1\u0917\1\u0918"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0919\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u03ca\1\u091a\6\121\1\112\2\0"+
+    "\22\121\1\u018e\1\u02f3\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u091b\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u091c\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u091d\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u091e\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u091f\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u0772\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0920\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0921\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0922\3\121\1\u0923\5\121"+
+    "\1\112\2\0\36\121\1\u0924\3\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0925\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\26\121\1\u0926"+
+    "\13\121\11\0\4\262\1\u0927\1\262\1\0\6\262\6\0"+
+    "\4\262\14\0\11\262\1\u0927\1\262\3\0\42\262\10\0"+
+    "\1\u0433\123\0\2\53\1\0\1\53\1\0\2\53\2\0"+
+    "\1\77\5\53\1\0\25\53\1\0\16\53\1\77\4\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\2\53\1\u0928\20\53"+
+    "\1\u0928\20\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\25\53\1\0\23\53\1\0\3\53\1\u024e\20\53"+
+    "\1\u024e\17\53\1\0\1\53\1\0\2\53\2\0\6\53"+
+    "\1\0\17\53\1\u0929\5\53\1\0\12\53\1\u0929\10\53"+
+    "\1\0\44\53\1\0\1\53\1\0\2\53\2\0\5\53"+
+    "\1\u092a\1\0\25\53\1\0\10\53\1\u092a\12\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\2\53\1\u092b"+
+    "\3\53\1\0\25\53\1\0\11\53\1\u092b\11\53\1\0"+
+    "\44\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\13\53\1\u092c\16\53\1\u092c"+
+    "\11\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\25\53\1\0\23\53\1\0\2\53\1\u0683\20\53\1\u0683"+
+    "\20\53\1\0\1\53\1\0\2\53\2\0\1\u044d\5\53"+
+    "\1\0\25\53\1\0\16\53\1\u044d\4\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\1\u092d\5\53\1\0"+
+    "\25\53\1\0\16\53\1\u092d\4\53\1\0\44\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\25\53\1\0"+
+    "\23\53\1\0\4\53\1\u024d\21\53\1\u024d\15\53\1\0"+
+    "\1\53\1\0\2\53\2\0\1\u0681\5\53\1\0\25\53"+
+    "\1\0\16\53\1\u0681\4\53\1\0\44\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\25\53\1\0\23\53"+
+    "\1\0\5\53\2\u092e\35\53\1\0\1\53\1\0\2\53"+
+    "\2\0\1\53\1\u092f\4\53\1\0\25\53\1\0\23\53"+
+    "\1\0\22\53\1\u092f\21\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\17\53\1\u0231\5\53\1\0\12\53"+
+    "\1\u0231\10\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\15\53\1\u0681\7\53\1\0\15\53"+
+    "\1\u0681\5\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\6\53\1\0\17\53\1\u0930\5\53\1\0\12\53"+
+    "\1\u0930\10\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\3\53\1\361\2\53\1\0\25\53\1\0\6\53"+
+    "\1\361\14\53\1\0\44\53\1\0\1\53\1\0\2\53"+
+    "\2\0\2\53\1\u0931\3\53\1\0\25\53\1\0\11\53"+
+    "\1\u0931\11\53\1\0\42\53\14\0\1\u0932\37\0\1\u0932"+
+    "\57\0\1\112\10\0\1\112\1\u0933\4\112\1\0\1\112"+
+    "\4\u0933\1\112\1\0\4\112\1\0\2\112\2\u0933\14\0"+
+    "\4\112\3\u0933\5\112\2\0\1\112\1\u0933\5\112\1\u0933"+
+    "\6\112\1\u0933\1\112\1\u0933\1\112\1\u0933\2\112\1\u0933"+
+    "\5\112\3\u0933\1\112\3\u0933\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0321\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u0934\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0935\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0936\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0937"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0114\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u027b\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0938\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u050d\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0939\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u0114\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u093a\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u093b\17\121\1\112\10\0\3\121\1\u07bf\2\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\2\121"+
+    "\1\u093c\1\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u027f\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u093d\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u093e\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0357\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u028b\11\121\1\112\2\0"+
+    "\42\121\14\0\1\u093f\37\0\1\u093f\73\0\1\u0940\37\0"+
+    "\1\u0940\67\0\1\u0483\123\0\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u08c7\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0941\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u0730\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0942\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0943\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u0944\20\121\1\112"+
+    "\10\0\1\u0945\5\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\3\121\1\u06bd\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\1\121\1\u0946\4\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0947\2\121\1\u0948\1\121\1\u0949\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u06c9\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\3\121\1\u094a\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\15\121\1\u094b\24\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u094c\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u094d\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u094e\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u094f\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0950\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0951\2\121\1\u0273\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0952\1\121\1\u0953\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0304\3\121\1\112\2\0"+
+    "\24\121\1\u0341\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u033a\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0954\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u0955"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0956\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0957\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0958\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0959\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u095a\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0282\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u095b\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\36\121\1\u0824\3\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0282\3\121\1\112"+
+    "\2\0\6\121\1\u095c\33\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u095d\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u095e\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u095f"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0960\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u075f\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u095e\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0961\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u05fe\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u0962\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0963\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0964"+
+    "\1\121\1\0\4\121\14\0\1\u0965\1\u0966\1\u0967\1\u0968"+
+    "\1\u0969\1\u096a\1\u096b\1\u096c\1\u096d\1\u096e\1\121\1\112"+
+    "\2\0\1\u0827\21\121\1\u096f\2\121\1\u0970\2\121\1\u0971"+
+    "\2\121\1\u05ae\2\121\1\u0972\3\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0973\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0974\1\u0975\1\u0976\1\u0977\1\u0978"+
+    "\1\u0979\1\u097a\1\u097b\1\u0956\1\u097c\1\112\2\0\6\121"+
+    "\1\u097d\11\121\1\u097e\1\121\1\u097f\1\u02f3\1\u0980\1\u0981"+
+    "\4\121\1\u0982\6\121\1\u0983\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0304\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0984\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0985\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0986\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0987"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0988\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0989\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u098a\5\121\1\112"+
+    "\2\0\24\121\1\u098b\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u098c\1\121\1\112\2\0\24\121\1\u098d\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u098e\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u098f\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0990\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0427\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0991\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0992\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0993\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0994\3\121\1\112\2\0\30\121\1\u0995"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0996\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0997\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0998\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0999\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u099a\1\121"+
+    "\1\u099b\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u099c\1\121\1\u099d\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u099e\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u099f\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u09a0\1\121\1\u09a1\3\121\1\112\2\0\23\121"+
+    "\1\u09a2\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u09a3\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u09a4\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u09a5\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u09a6\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u09a7"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u06de\1\u09a8\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u09a9"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u09aa\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u09ab\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u09ac\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u09ad\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u09ae\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u09af\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u05ea\1\121\1\u09b0\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u09b1\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u09b2"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u09b3\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\31\121\1\u0304\10\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u04e6\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u09b4"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u09b5\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u09b6\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u09b7\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u09b8"+
+    "\10\121\1\112\2\0\22\121\1\u09b9\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u09ba\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u09bb\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u09bc\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u09bd\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u09be\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u048c\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u075f\1\u048c\7\121\1\u048c"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u04b3\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u09bf\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u01fe\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u09c0\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u07cb\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u09c1\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u09bd\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u09c2\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u04de\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u09c3\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u09c4"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u09c5\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0730\3\121\2\u02c5\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u09c6\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u05f6\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u034c\1\121"+
+    "\1\u09c7\1\121\1\u09c8\6\121\1\112\2\0\22\121\1\u09c9"+
+    "\7\121\1\u09ca\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u09cb\1\u09cc\6\121\1\112\2\0\23\121\1\u09cd\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u09ce\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u09cf"+
+    "\3\121\1\112\2\0\6\121\1\u04ac\14\121\1\u04f3\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u038b\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u09d0\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u04b3\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u09d1\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u02de\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u04e7\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u02e8\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0763\2\121\1\112\2\0\22\121\1\u01fe"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0316\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u01fe"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u09d2\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u09d3\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u09d4\1\u09d5\1\121\1\u09d6"+
+    "\1\u09d7\1\121\1\u09d8\1\u09d9\1\u09da\1\u09db\1\121\1\112"+
+    "\2\0\1\u09dc\21\121\1\u09dd\2\121\1\u09de\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u09df\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u04f3\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u09e0\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u09e1\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u09e2\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u09e3\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u09e4"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u09e5\6\121\1\112\2\0\22\121\1\u080b\7\121"+
+    "\1\u059e\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u09bd"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u09e6\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\31\121\1\u0300\10\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u09e7\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u09e8\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u09e9\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u09ea\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u09eb"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u09ec\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u09ed\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u09ee\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u09ef\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u098f\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u09f0\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u09f1\2\121\1\u09f2\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u09f3\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u07bf"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u09f4\1\121\1\0\4\121\14\0"+
+    "\1\u04df\12\121\1\112\2\0\22\121\1\u051a\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0652\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u074e\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u09f5"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u09f6\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u09f7\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u09f8\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u09f9\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0344\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u09fa\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u09fb\1\121\1\u09fc\1\u09fd\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u09fe\2\121\1\112\2\0\25\121\1\u027b\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u09ff"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0a00\11\121\1\112"+
+    "\2\0\24\121\1\u0a01\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0a02\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0792\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0a03\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0a04\2\121\1\u0653\4\121"+
+    "\1\u0a05\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u051a\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0708\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0a06\1\u070d\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\1\u0719\41\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u05fa\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0a07\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u02fc\1\121\1\u0a08"+
+    "\4\121\1\112\2\0\6\121\1\u0173\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\30\121\1\u05b5\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u04ef\7\121\1\u0a09"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0a0a\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0a0b\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0a0c\3\121\1\u0a0d\3\121"+
+    "\1\u0a0e\2\121\1\112\2\0\26\121\1\u0a0f\13\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0383\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0776\4\121\1\112"+
+    "\2\0\1\u02c5\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\21\121\1\u0173\3\121\1\u0a10\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0343\2\121\1\u0a11\1\112"+
+    "\2\0\23\121\1\u0396\1\121\1\u09a9\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u040b\3\121\1\112\2\0\20\121"+
+    "\1\u0a12\21\121\1\112\10\0\6\121\1\0\5\121\1\u0611"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u0a13\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u048b\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0a14\1\121"+
+    "\1\0\4\121\14\0\6\121\1\u01dc\1\121\1\u0a15\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\27\121\1\u0120\12\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u02f3\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u017c\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0a16\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0a17\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0a18\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u04ef\6\121\1\u04ef\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u0a19\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u04b0\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0a1a\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0a1b"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0a1c\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\33\121\1\u0a1d\6\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0a1e\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0a1f"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0a20\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u05c4\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0a21\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0a22\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0a23\2\121"+
+    "\1\u0a24\1\u0a25\3\121\1\112\2\0\23\121\1\u0a26\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0a27\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0a28\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0424\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u053e\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0a29\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0a2a\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u078e\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0729\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0a2b\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0a2c\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0a2d\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0a2e\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0a2f\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0a30\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u03b8\1\121\1\u0a31\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0a32\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u04ac\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0a33"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0a34\1\u0a35\1\u0a36\1\u0a37\1\u0a38\1\u03c4\1\u040b\1\u0a39"+
+    "\1\u0a3a\1\121\1\112\2\0\6\121\1\u0a3b\11\121\1\u072f"+
+    "\1\121\1\u0a3c\1\121\1\u0a3d\1\u0a3e\13\121\1\u0a3f\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0a40\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0a41\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0a42\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0a43\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0a44\6\121\1\112\2\0"+
+    "\23\121\1\u0a45\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u0875\1\u0a46\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0a47\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u04b3\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0a48\1\121\1\0\4\121\14\0\10\121\1\u078f"+
+    "\2\121\1\112\2\0\22\121\1\u0a49\1\u0730\16\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0a4a\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u03b8\4\121\1\u0a4b"+
+    "\3\121\1\112\2\0\21\121\1\u01fe\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u07a6\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0730\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u04b3"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u0a4c\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0333\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0a4d\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u042a\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0a4e\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u07aa\4\121\1\112\2\0\6\121\1\u04ac"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0a4f\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0a50\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u0a51\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0a52\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0a53\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0a54\7\121"+
+    "\1\112\2\0\30\121\1\u0a55\11\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0a56\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0a57\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0a58\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0a59"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u09a2\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0a5a\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u0a5b\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0a5c"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0a5d\10\121\1\112\2\0\1\u0a5e\41\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0a5f\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0383\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0a60\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0a61\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0a62\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u05f7\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0a63\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0a64\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0a65\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0a66\17\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0a67\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u081a\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0729\3\121\1\112\2\0\6\121"+
+    "\1\u0a68\14\121\1\u0a69\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u04b3\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0a6a\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\u042a"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0760\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0a6b\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0a6c\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0a6d\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0a6e\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0a6f\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0a70\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0a71\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0a72\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0a73\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u01fe"+
+    "\1\121\1\u02c6\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0a74\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0a75\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0a76\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0a77\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0a75\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0a77\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0a78\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0953\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0a79\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0a7a\1\u0a7b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0a7c\6\121\1\112"+
+    "\2\0\23\121\1\u0a7d\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0a7e\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0a7f\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0a80\2\121\1\u0a81\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0a82\4\121\1\112\2\0\23\121\1\u0a83\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0a84\1\121\1\u0a85"+
+    "\5\121\1\u0a86\1\112\2\0\22\121\1\u05f7\17\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0a87\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0a88\2\121\1\u0a89"+
+    "\3\121\1\112\2\0\23\121\1\u0a8a\16\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0a8b\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u084e"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0a8c\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0a8d\5\121\1\u0a8e\1\121\1\112\2\0\24\121\1\u0a8f"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0a90\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0a91\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0a92\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0a93\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u02de\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0a94"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0a95\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0a96\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0a97\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0a98"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0a99\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0a9a\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u02e8\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0a9b"+
+    "\1\121\1\u0a9c\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0a9d\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0a9e\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0a9f"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0aa0\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0aa1\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0aa2\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0aa3\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0aa4\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0aa5\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0aa6\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u0aa7"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0aa8\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0aa9\1\0\1\112\1\u0108\1\u0aaa"+
+    "\1\121\1\0\4\121\14\0\1\u0aab\2\121\1\u0aac\1\u090a"+
+    "\6\121\1\112\2\0\1\u018b\21\121\1\u0aad\1\u02f3\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0aae\4\121\1\u0824"+
+    "\3\121\1\112\2\0\24\121\1\u0aaf\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0ab0\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0ab1\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0396\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0ab2\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0ab3\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0ab4\12\121\1\112\2\0"+
+    "\23\121\1\u031c\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u0ab5\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u0ab6\1\121\1\112\2\0\24\121\1\u0ab7"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0ab8\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0ab9\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0424\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u04b3"+
+    "\1\121\1\0\4\121\14\0\4\121\1\u0aba\1\u01fe\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0abb\1\121\1\u0abc\4\121\1\u0abd\2\121\1\112\2\0"+
+    "\6\121\1\u0abe\23\121\1\u0abf\7\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\30\121\1\u01fe\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0304\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0ac0\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0ac1\1\u0ac2\10\121\1\112\2\0\22\121\1\u018e\1\u02f3"+
+    "\1\u0ac3\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0730"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0ac4\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0ac5\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0ac6"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\21\121"+
+    "\1\u0ac7\20\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0ac8"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0ac9\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0aca\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0acb\3\121\1\u0acc\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u0acd\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0ace\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u064d\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0acf\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0ad0\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u05f9\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0ad1\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0ad2\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0a7a\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0ad3"+
+    "\6\121\1\112\2\0\23\121\1\u0a7d\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0ad4\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0ad5\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0ad6\1\u0ad7"+
+    "\7\121\1\112\2\0\25\121\1\u0ad8\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0ad9\12\121\1\112\2\0\23\121\1\u0ada"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0adb\1\121"+
+    "\1\u0adc\1\121\1\u0add\3\121\1\u0ade\1\112\2\0\21\121"+
+    "\1\u0836\1\u05f7\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0adf\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0ae0\4\121\1\112\2\0\23\121\1\u0ae1"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0ae2\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0ae3\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0ae4\6\121\1\u0ae5\3\121\1\112\2\0\23\121\1\u0ae6"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0ae7\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0ae8\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0ae9\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u0aea\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0aeb\6\121\1\112"+
+    "\2\0\25\121\1\u0aec\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0aed\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0aee\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0aef\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u0af0\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0af1\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0af2\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0af3\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0af4\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0af5\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0af6\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0af7\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u02de\2\121\1\u0af8"+
+    "\2\121\1\112\2\0\22\121\1\u0af9\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0afa\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0afb\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u03f3\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0afc\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0afd\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0afe\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0aff\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u048c\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u0b00\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0b01\5\121\1\u0b02\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0b03\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0b04\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\36\121\1\u0b05\3\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\u08b1"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0b06\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0b07\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u0b08\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0b09"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\1\112\1\u0b0a\4\112\1\0\1\112\4\u0b0a"+
+    "\1\112\1\0\4\112\1\0\2\112\2\u0b0a\14\0\4\112"+
+    "\3\u0b0a\5\112\2\0\1\112\1\u0b0a\5\112\1\u0b0a\6\112"+
+    "\1\u0b0a\1\112\1\u0b0a\1\112\1\u0b0a\2\112\1\u0b0a\5\112"+
+    "\3\u0b0a\1\112\3\u0b0a\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0b0b\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0b0c\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0b0d\1\121\1\u0b0e\1\u0b0f"+
+    "\1\121\1\112\2\0\25\121\1\u0b10\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0b11\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0b12"+
+    "\17\121\1\112\10\0\6\121\1\0\5\121\1\u0b13\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0b14"+
+    "\2\121\1\112\2\0\21\121\1\u0b15\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0b16\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0b17\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0b18\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0b19\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u0b1a\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0b1b"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u07d5\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0b1c"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0b1d\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0b1e\1\121\1\u0b1f\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0b20\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0b21\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0b22\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0163\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0b23\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0b24"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0b25\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0b26\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0b27\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u0b28\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0b29\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0b2a\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0611\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0b2b"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0b2c\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0b2d\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0b2e\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0b2f"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0b30\10\121\1\112\2\0\22\121\1\u0b25\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0b31\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0b32\1\121"+
+    "\1\u0b33\1\u0b34\1\u0b35\1\u0b36\1\u0b37\1\u0b38\1\u0b39\1\u0775"+
+    "\1\121\1\112\2\0\1\u0b3a\21\121\1\u0b3b\1\u02f3\1\u0b3c"+
+    "\1\u0b3d\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0b3e"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0b3f\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u049c\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0b40\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u0b41\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0b42\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0b43\1\u06b0\5\121\1\u0886\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0b44\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0b45"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0b46\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0b47\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0b48\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\35\121\1\u0484\4\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u018c\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u07a2\2\121\1\112\2\0\23\121"+
+    "\1\u04b3\1\u02de\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0a4f"+
+    "\1\u0b49\2\121\1\u0b4a\3\121\1\u0b4b\2\121\1\112\2\0"+
+    "\6\121\1\u0b4c\13\121\1\u0b4d\4\121\1\u04da\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0b4e\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0b4f\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0b50\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0b51\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0b52\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0b53\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0b54\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u0b55\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0b56\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u0b57\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0588\3\121\1\112"+
+    "\2\0\25\121\1\u0315\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u075f\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u051a\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0b58"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0b59\1\121\1\0\4\121\14\0\3\121\1\u0345\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u042a"+
+    "\12\121\1\112\2\0\23\121\1\u0a09\1\121\1\u0b5a\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0b5b\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0b5c"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0a4f\1\121\1\u0b5d\1\u0b5e\2\121\1\u0b5f\1\u0b60\1\u0b61"+
+    "\2\121\1\112\2\0\22\121\1\u0b62\1\121\1\u0836\1\u0b63"+
+    "\1\121\1\u0b64\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0b65\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u07bf\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0b66\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0b67\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0b68\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0b69\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0b6a\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0b6b\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0b6c\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0b6d\7\121\1\112\2\0\30\121\1\u05b5\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0b6e\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0b6f\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0963\1\u08d2\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0343\3\121\1\112\2\0\23\121"+
+    "\1\u0b70\16\121\1\112\10\0\6\121\1\0\5\121\1\u0b71"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0b72\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0730\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0b73\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0b74\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0b75"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0b76\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0b77\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0b78\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0b79\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u0b7a\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0b7b\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u02b1\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0b7c\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0b7d\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0b7e\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u08c7\6\121\1\112\2\0"+
+    "\23\121\1\u0b6c\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0b7f"+
+    "\2\121\1\u0b80\1\u0b81\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0b82"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0b83\1\121"+
+    "\1\u0b84\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0b85\4\121\1\112\2\0\22\121\1\u080b"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0b86\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u08d5"+
+    "\1\u0343\3\121\1\112\2\0\23\121\1\u0b87\16\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0b88\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0b89\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0b8a"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0b8b\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0b8c\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0318\3\121\1\112"+
+    "\2\0\1\u0319\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0729\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0b8d\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0b8e\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0b8f\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0b90\4\121\1\u0b91\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0b92\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0b93\1\u0b94"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u0b95\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u031c\4\121\1\u0b96\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0b97\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0b98\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0b99\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0b9a"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0b9b\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0b9c\3\121\1\112\2\0\6\121\1\u0b9d\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u0b9e"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u0b9f\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u0ba0"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0ba1\1\u0ba2\1\u0ba3\1\u0ba4\1\u0ba5\1\u0ba6\1\u0ba7"+
+    "\1\u0ba8\1\u0ba9\1\121\1\112\2\0\20\121\1\u0baa\1\121"+
+    "\1\u0bab\1\121\1\u0bac\1\u0bad\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0bae\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u05fb\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0baf\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u087f"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u06b0\4\121\1\u0bb0\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u04ee\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0bb1"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0935\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0bb2\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0bb3\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0bb4\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0562"+
+    "\10\121\1\112\2\0\24\121\1\u04ee\2\121\1\u0795\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u02c9\5\121\1\112"+
+    "\2\0\6\121\1\u0bb5\15\121\1\u051a\1\u0bb6\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0bb7\2\121\1\u0bb8\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0bb9\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0331\7\121\1\112\2\0\22\121\1\u0bba"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0bbb\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u033a\1\121\1\u033b\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0bbc\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0bbd\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0bbe\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0bbf\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0bc0\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0bc1\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0bc2\1\121\1\0\4\121\14\0\1\121\1\u0bc3\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u027f\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0bc4\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u02f0\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0bc5\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u0bc6\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0bc7\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0bc8\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\30\121"+
+    "\1\u0bc9\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0774"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0bca\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0bcb\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0bcc\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0bcd"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0bce\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0bcf\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0bd0\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0bd1\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0302\5\121\1\u0989\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0bd2"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0bd3\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0bd4\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\30\121\1\u0bd5\11\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u05f9\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0bd6\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0bd7\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u06de"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0bd8\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0bd9\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0b4b\2\121\1\u0bda\1\u0bdb\2\121"+
+    "\1\u0bdc\1\u0bdd\1\121\1\112\2\0\20\121\1\u0bde\1\121"+
+    "\1\u0bdf\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0774"+
+    "\6\121\1\112\2\0\24\121\1\u0be0\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0be1\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0be2\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0be3\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0be4\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0be5\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0be6"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0be7\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0820\3\121\1\112\2\0\27\121\1\u04da\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0be8\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0be9\16\121\1\u0bea\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0bdb\1\121\1\u0941\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u048b\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0beb\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u05a1\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0bec\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0bed\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0bee\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0bef\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0bf0\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0bf1\16\121\11\0\5\262\1\u0bf2\1\0\6\262\6\0"+
+    "\4\262\14\0\2\262\1\u0bf2\10\262\3\0\42\262\2\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\5\53"+
+    "\1\u022e\17\53\1\0\23\53\1\0\10\53\1\u022e\33\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\14\53"+
+    "\1\77\10\53\1\0\23\53\1\0\30\53\1\77\13\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\17\53"+
+    "\1\u0bf3\5\53\1\0\12\53\1\u0bf3\10\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\17\53"+
+    "\1\u0254\5\53\1\0\12\53\1\u0254\10\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\5\53"+
+    "\1\u0bf4\17\53\1\0\23\53\1\0\10\53\1\u0bf4\33\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\23\53\1\0\2\53\1\302\20\53\1\302\20\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\17\53"+
+    "\1\u0681\5\53\1\0\12\53\1\u0681\10\53\1\0\44\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\23\53\1\0\2\53\1\u0258\20\53\1\u0258\20\53"+
+    "\1\0\1\53\1\0\2\53\2\0\6\53\1\0\25\53"+
+    "\1\0\23\53\1\0\5\53\2\u0bf5\35\53\1\0\1\53"+
+    "\1\0\2\53\2\0\3\53\1\373\2\53\1\0\25\53"+
+    "\1\0\6\53\1\373\14\53\1\0\42\53\15\0\1\u0bf6"+
+    "\47\0\1\u0bf6\46\0\1\112\10\0\1\112\1\121\4\112"+
+    "\1\0\1\112\4\121\1\112\1\0\4\112\1\0\2\112"+
+    "\2\121\14\0\4\112\3\121\5\112\2\0\1\112\1\121"+
+    "\5\112\1\121\6\112\1\121\1\112\1\121\1\112\1\121"+
+    "\2\112\1\121\5\112\3\121\1\112\3\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0bf7\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0bf8\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u027d\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0bf9\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u069e\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0357\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0bfa\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0bfb\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u06c5\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u046d\15\121\1\112\10\0\6\121\1\0\5\121\1\u027f"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\15\0\1\u0bfc\47\0\1\u0bfc\63\0"+
+    "\1\u0bfd\47\0\1\u0bfd\46\0\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u08c9\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\36\121\1\u02c5\3\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0bfe\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u075f\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\1\u06bd\5\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\5\121\1\u0bff"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u0c00\13\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0702\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0c01\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\1\u0c02\5\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\2\121\1\u0c03\37\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0114\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0c04\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0c05\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0c06\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0c07\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0c08\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u01fe\3\121\1\112\2\0"+
+    "\25\121\1\u095e\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0c09\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u03e1\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0c0a"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u06c7\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0c0b"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0c0c\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0c0d\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0c0e\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u095e"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0c0f\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u02f5\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u095d\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u06d7"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0c10\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0c11\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u0c12"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u031c\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0c13\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0c14\2\121\1\112\2\0\24\121\1\u0c15"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u017c\5\121\1\u0c16"+
+    "\4\121\1\112\2\0\25\121\1\u0c17\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0c18\1\u0c19\7\121\1\112\2\0"+
+    "\26\121\1\u0c00\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0c1a\6\121\1\112\2\0\23\121\1\u0a7d\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0c1b\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0c1c\1\121\1\u0c1d"+
+    "\10\121\1\112\2\0\23\121\1\u0c1e\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0717\3\121\1\u0c1f\3\121\1\112"+
+    "\2\0\24\121\1\u0c20\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0c21\5\121\1\u0c22\4\121\1\112\2\0\23\121\1\u0c23"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0c24\1\121"+
+    "\1\u0c25\1\121\1\u0c26\4\121\1\112\2\0\26\121\1\u01fe"+
+    "\1\121\1\u01fe\11\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0c27\1\121\1\u0c28\2\121\1\112\2\0\23\121\1\u0c29"+
+    "\1\u038b\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0c2a"+
+    "\6\121\1\u0c2b\1\112\2\0\23\121\1\u0c2c\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0c2d\1\121\1\u0c2e\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u04f3\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u0727\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u02c5\1\121\1\u0c2f\10\121\1\112"+
+    "\2\0\24\121\1\u0c30\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0c31\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0c32\11\121\1\u0c33\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0c34\1\u0c35\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0c36\7\121\1\112\2\0\30\121\1\u0c37\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0c38\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0c39\1\121"+
+    "\1\u0c3a\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0c3b\5\121\1\u0c3c\1\121\1\u0c3d\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0c3e"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0c3f\1\121\1\u0c40\6\121\1\112\2\0\22\121\1\u0c41"+
+    "\1\u02b1\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0c42"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0c43\5\121\1\u0c44\1\121\1\u0c45\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0c46\5\121\1\u0c47"+
+    "\4\121\1\112\2\0\23\121\1\u0c48\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0c49\3\121\1\u0c4a\2\121\1\u0c4b"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0c4c\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0c4d\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0c4e\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u0611\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0c4f\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u051a\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0c50\1\u0c51\1\u0c52\1\u0c53\1\u0c54\1\u0c55"+
+    "\1\121\1\u0c56\1\u0c57\1\121\1\112\2\0\1\u0c58\5\121"+
+    "\1\u0c59\11\121\1\u0c5a\1\121\1\u0c5b\1\121\1\u0c5c\1\u0c5d"+
+    "\4\121\1\u059e\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0c5e\6\121\1\u0c5f\2\121\1\112\2\0\6\121\1\u0c60"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0c61\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u0c62\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u07cb\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0c63\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0c64\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u04f6\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0c65\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0c66"+
+    "\1\121\1\0\4\121\14\0\6\121\1\u0c67\4\121\1\112"+
+    "\2\0\20\121\1\u0c68\1\121\1\u0c69\2\121\1\u0c6a\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0c6b\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u03e1"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0c6c\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0c6d\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0c6e\2\121\1\112"+
+    "\2\0\32\121\1\u0c6f\7\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0c70\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0c71\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0c72\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0c73"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0c74\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0c75\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0c76\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0c77"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0c78\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0c79\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0c7a\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0c7b"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0c7c\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0c7d\5\121\1\u0c7e\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0c7f\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\36\121\1\u0c80\3\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u09f8\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0c81\5\121\1\112\2\0"+
+    "\22\121\1\u0c82\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0c83\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0c84\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0c85\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u04ac\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0c86"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0c87\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0c88\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0c89\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u063f\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0c8a\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0c8b\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0c8c\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0c8d\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0c8e"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u0c8f\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0c90\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0c91\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0730\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u03fe\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u0c92\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u078d\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0c93\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0c94"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u031e\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u018c\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0c95\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0c96\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0c97\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0a29\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0383\1\121\1\u0774\10\121\1\112"+
+    "\2\0\27\121\1\u0a9d\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0c98\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0c99\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0c9a\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0774"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0983\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0c9b\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0c9c\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0c9d\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0c9e\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0319\1\121\1\112\2\0\1\u0c9f"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0ca0\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0983\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\27\121\1\u0ca1\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0ca2"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0ca3\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0ca4\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0ca5\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0ca6\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0ca7\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0ca8\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u0ca9\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0caa"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0cab\1\121"+
+    "\1\u0cac\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0cad\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0cae\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0caf\3\121"+
+    "\1\112\2\0\23\121\1\u0cb0\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0cb1\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0cb2\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0cb3\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0cb4\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u0cb5\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0cb6\11\121\1\112\2\0\24\121\1\u04ee"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0cb7\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u0cb8\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\30\121\1\u0cb9\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0cba"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0a94\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0cbb\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0cbc\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0cbd\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0cbe\1\121\1\0\4\121\14\0\6\121\1\u0cbf\4\121"+
+    "\1\112\2\0\22\121\1\u0a2c\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0cc0\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0cc1\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0cc2\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0cc3\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0cc4\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0cc5\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0cc6\3\121\1\u0588\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0cc7\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0495\1\121\1\0\4\121"+
+    "\14\0\10\121\1\u0cc8\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\33\121\1\u0cc9"+
+    "\6\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0730\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0cca\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u064b\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0ccb\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0ccc\3\121\1\u0ccd"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0cce\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0ccf\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0cd0\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0cd1\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u0cd2\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0cd3\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u02f0\2\121\1\112\2\0\22\121\1\u0507\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0cd4\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0cd4"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0cd5\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0cd6\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u0cd7\41\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0383\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0cd8\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0218\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0304\10\121\1\112\2\0\31\121\1\u0304"+
+    "\10\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0cd9\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0cda\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0cdb\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u04f3\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u018c\16\121\1\u0315\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0cdc\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0cdd\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0cde\1\121\1\u0cdf\1\u0ce0"+
+    "\4\121\1\112\2\0\23\121\1\u04a6\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0ce1\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0ce2\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0b9d\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0ce3\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0ce4\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0ce5\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0ce6\2\121\1\u0ce7\1\121\1\u0ce8"+
+    "\2\121\1\u0ce9\1\u0cea\1\121\1\112\2\0\1\u0ceb\5\121"+
+    "\1\u0cec\12\121\1\u0ced\1\u0cee\2\121\1\u0cef\1\121\1\u0cf0"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0cf1\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0cf2\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0cf3\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0cf4\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0cf5"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0a2c\2\121\1\u0cf6\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0cf7\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0cf8\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0cf9\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0cfa\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0cfb\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u04ad\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0cfc"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0cfd\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u0cfe\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u04f6\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0cff\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0d00\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0d01\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0d02"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0545\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0d03\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0d04\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0d05\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0d06\1\121\1\112\2\0\24\121\1\u0d07\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0d08\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0d09"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\34\121\1\u0d0a\5\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0d0b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0d0c\7\121\1\112"+
+    "\2\0\30\121\1\u0d0d\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0d0e\2\121\1\u0d0f\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0d10\1\121\1\u0d11\1\121"+
+    "\1\u0d12\4\121\1\112\2\0\23\121\1\u02b1\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0d13\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0d14\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0343\3\121\1\112\2\0\23\121\1\u0d15\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0d16\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0812\6\121"+
+    "\1\112\2\0\24\121\1\u0d17\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\41\121\1\u0d18\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0d19\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0d1a\1\121\1\0\4\121\14\0\1\u0d1b\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0d1c"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\30\121\1\u0d1d\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0d1e\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0d1f\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0379"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0d20\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0d21\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u078f\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0d22\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0d23\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0d24\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0d25\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0d26\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u07ad\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0611\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0d27\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0651"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0d28\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u0d29\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0d2a\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0d2b"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0d2c\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0d2d\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u0d2e\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u03b2\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0d2f\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0d30\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u0a62\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u02de\3\121\1\u01fe\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0d31\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u09f8\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0d32\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0d33\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0d34\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0956\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0d35\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0d36\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\21\121\1\u0d37\20\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u06b2\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u0d38\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u0d39"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0d3a\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0d3b\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u08a7\1\u0d3c\1\u0d3d\1\u0594\1\121\1\u0d3e\2\121"+
+    "\1\112\2\0\22\121\1\u0d3f\1\121\1\u0d40\1\u0d41\4\121"+
+    "\1\u059e\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0d42\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0d43\3\121\1\112\2\0\6\121\1\u0d44\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\32\121"+
+    "\1\u0d45\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0d46\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\32\121\1\u059e\7\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0c12\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0d47\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0767\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0c7c\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u0d48\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0d49\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u03ca\4\121"+
+    "\1\u0760\2\121\1\112\2\0\1\u018b\21\121\1\u018e\1\u02f3"+
+    "\1\121\1\u0656\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0d4a\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0d4b\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u0d4c"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0d4d\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u02e8\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u0d4e\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0d4f"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0d50\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u0d51\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u0d52\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0d53"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0d54\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0d55\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0d56\4\121\1\112\2\0\23\121\1\u0d57"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0d58\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0d59\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0d5a\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0d5b\1\u0d5c\1\u0d5d\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0d5e\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0d5f\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0d60\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0d61\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0d62\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\30\121\1\u0d63\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0d64\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0d65\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0d66\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\27\121\1\u0d67\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0d68"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0d69\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u048c\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0d6a\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0d6b\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u07fd\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0d6c\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u02b1"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0d6d\1\121\1\0\4\121"+
+    "\14\0\7\121\1\u0d6e\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0304"+
+    "\17\121\1\112\10\0\6\121\1\0\5\121\1\u0d6f\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0d70\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0d71\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0d72\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0d73\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0d74\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0d75\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0d76\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0d77\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0387\15\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0aa9\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0aab\1\121\1\u02ed\1\u0d78\1\u090a\3\121\1\u02f0\2\121"+
+    "\1\112\2\0\1\u018b\21\121\1\u0aad\1\u02f3\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u0bd5"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0d79\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0d7a\3\121\1\u0343\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0d7b"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0d7c\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u07d5\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0d7d\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0d7e\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0d7f\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0d80\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0d81\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0d82\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\26\121\1\u0d83"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0d84\2\121\1\u0a9d\12\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0d85\1\121\1\0"+
+    "\4\121\14\0\3\121\1\u08de\1\121\1\u0d86\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u04b4"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0d87\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0374\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0d88\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0875"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0d89\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0d8a\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0d8b\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0d8c\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0d8d"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0a9f\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0a4f\10\121\1\u0d8e\1\121\1\112\2\0\22\121"+
+    "\1\u0d8f\4\121\1\u04da\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u075f\1\121\1\0\4\121"+
+    "\14\0\10\121\1\u01fe\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0d90\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0d91\7\121\1\u07a2\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0d92"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0d93\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0d94\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0d95\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0d96\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u0d97\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0d98\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0d99"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0d9a\2\121"+
+    "\1\u0767\1\u0d9b\1\u0d9c\1\121\1\u0d9d\2\121\1\112\2\0"+
+    "\1\u0d9e\41\121\1\112\10\0\6\121\1\0\5\121\1\u02fc"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0d9f"+
+    "\1\u0da0\1\u0da1\1\121\1\u0da2\3\121\1\u0da3\2\121\1\112"+
+    "\2\0\6\121\1\u0da4\12\121\1\u0da5\1\u0da6\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0da7\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0da8\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0c62"+
+    "\2\121\1\112\2\0\22\121\1\u0383\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0da9\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0daa\4\121\1\u0dab"+
+    "\3\121\1\112\2\0\24\121\1\u0dac\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0dad\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0dae\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0daf\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0db0\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0db1\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0db2\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0db3"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u0304\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0db4\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0db5\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\21\121\1\u0db6\20\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u0db0\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0db7\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0ae1\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0db8"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u04ac\12\121\1\112\2\0\23\121\1\u0db9\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0dba"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0dbb\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\1\u01fe\41\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0dbc\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0dbd\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0dbe"+
+    "\15\121\1\112\10\0\6\121\1\0\5\121\1\u0dbf\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0323"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0dc0\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0dc1\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0dc2\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0dc3\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0dc4\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0dc5\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0dc6\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0dc7\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u048f\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0dc8\6\121\1\112\2\0\22\121\1\u0dc9"+
+    "\2\121\1\u0cd8\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0dca\16\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0dcb\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u02c6\1\u0dcc\2\121\1\u0dcd\1\121"+
+    "\1\u0dce\1\u0dcf\1\121\1\112\2\0\22\121\1\u0dd0\1\u0dd1"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0dd2\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u08b1\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0dd3\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0dd4\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0b74\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0dd5"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0dd6\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0dd7\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0dd8\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0dd9"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0dda\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u03e1\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0ddb\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0ddc"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0ddd\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u0dde\1\112\2\0\42\121\1\112\10\0"+
+    "\1\112\1\u0ddf\4\112\1\0\1\112\4\u0ddf\1\112\1\0"+
+    "\4\112\1\0\2\112\2\u0ddf\14\0\4\112\3\u0ddf\5\112"+
+    "\2\0\1\112\1\u0ddf\5\112\1\u0ddf\6\112\1\u0ddf\1\112"+
+    "\1\u0ddf\1\112\1\u0ddf\2\112\1\u0ddf\5\112\3\u0ddf\1\112"+
+    "\3\u0ddf\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0de0\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u04ac\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u0de1\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0de2\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0de3\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0de4\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0de5\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0de6\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0de7\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0de8"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0de9\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0dea\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0c21\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0deb"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0dec\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\32\121\1\u0ded\7\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0dee\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0def\13\121\1\u0df0\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0b1c\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0dee\10\121\1\112\2\0\24\121"+
+    "\1\u02c5\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0df1\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u0df2\11\121\1\112\2\0\21\121\1\u0df3\1\u0507"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0df4\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0df5\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0df6\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0df7"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0df8\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0df9\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0dfa\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0dfb\1\121\1\u0dfc\1\u07a5\3\121"+
+    "\1\u0345\1\121\1\u07a6\1\121\1\112\2\0\1\u04d3\21\121"+
+    "\1\u0a09\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0dfd\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u0dfe\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0dff\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0e00\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u0e01\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0e02\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0e03\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0e04\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0e05\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0e06"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0e07\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u0e08\1\u0c37"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0e09\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u0e0a\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0e0b\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0e0c\10\121\1\112\2\0\24\121"+
+    "\1\u0e0d\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0e0e"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0e0f\3\121\1\u0343\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0e10\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0e11"+
+    "\1\121\1\u0e12\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0e13\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u0e14\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u07f1\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0e15\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0e16\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0e17\1\u0e18\1\u0e19\1\u0e1a\1\u0e1b"+
+    "\1\u0e1c\1\u0594\1\u0e1d\1\u0e1e\1\u0e1f\1\121\1\112\2\0"+
+    "\22\121\1\u0e20\1\121\1\u0e21\1\u0e22\4\121\1\u059e\7\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0e23\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u02fb\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0735\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0e24\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0e25\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0e26\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0e27\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0e28\7\121\1\112\2\0\30\121"+
+    "\1\u05b5\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0e29"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0e2a\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0343\3\121\1\112\2\0\23\121\1\u0e2b"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0e2c\1\121\1\0\4\121\14\0\2\121\1\u0e2d"+
+    "\1\121\1\u0e2e\1\121\1\u0e2f\2\121\1\u0e30\1\121\1\112"+
+    "\2\0\22\121\1\u0e31\2\121\1\u0e32\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u0e33\11\121\1\112\2\0\22\121"+
+    "\1\u0e34\1\u0e35\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0942\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0e36\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u0e37\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0e38\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0e39\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0e3a\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0e3b\3\121\1\u0653\4\121\1\u0e3c\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0e3d\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u0abd\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u06f8\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u04b4\4\121\1\112\2\0"+
+    "\24\121\1\u0e3e\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0e3f\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0e40\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0e41\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0e42\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u09bd"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u02c5\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0e43\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0c3f\3\121\1\u02f5\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0e44\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0812\6\121\1\112\2\0\23\121\1\u0c21"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u048c\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0e45\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0e46\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0e47\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u0a33\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0e48"+
+    "\4\121\1\112\2\0\20\121\1\u072f\1\121\1\u0e49\7\121"+
+    "\1\u059e\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0e4a"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0e4b\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0e4c\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0318\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0e4d\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0e4e\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0b90\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0e4f\3\121\1\112\2\0"+
+    "\6\121\1\u0e50\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u0e51\33\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0e52\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u04ef\2\121";
+
+  private static final String ZZ_TRANS_PACKED_2 =
+    "\1\u0653\3\121\1\u04ef\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0e53\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0e54\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0e55\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0e56\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0e57"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0e58\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u08b5\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0e59\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0e5a\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u042a\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u0e5b\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0e5c\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0e5d\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0e5e\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0e5f\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0e60\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0e61\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0e62\1\u0e63\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u031c"+
+    "\4\121\1\u0e64\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0e65\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0b9d\15\121\1\u05ab\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u0e66\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\1\u0e67\41\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0e68\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0e69\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0e6a\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0e6b\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0e6c\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0e6d\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0e6e\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0e6f\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0e70\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0e71\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u0e72\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0e73\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0e74\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u04f6\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0e75"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0e76\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0e77\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0e78\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0e79"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0e7a\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u0611\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0e7b"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u0e7c\2\121\1\u0e7d\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0e7e\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0e7f\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0e80\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0e81"+
+    "\6\121\1\112\2\0\23\121\1\u0b6c\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0847\7\121\1\112\2\0\30\121"+
+    "\1\u0e82\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0e83\2\121"+
+    "\1\u0d0f\1\u0e84\6\121\1\112\2\0\23\121\1\u0e85\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0191\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0e86\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0e87\1\121\1\u0e88\4\121\1\u0e89\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0e8a\7\121"+
+    "\1\112\2\0\22\121\1\u080b\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0e8b\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0e8c\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0e8d\3\121\1\112\2\0"+
+    "\23\121\1\u0e8e\16\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0b88\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0e8f\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0e90\4\121\1\112\2\0\23\121"+
+    "\1\u01fe\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0e91\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\1\u0730\41\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0e92\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u014e\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u02e9\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0e93"+
+    "\7\121\1\112\2\0\27\121\1\u0e94\12\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0e95\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0e96\1\121\1\u0e97\1\u0e98"+
+    "\1\121\1\u0e99\1\112\2\0\6\121\1\u0e9a\11\121\1\u0e9b"+
+    "\1\121\1\u0e9c\1\121\1\u0e9d\1\u0e9e\1\121\1\u04da\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u04f3\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0e9f"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0ea0\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0ea1\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0cfe\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0ea2"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0ea3\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0582\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0ea4\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0ea5\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u01fe\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0ea6\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0cf6"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u078d\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u0ea7\1\121\1\112\2\0\20\121\1\u0ea8\10\121\1\u0ea9"+
+    "\10\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0eaa\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0eab\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0eac\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u07fd\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u04e6\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0bc9"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0ead\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0eae\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0eaf\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0eb0\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0eb1\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0eb2\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0eb3\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0eb4\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0495\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u02de\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0eb5\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0eb6\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0eb7\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0171"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0eb8\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0eb9\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u04ef\1\121\1\u0eba\3\121"+
+    "\1\u040b\1\u0ebb\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0ebc\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0e28\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0ebd"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0ebe\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0ebf\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0ec0\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0d7a"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0ec1\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0ec2\6\121\1\112\2\0\24\121"+
+    "\1\u0be0\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0ec3"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0ec4\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0ec5\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0ec6\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0ec7\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0ec8\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0ec9\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0eca\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0ecb\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0ecc"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0ecd\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0ece\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0ecf\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\u0ed0\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u02fc\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u0ed1\5\121\1\112\2\0\42\121\2\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\14\53\1\u024e"+
+    "\10\53\1\0\23\53\1\0\30\53\1\u024e\13\53\1\0"+
+    "\1\53\1\0\2\53\2\0\6\53\1\0\25\53\1\0"+
+    "\23\53\1\0\2\53\1\304\20\53\1\304\20\53\1\0"+
+    "\1\53\1\0\2\53\2\0\4\53\1\u0ed2\1\53\1\0"+
+    "\25\53\1\0\17\53\1\u0ed2\3\53\1\0\42\53\16\0"+
+    "\1\u0ed3\37\0\1\u0ed3\55\0\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0ed4\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u027f\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0357\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0ed5\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u019a\6\121\1\112\2\0\42\121\16\0\1\u0ed6"+
+    "\37\0\1\u0ed6\73\0\1\u0ed7\37\0\1\u0ed7\55\0\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0ed8\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\3\121\1\u0ed9\2\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u09f8\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0eda\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\4\121\1\u0edb\1\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\7\121\1\u06bd\32\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0edc\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0edd\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0ede\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0edf\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u07cb"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0ee0\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0ee1\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u04b3\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0ee2\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u095e"+
+    "\1\121\1\u095d\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u0ee3\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0ee4\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0ee5"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0ee6\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u02c5\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u0ee7\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0ee8"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0ee9\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0eea\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u0c1d\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0eeb"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0eec\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0eed\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0eee\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u02c6\10\121"+
+    "\1\112\2\0\20\121\1\u0eef\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0ef0\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0ef1\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0ef2\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0304\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u0ef3\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0dac\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0ef4\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0ef5\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\27\121\1\u0ef6\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0ef7\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u02c6\1\121"+
+    "\1\u0ef8\1\u0ef9\1\121\1\u0efa\1\u0efb\2\121\1\112\2\0"+
+    "\20\121\1\u0eef\1\121\1\u0efc\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0efd\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0efe\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0eff\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0f00\1\121\1\u0f01\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0f02\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0f03\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u0f04\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0f05\2\121\1\112\2\0\25\121\1\u0656"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0f06\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u0f07\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u03ca\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u02f3"+
+    "\1\u0f08\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0f09\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0d27\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0f0a\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0f0b\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0f0c"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u0f0d\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0f0e\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0f0f\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u05f6"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0f10\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0f11\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0f12\3\121\1\u0f13\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0f14\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0f15\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u0f16"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0f17\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0f18"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0f19\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0f1a\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u0f1b\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0f1c"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0f1d\6\121\1\112\2\0\23\121\1\u031c\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u048f\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0f1e\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0f1f\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0f20\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0f21\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0f22"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0f23\2\121\1\u0f24\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0988\6\121\1\112\2\0"+
+    "\23\121\1\u0f25\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0f26\7\121\1\112\2\0\30\121\1\u08ca\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0f27\2\121\1\u0f28\1\u0f29\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u0805\5\121\1\112\2\0\25\121\1\u0f2a\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0f2b\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0f2c\2\121"+
+    "\1\u0f2d\4\121\1\112\2\0\22\121\1\u080b\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0f2e\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0f2f\4\121"+
+    "\1\112\2\0\23\121\1\u0f30\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0f31\1\u0f32\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0343\3\121\1\112"+
+    "\2\0\23\121\1\u0f33\16\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0f34\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0f35\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0f36\1\u0f37\6\121\1\112"+
+    "\2\0\20\121\1\u0163\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0894\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0f38\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0f39\1\121\1\u0894\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0f3a"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0f3b\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0f3c\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0f3d"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0f3e\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u04ac\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u0c68\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0f3f"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0f40\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0f41\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0eca\4\121\1\112\2\0\23\121\1\u0f42"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0f43\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u09b9\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0f44\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0f45\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0f46\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0f47\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0f48\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0f49\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0f4a"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u0f4b\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0f4c\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0f4d\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0f4e"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0f4f\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0f50"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\1\u0f51\41\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0f52\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0f53"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0f54\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0f55"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u05fe\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0f56\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0f57\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0f58\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0f59\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0f5a\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u09b3\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0f5b\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u0304\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u0f5c\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0f5d\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u03b8\10\121"+
+    "\1\112\2\0\24\121\1\u04ee\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0f5e\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u099b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u06fa\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u0f5f\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0f60\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0f61\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0f62\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0383"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0f63\2\121\1\u0730\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u06c9\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0f64\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u0f65\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u0f66\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0f67\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0f68\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0f69\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u0f6a\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0f6b\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u040b\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0f6c\1\121\1\0\4\121\14\0"+
+    "\4\121\1\u0f6d\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0f6e\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u081a\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0f6f\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0f70\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0f71\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0f72\1\u0f73\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0f74"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0f75\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0f76\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0f77\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u0f78\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0f79\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0f7a\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0f7b\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0f7c\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0f7d\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u06b1\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0218\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0f7e\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0f7f\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0f80\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0f81\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0f82\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0f83\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0f84\6\121\1\112\2\0\21\121\1\u01fe\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u0f85"+
+    "\16\121\1\u0f86\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0f87\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0f88\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u0a2c\2\121\1\u0cf6"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u07b6\4\121"+
+    "\1\112\2\0\22\121\1\u0a2c\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0f89\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u02c9\2\121\1\u06ba\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u0f8a\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0f8b\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u0304"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0f8c\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0f8d\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0f8e\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0f8f"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0f90\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0f91"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0f92\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0f93\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u02fc\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u0f94"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0f95\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0f96\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0338\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0f97\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u0f98\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u0f99\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0f9a\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0f9b\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0f9c\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u040b\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0717\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0f9d"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0562\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u04ef"+
+    "\3\121\1\u0768\3\121\1\u0a09\1\121\1\112\2\0\22\121"+
+    "\1\u0f9e\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0f9f\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0ae8\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0fa0\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u06c6\4\121\1\u0fa1\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0fa2\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0fa3\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0fa4\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u09f8\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0fa5\12\121"+
+    "\1\112\2\0\24\121\1\u0fa6\1\u0fa7\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0fa8\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0fa9\1\121\1\u0316"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0faa\6\121\1\u0799\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u04f3\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0fab\2\121\1\u0ac3"+
+    "\1\121\1\u0fac\1\u0fad\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0338\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u02c5\4\121\1\112\2\0"+
+    "\23\121\1\u04ac\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0fae\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0faf\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0fb0\1\121\1\u04ac\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0fb1"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u0fb2\1\112\2\0\23\121\1\u0fb3\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0fb4\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0fb5\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0bb5"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u059b\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u0fb6\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0e93\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0bb0"+
+    "\2\121\1\112\2\0\22\121\1\u0a2c\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0eca\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0fb7\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0fb8\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0fb9"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0333\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0fba\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0fbb\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0fbc"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0fbd\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u09f8\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0fbe\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0fbf\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0fc0"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0304\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0fc1\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u058b"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0fc2\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u0fc3\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u072f\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0fc4\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\40\121\1\u0fc5\1\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u02c5\4\121\1\112\2\0\24\121\1\u04ee\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0fc6\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0fc7\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0fc8\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u055c\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0fc9\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0fca\3\121"+
+    "\1\u0f13\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0fcb\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0fcc\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0fcd\14\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0fce\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u0fcf\15\121\1\u05ab\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\30\121"+
+    "\1\u0fd0\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\33\121\1\u0fd1\6\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\16\121\1\u0fd2\23\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0fd3\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0652\7\121\1\112\2\0"+
+    "\22\121\1\u0fd4\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0fd5\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0638\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0fd6\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u033a\2\121\1\u07fd"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\40\121\1\u0fd7\1\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0fd8\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0fd9\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u07cb"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\1\u07cb\41\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u0fda\1\121\1\u0fdb\1\121\1\u0fdc\2\121"+
+    "\1\u0fdd\2\121\1\112\2\0\1\u0fde\21\121\1\u0fdf\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0fd7\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u05f9\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0fe0\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0fe1\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0fe2\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0fe3\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0fe4\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0fe5\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0fe6\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0fe7"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0fe8\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0fe9\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0fea\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0567"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u0da5\5\121\1\112\2\0\6\121\1\u0feb\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0fec\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u08af\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0d5c"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0fed\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0304\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u09c2\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u05f6\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0fee"+
+    "\7\121\1\112\2\0\30\121\1\u0fef\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0ff0\2\121\1\u0d0f\1\u0ff1\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0ff2"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0b87\16\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0ff3\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0ff4\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0ff5\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0ff6\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0add\16\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0ff7\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0ff8\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0ff9\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0ffa\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u0302\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u0ffb\5\121\1\112\2\0\20\121"+
+    "\1\u0ffc\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0ffd\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0ffe\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0fff\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1000\2\121\1\112"+
+    "\2\0\20\121\1\u1001\4\121\1\u1002\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1003\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1004\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u1005\1\121\1\u1006\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1007\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u033a"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1008\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u1009\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u100a\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u100b\41\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0d5d\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u100c\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u100d\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u100e\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u100f\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u1010\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1006\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1011\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1012\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u0300\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1013\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u048c\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1014\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u0bd5\41\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1015\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1016"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u1017\1\121\1\u1018\2\121\1\u1019\1\u101a\1\u101b"+
+    "\2\121\1\112\2\0\1\u018b\17\121\1\u072f\1\121\1\u101c"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\21\121\1\u0b64\20\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0ff6\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u101d\4\121\1\u101e\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u101f\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u06b0"+
+    "\5\121\1\u048c\1\121\1\112\2\0\24\121\1\u1020\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1021\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1022"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1023\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u1024\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1025\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1026\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0487\1\121\1\0\4\121"+
+    "\14\0\3\121\1\u06b0\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1027\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1028\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1029\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u102a\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u102b\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u02e8\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u102c\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u102d\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u102e\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u102f"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1030\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1031"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1032\15\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u1033\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1034"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1035\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u08de"+
+    "\1\121\1\u0d86\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1036\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1037"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u1038\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1039"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u04b4\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u103a\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u103b\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u103c"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u103d\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u103e\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0282\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u103f\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1040\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u01fe\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1041"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1042\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1043\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1044"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u1045\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u04e6\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1046\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u07a9\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1047\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1048\3\121\1\u1046\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1049\1\121\1\u104a\1\121"+
+    "\1\u104b\1\121\1\u104c\1\121\1\u104d\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u104e\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u104f\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0a5f\1\121\1\u1050\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1051\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1052"+
+    "\1\121\1\u1053\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u1054\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u01dc\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1055\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1056\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1057\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1058\1\121"+
+    "\1\0\4\121\14\0\11\121\1\u073c\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1059\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u105a"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u105b\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u105c\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u105d\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u105e\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u105f\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1060\12\121\1\112\2\0\23\121\1\u1061\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1062\1\121\1\0\4\121\14\0\1\121\1\u1063\1\121"+
+    "\1\u1064\1\121\1\u1065\1\121\1\u1066\1\121\1\u1067\1\121"+
+    "\1\112\2\0\6\121\1\u1068\13\121\1\u1006\2\121\1\u0cd0"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u1069\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u106a\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u106b\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u106c\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u02f5"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u106d\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u106e\10\121\1\112\2\0\22\121\1\u033a\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u106f"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1070\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1071\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1072\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1073\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1074"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1075\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1076"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1077\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0817\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1078\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1079\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u107a\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u107b\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u01dc\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u107c\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u107d\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u107e\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u107f\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1080\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1081\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1082\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u1083\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1084\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u1085\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1086\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u1087\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1088\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u100d\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1089\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u108a\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u108b\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u100d\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u108c\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u108d\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u108e\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\1\112\1\u01c6\4\112\1\0\1\112\4\u01c6\1\112\1\0"+
+    "\4\112\1\0\2\112\2\u01c6\14\0\4\112\3\u01c6\5\112"+
+    "\2\0\1\112\1\u01c6\5\112\1\u01c6\6\112\1\u01c6\1\112"+
+    "\1\u01c6\1\112\1\u01c6\2\112\1\u01c6\5\112\3\u01c6\1\112"+
+    "\3\u01c6\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u108f\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u1090\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1091\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1092"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1093\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1094"+
+    "\2\121\1\u1095\4\121\1\u1096\2\121\1\112\2\0\25\121"+
+    "\1\u1097\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1098\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1099\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u109a\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u0731\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0700"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u109b\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u109c\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u109d\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u109e\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u109f\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u10a0\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u10a1\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u10a2\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u10a3"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u10a4\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\30\121\1\u10a5\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u10a6\1\121\1\0\4\121\14\0\1\u074f\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u10a7\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u10a8\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u09ab\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u10a9\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u0ffe\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u10aa\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u10ab\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u10ac\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u10ad\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u10ae\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u10af"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u10b0\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u10b1\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u10b2\2\121\1\u10b3\2\121"+
+    "\1\u10b4\3\121\1\112\2\0\6\121\1\u10b5\13\121\1\u10b6"+
+    "\1\u10b7\1\121\1\u10b8\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u10b9\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u10ba\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u02f3"+
+    "\1\u10bb\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u10bc"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u10bd\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u10be\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u10bf\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u10c0\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u10c1\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u10c2\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u10c3\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u10c4\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u10c5\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u10c6\10\121\1\112\2\0\26\121"+
+    "\1\u10c7\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u10c8"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u10c9\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u10ca\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u10cb\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u10cc\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u10cd\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0fa3\3\121\1\u10ce\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u10cf\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0e28\4\121\1\u0cb8\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u10d0\2\121\1\u0d0f\1\u10d1\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u10d2"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u033a\1\121\1\u10d3\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u06c7\12\121\1\112\2\0"+
+    "\22\121\1\u080b\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u10d4\3\121\1\u10d5\3\121\1\112\2\0\23\121\1\u0396"+
+    "\16\121\1\112\10\0\6\121\1\0\5\121\1\u0b88\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0f36"+
+    "\2\121\1\u10d6\4\121\1\112\2\0\20\121\1\u10d7\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\30\121"+
+    "\1\u10d8\11\121\1\112\10\0\6\121\1\0\5\121\1\u10d9"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u10da\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u10db\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u02e9\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u10dc\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u10dd\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u10de\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u10df\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u10e0\1\121"+
+    "\1\u10e1\1\u0f8a\1\u07b6\2\121\1\u10e2\1\121\1\112\2\0"+
+    "\22\121\1\u10e3\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u10e4\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u10e5\3\121\1\112\2\0\24\121\1\u10e6"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u10e7\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u10e8\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u04b2\1\121\1\u10e9"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u10ea\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u10eb\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u10ec\2\121\1\u0c4b\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u10ed\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0b50\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u10ee\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u10ef\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u10f0\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u10f1"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u10f2\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u10f3\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u10f4\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0715"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u10f5\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0f51\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u10f6"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u10f7\6\121"+
+    "\1\u0171\1\121\1\112\2\0\27\121\1\u10f8\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u10f9"+
+    "\16\121\1\112\10\0\6\121\1\0\5\121\1\u07bf\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u10fa\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u10fb\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u10fc\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u10fd\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u10fe\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0343\3\121\1\112"+
+    "\2\0\23\121\1\u0396\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u10ff\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1100\2\121\1\u1101\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u0887\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1102\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1103\17\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1104\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u1105\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u08de\7\121\1\112\2\0\22\121\1\u0e7b\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0576"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1106\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0f42\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1107\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\27\121\1\u1108\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0187\1\121\1\u1109\1\u110a"+
+    "\2\121\1\112\2\0\22\121\1\u110b\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u110c\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u0187\5\121\1\112"+
+    "\2\0\22\121\1\u0625\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u110d\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u110e\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u110f\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1110\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1111\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1112\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1113"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1114\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u0b93\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\27\121\1\u1115\12\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1116\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1117"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0d85\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1118\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1119"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u111a\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0383\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u111b\2\121\1\112"+
+    "\2\0\22\121\1\u0e7c\2\121\1\u111c\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u111d\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u017c\5\121\1\112\2\0"+
+    "\24\121\1\u01fe\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u111e\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u111f\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1120\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1121\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1122\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\1\u1123\41\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1124\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u1050\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0282"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0e6f\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u1125\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u1126\1\u016e\3\121"+
+    "\1\u1127\1\121\1\u0760\2\121\1\112\2\0\6\121\1\u0f5c"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1128\16\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0e8c\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0f41\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1129\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u112a\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u112b"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u112c\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u112d\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0328\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u112e"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u112f\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1130\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1131\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1132"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0f9c\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1133\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1134\3\121\1\u0fcf\6\121"+
+    "\1\112\2\0\23\121\1\u1135\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1136\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1137\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1138\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1139\3\121\1\112\2\0\6\121\1\u0b9d\15\121\1\u05ab"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\30\121\1\u113a\11\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u113b\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u113c\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u113d"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u113e\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0205"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0c33\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u113f\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1140\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0fab\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1141"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1142\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1143\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1144\7\121\1\112"+
+    "\2\0\23\121\1\u1145\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1146\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0f36\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u1147\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1148"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1149\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u114a\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0282\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u0582\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u114b\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u02e8\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u114c\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u114d"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u114e\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u114f\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1150\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1151\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u1152\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u08dd\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1153\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1154\1\u1155\2\121\1\u04da\1\u1156\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1157\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1158\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1159\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u115a\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u115b\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u115c\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u115d\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u115e\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u115f\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1160\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u04ae\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0383\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1161\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0304\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1162\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1163\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1164\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\1\u1165\41\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u1166\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1167\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1168\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1169\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u116a\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u116b\1\u116c\2\121\1\u116d\3\121\1\u116e"+
+    "\1\u116f\1\121\1\112\2\0\25\121\1\u1170\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1171\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1172\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1173\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u1174\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1175\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1176\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0302\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0b7c\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0338\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u02f0\41\121"+
+    "\2\53\1\0\1\53\1\0\2\53\2\0\6\53\1\0"+
+    "\15\53\1\u1177\7\53\1\0\15\53\1\u1177\5\53\1\0"+
+    "\42\53\17\0\1\u1178\114\0\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u027b\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1179\12\121\1\112\2\0\42\121\17\0"+
+    "\1\u117a\133\0\1\u117b\114\0\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u117c\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\2\121\1\u117d\37\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u117e\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\121\1\u117f\40\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u064d\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1180\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1181"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u1182\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0a9f"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1183\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u1184\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0717\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0c12\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u1185\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u1186\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1187\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1188\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u1189\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u118a\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u118b\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u118c\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u07cb"+
+    "\4\121\1\u118d\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u118e\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u118f\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1190"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1191"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1192\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1193\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1194\5\121\1\u1195\1\u1196"+
+    "\1\121\1\112\2\0\20\121\1\u1197\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1198\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1199\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u119a\3\121\1\u119b\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u119c\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0c23\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u119d"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u119e\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u0b97\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u119f\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u11a0"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u11a1\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u11a2\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u11a3\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u11a4"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\4\121"+
+    "\1\u0484\1\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\41\121\1\u01fe\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0c3e\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u11a5"+
+    "\1\121\1\0\4\121\14\0\6\121\1\u11a6\1\121\1\u11a7"+
+    "\2\121\1\112\2\0\6\121\1\u11a8\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u11a9\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u11aa\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\41\121\1\u11ab\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u11ac\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u11ad\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u04e6\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0316\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u11ae"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0cb2\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u11af\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u11b0\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u11b1\1\121\1\0\4\121\14\0\5\121"+
+    "\1\u11b2\1\u11a6\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0302\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u11b3\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u11b4\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u11b5\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u11b6\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u02de\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0424"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u11b7\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u11b8\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u11b9\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u11ba"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u11bb\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u11b9\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u07bf\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u11bc\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u11bd\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u11be\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u08af\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u11bf\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u11c0"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u11c1\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u11c2\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u11c3\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0b5c\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u11c4\1\u11c5\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0fcf\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u11c6\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u11c7"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u11c8\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u11c9\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u10f9"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u11ca\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u11cb\15\121\1\u05ab\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u11cc"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u055c\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u11cd\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u11ce\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u11cf"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u11d0\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u11d1\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u01dc\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0817"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0f99\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u11d2\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u11d3\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u0f3c\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u11d4\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u11d5\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u11d6\16\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u11d7\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u11d8\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u11d9\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u11da\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u11db\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u11dc\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u11dd\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u11de\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u11df\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u11e0\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0fe0\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0a48"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u11e1\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u07cb"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u11e2\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u0c0b\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u086c\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u11e3"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u11e4\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u11e5\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u11e6\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0729"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0760\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u11e7\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0816\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u11e8\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u11e9\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u11ea\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\33\121"+
+    "\1\u01fe\4\121\1\u01fe\1\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u11eb\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0f5a\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u11ec\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0345"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u11ed\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u04f3\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u11ee"+
+    "\15\121\1\112\10\0\6\121\1\0\2\121\1\u01fe\3\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\40\121\1\u01fe\1\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0bb5\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u11ef"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u11f0\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u01fe"+
+    "\7\121\1\112\2\0\32\121\1\u11f1\7\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\30\121\1\u0517\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u11f2\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u11f3\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\30\121\1\u02d2\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u11f4\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u03d2"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u11f5\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u11f6\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u11f7\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u11f8\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u11f9\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u0e39\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u03d2\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u11f9\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u11fa\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u11fb\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u11fc\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u11fd\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u11fe\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u11ff"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u1200\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1201\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1202\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u078a\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1203\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u0d7f\5\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1204"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1205\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u1206"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u07b2"+
+    "\3\121\1\u07b4\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0a2c\1\121"+
+    "\1\u051a\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1207"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u078c\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u1208\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1209\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\26\121\1\u120a\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u120b\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u120c\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u120d\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u120e\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u120f\4\121\1\u1210\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u1211\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u1212\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u0d7f\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1213\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1214"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1215\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1216\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1217"+
+    "\1\121\1\u1218\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0bc1\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u080b\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u0a26\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1219\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u121a\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0cd8\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u02f5"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u121b\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u121c\3\121\1\u121d\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u121e\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u121f"+
+    "\7\121\1\u1220\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1221\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1222\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1223\1\121\1\u10f8\12\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1224\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0f13\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0ac3\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1225"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1226\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1227\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1228\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u1229\13\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u04ad\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u122a\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u122b\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u122c\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u122d"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u122e\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u122f\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1230\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1231"+
+    "\1\u1232\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u1233\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1234\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1235\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1236\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1237\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0218\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u02c5\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0d63\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1238\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1239\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u123a"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u123b\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u04b3\1\u02de\6\121\1\u11cf\6\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u123c\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0fd0\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u123d"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u123e\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u123f\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1240\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1241\1\121\1\0\4\121\14\0\1\u0990\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1242\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u05a2\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1243\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1244\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\1\121\1\u1245"+
+    "\4\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u1246\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1247\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u1030\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1248"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\37\121\1\u01fe\2\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0319\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0730\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1249\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u124a\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u124b\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u124c\6\121\1\112\2\0\23\121"+
+    "\1\u124d\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u124e"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u124f\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0730\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1250\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1251\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1108"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1252\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1253\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1254\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1255\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1256"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0a69\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1257\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1258\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1259"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u125a\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u125b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u125c\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u125d"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u125e\3\121\1\u125f\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u1260\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1261"+
+    "\1\121\1\u0f9d\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u1262\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1263\1\u1264\1\121\1\u1265\1\u0485"+
+    "\3\121\1\u1266\2\121\1\112\2\0\1\u1267\5\121\1\u1268"+
+    "\13\121\1\u1269\1\121\1\u04ee\1\u126a\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u031c\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0817\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0d7f\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u09f8\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\27\121\1\u126b\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u04ee\7\121\1\112\2\0"+
+    "\23\121\1\u126c\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u126d"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u072d\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\1\u04d3\41\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u100d"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0280\1\112"+
+    "\2\0\26\121\1\u126e\13\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u126f\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1270\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1271\5\121\1\u1272\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1273\16\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u1274\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u0790\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u100b\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0d4e"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u04ee\7\121\1\112\2\0\23\121\1\u07bf\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1275\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u08e1"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1276\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1277\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1278\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1279\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u127a\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0300\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u0c17\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u127b\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u127c\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u127d\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u127e\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u127f"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1280\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1281\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1282\5\121\1\u0c3c\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1052\1\121\1\u1283\5\121\1\u1284\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1285\3\121\1\u1286"+
+    "\3\121\1\112\2\0\23\121\1\u0396\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1287\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1288\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1289"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u04c4\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u128a\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u128b\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u128c\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u128d\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u128e\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u128f\1\121\1\0\4\121\14\0\1\u1290\1\121\1\u0562"+
+    "\5\121\1\u0760\1\u1291\1\121\1\112\2\0\24\121\1\u1292"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1293\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1294"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0941\6\121\1\112\2\0\23\121\1\u048c\1\u1295"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1296\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u1297\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1298\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1299\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0c21\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u129a\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u07d5\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u129b\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u129c\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u02de\2\121"+
+    "\1\u129d\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u129e\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u129f\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u12a0\2\121"+
+    "\1\u12a1\1\121\1\u12a2\1\u12a3\1\u12a4\2\121\1\112\2\0"+
+    "\1\u018b\21\121\1\u12a5\1\u02f3\1\121\1\u12a6\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u12a7\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u12a8\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u12a9\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u12aa\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u12ab\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u12ac"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u12ad\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u12ae"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u12af\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u12b0\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u12b1"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u12b2\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u02fc\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\21\121\1\u12b3\20\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u12b4\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u12b5\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u12b6\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u12b7\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u12b8\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u12b9"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u12ba\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u12bb"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u12bc\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u12bd\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u02fc\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0f18"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u06b1\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u12be\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u12bf\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u12c0"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u12c1\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u12c2\4\121\1\u12c3\3\121\1\u12c4\1\121"+
+    "\1\112\2\0\6\121\1\u12c5\11\121\1\u12c6\6\121\1\u0795"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u12c7\6\121"+
+    "\1\u12c8\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u12c9\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u12ca"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u12cb\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u12cc\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u12cd\3\121\1\u12ce\1\u12cf\1\121\1\u12d0\1\121"+
+    "\1\112\2\0\1\u12d1\17\121\1\u12d2\2\121\1\u12d3\1\u0d8a"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u105b\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u12d4\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u0304\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u12d5\1\121\1\u12d6\2\121\1\u12cb\1\121"+
+    "\1\u12d7\1\121\1\u12d8\1\u12d9\1\112\2\0\1\u12da\17\121"+
+    "\1\u12db\1\121\1\u12dc\2\121\1\u12dd\1\121\1\u0795\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u12de\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u12df"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u033a\3\121\1\112\2\0\23\121\1\u07bf\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u12e0\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u12e1\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u12e2"+
+    "\5\121\1\u127a\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u12e3\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u12e4\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u12e5\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u12e6\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u12e7\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u12e8\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u12e9\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u12ea\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0aaf\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u12eb\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u12ec\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u12ed\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u040b\1\u05fe"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u12ee\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u12ef\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u12f0"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0fd9\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0345\7\121\1\112\2\0\24\121\1\u06f8\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u12f1\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u12f2\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u12f3\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0387\3\121\1\112\2\0\6\121\1\u12f4"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u12f5\2\121\1\u0844\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u12f6\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u12f7\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u12f8\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\36\121\1\u12f9\3\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u12fa\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\33\121\1\u12fb\6\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u12fc\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u1277\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u12fd\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u12fe\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u08b1\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u12ff\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1300\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1301\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u02ca\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1302"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1303\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1304\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u1305\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1306\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1307\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1308\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1309\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u130a\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u130b"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u130c\2\121\1\112\2\0\22\121\1\u130d\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u07c3\2\121\1\112"+
+    "\2\0\22\121\1\u130e\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u130f\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1310\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1311"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\32\121\1\u1312\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\27\121\1\u1313\12\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0add\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1314\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1315\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\26\121\1\u1316\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1317\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1318\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0652\4\121\1\u1319\2\121\1\112"+
+    "\2\0\6\121\1\u0346\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u131a\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u131b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u131c\2\121\1\u131d\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0a4a\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0a4b\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u131e\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u131f\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u11cf\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1320"+
+    "\12\121\1\112\2\0\23\121\1\u1321\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1322\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1108\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1323"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1324\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u05f6\1\121"+
+    "\1\u1325\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1326\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1327\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1328\1\121\1\u05f6\5\121\1\112\2\0"+
+    "\20\121\1\u0717\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u05f6\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1329\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u132a\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u132b\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u132c\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u132d\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u132e"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u132f\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1330\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1331\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0708"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\21\121\1\u1332\20\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1333\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1334\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1335\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1336\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1337\1\121\1\0\4\121\14\0"+
+    "\10\121\1\u10ee\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u1338\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1339\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u133a\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u133b\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u02de\2\121\1\u133c\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u133d\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u133e"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u133f\1\121\1\u0b8c\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1340\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1341"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1342\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1343\4\121\1\u1344\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1345"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u03d4\12\121\1\112\2\0\23\121\1\u031c\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1346\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1347\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1348"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u042a\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1349\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\27\121"+
+    "\1\u0a9d\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u04b3\1\u02de\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u03d2\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u134a\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\26\121\1\u134b\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u134c\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u134d\3\121\1\112\2\0\24\121\1\u134e"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u134f\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u04b2\1\121\1\u1350\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u1351"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1352\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1353\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1354\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1355"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1356\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1357\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1358\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1359"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u135a\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u135b\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u135c\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u135d\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u135e\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u135f"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1360\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1361\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1362\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0545\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u1363\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0963\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u09a9\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u05d4\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0fe0"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1364\16\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u1365\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1366"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1367\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1368\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1369\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u136a\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u136b\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u136c"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u136d\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u136e\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u136f\2\121\1\u0916\1\u1370\2\121"+
+    "\1\u1371\1\u1372\1\121\1\112\2\0\22\121\1\u1373\1\u02f3"+
+    "\3\121\1\u1374\1\u1375\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u1376\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u08b5\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1377\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0c3f\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u08ba\3\121\1\112\2\0\23\121\1\u1378\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1379"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u137a\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0c67"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u137b\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u137c\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u137d\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u137e\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u137f\12\121"+
+    "\1\112\2\0\22\121\1\u1025\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1380\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1381\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u1382\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1383\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1384\2\121\1\u0e7d\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1385"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u1386\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112";
+
+  private static final String ZZ_TRANS_PACKED_3 =
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1387\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1388\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1389\7\121\1\u111b\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u05f6\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u138a\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u138b\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u138c\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u138d\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u138e\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u138f\4\121\1\u1390\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1391\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1392"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1393\1\u0c3a\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0730\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1394\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0e76\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1395\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1396\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1397\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1398"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u1399\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u139a\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u139b\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u139c"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u139d\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u139e\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u139f\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u051a\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0729\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u13a0\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u13a1\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u07af\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u057e\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0956\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u13a2\2\121\1\112\2\0"+
+    "\32\121\1\u13a3\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u13a4\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u13a5\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u13a6\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u13a7\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u03e1\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u13a8\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u13a9\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u13aa\12\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u13ab\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u13ac\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u13ad\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u13ae\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u13af\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u13b0\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u13b1\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u13b2\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0b90\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u13b3"+
+    "\4\121\1\u04ef\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u055e\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u03e1\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u13b4"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u13b5\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u13b6\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u13b7\2\121\1\112"+
+    "\2\0\6\121\1\u13b8\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u13b9\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u13ba\7\121\1\112\2\0\6\121\1\u0816"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\21\121\1\u13bb\20\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u13bc\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u07cb\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u13bd"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u08bd\1\u0767"+
+    "\1\u13be\1\u0ba6\4\121\1\112\2\0\22\121\1\u13bf\1\u13c0"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u13c1\1\u116c\1\121"+
+    "\1\u100f\1\u13c2\1\u05a1\1\u0721\1\121\1\u13c3\1\u0cde\1\121"+
+    "\1\112\2\0\6\121\1\u03c7\13\121\1\u13c4\1\u04b3\1\u13c5"+
+    "\1\u13c6\2\121\1\u0729\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u13c7\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u0d44\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u13c8\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u13c9\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u03d2\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u0ca3\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u13ca\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u13cb\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u13cc\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u13cd\6\121\1\112\2\0\22\121\1\u13ce\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u13cf\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u13d0\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u13d1"+
+    "\3\121\1\u13d2\1\u13d3\1\121\1\112\2\0\22\121\1\u13d4"+
+    "\1\u04a6\1\u13d5\1\u13d6\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u13d7\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0c0c\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u13d8\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u13d9\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u13da\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u13db\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u13d9\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u13dc\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u13dd\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u01fe\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u13de\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u13df\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u13e0\16\121\2\53\1\0\1\53"+
+    "\1\0\2\53\2\0\6\53\1\0\25\53\1\0\14\53"+
+    "\1\304\6\53\1\0\1\53\1\304\40\53\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\31\121\1\u0bfb\10\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u13e1\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\3\121\1\u06bd\36\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u13e2\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\1\121\1\u06b7\4\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u13e3\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u13e4"+
+    "\10\121\1\112\2\0\22\121\1\u0507\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u13e5\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u13e6\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0b8c"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u13e7\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u13e8\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u13e9\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0bc6\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u13ea\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u13eb\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0ce1\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u031c\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u13ec\1\121\1\u13ed\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0816"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u13ee\1\112"+
+    "\2\0\1\u04d3\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u13ef\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u13f0\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u13f1\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u13f2\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u02f5"+
+    "\11\121\1\u13f3\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u13f4\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u13f5\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0337\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u13f6"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u13f7\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u13f8\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u13f9\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u13fa"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u13fb\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u13fc\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u13fd\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u13fe"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u13ff\7\121\1\112\2\0\6\121\1\u1400\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1401\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1402"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\32\121\1\u1403\7\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u0282\17\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1404\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1405\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0a09\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1406\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\33\121\1\u1407"+
+    "\6\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0c87\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1408\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1409\2\121\1\112\2\0\6\121\1\u140a\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u140b\17\121\1\112\10\0\6\121\1\0\5\121\1\u0730"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\32\121\1\u140c\7\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u140d\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u140a"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u140e\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u140f\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1410\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u1411\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\34\121\1\u1412"+
+    "\5\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1406\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1413\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1414\7\121\1\112\2\0\6\121\1\u12fa"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\32\121\1\u1415\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1416\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1417\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u12fa"+
+    "\13\121\1\u051a\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1418\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1419\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u141a"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u141b\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u141c\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u141d\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u141e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u141f\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1420\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u1421\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1422\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1423"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0a6b\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1424"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u07a2\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u07a5\3\121\1\u0345\1\121\1\u07a6"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1425\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1426\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0729\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1427\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u06d9\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0bf8\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u1428\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1429\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u142a"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u142b\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u142c\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u142d\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u142e\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0163\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u142f\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1430\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1431\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1432\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1433\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1090\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1434\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1435"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0954\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1436\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1437\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0171\1\121"+
+    "\1\112\2\0\24\121\1\u04ee\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u1438\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1439\4\121\1\112\2\0"+
+    "\24\121\1\u143a\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u143b\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u0817\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u143c\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u143d\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u01fe"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u143e\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u143f\1\u1440\3\121\1\u110a\1\121"+
+    "\1\u1441\1\112\2\0\20\121\1\u0e9b\1\121\1\u1442\1\u1321"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u11f9\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1443"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0fd8\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1444\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1445\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u12ea\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1446"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1447\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1448\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0343"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u0304\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u0c4b\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1449\5\121\1\u144a\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u144b\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u04df\2\121"+
+    "\1\u144c\2\121\1\u144d\1\u144e\3\121\1\112\2\0\1\u144f"+
+    "\21\121\1\u1450\1\u1451\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1452\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u1453\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1454\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u02fd\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1455\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0cdb\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1456\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0304\10\121\1\112\2\0"+
+    "\26\121\1\u0730\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1457\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1458\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1459\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u145a\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0cdb\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u145b\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u145c"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u145d\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u145e"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u145f\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1460\6\121\1\112\2\0\23\121"+
+    "\1\u1461\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1462\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1463\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1464\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1465\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1466\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1467\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1468\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\32\121\1\u0d03\7\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u0fad\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u1469\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u146a\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u0a9f\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u07cb\4\121\1\u01fe\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u0383"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u146b\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u146c\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u146d\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u05fd\1\121\1\0\4\121\14\0\10\121"+
+    "\1\u01fe\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u146e\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u146f"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u102e\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u1470\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u09f8\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0ee4\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1471\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1472"+
+    "\6\121\1\112\2\0\23\121\1\u1473\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u1474\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u1475\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u02b9"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0d03\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1476\1\121\1\u1477\3\121\1\u1478"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u07fd\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u05a1\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1479\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u147a"+
+    "\1\121\1\u147b\4\121\1\112\2\0\23\121\1\u0bc1\1\121"+
+    "\1\u042a\1\121\1\u147c\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u147d\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u147e\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u147f\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1480"+
+    "\7\121\1\112\2\0\23\121\1\u0bc1\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0d08\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1481\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0652\2\121"+
+    "\1\u03c4\4\121\1\112\2\0\25\121\1\u0e77\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1482\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1483\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u042a"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1484\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1485\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u07bf\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u0fcf"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1486\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1487"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u1488\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1489\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u148a\4\121\1\u0824"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u148b\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u148c\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u148d\1\121\1\112"+
+    "\2\0\24\121\1\u148e\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u148f\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1490\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1491\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u12c6\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u0e6b\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1492\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u078d\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u0a0b\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1493\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1494\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1495"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u1496\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1497\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1498\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u1499"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u149a\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u149b\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u149c\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u149d\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u149e\2\121\1\112"+
+    "\2\0\25\121\1\u01fe\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u149f\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u14a0\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u08b9\1\121\1\u14a1"+
+    "\1\121\1\u14a2\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u14a3\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u14a4\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u14a5"+
+    "\4\121\1\112\2\0\23\121\1\u0a17\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u14a6\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u14a7\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0e27\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u14a8\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u14a9\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u098c\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u053e"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u14aa\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0708\6\121\1\u14ab\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u14ac\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u14ad\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u14ae\1\u14af\1\u14b0\3\121\1\112\2\0"+
+    "\6\121\1\u14b1\13\121\1\u14b2\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u14b3\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u04a6"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u14b4\12\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0316\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u14b5\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u09ba\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u14b6\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u14b7\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u14b8"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u14b9\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u02c5\4\121\1\112\2\0\22\121"+
+    "\1\u14ba\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u14bb\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u14bc\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u14bd\4\121\1\u0824\3\121\1\112"+
+    "\2\0\24\121\1\u14be\15\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u14bf\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u14c0\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u14c1\6\121\1\112\2\0"+
+    "\23\121\1\u031c\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u14c2\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u14c3\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u14c4\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0b64\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u14c5\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u14c6\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u14c7\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u03e1\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u14c8\1\121\1\u0562"+
+    "\5\121\1\u0760\1\u1291\1\121\1\112\2\0\24\121\1\u1292"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u14c9\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u14ca\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u04f3\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u05ea\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u14cb\2\121\1\u14cc"+
+    "\4\121\1\112\2\0\23\121\1\u04a6\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u14cd\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u14ce\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0c61\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u03d4\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u14cf\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u14d0\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0e39\1\121\1\0\4\121\14\0\4\121\1\u10f0"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u09f8\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0f66\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u14d1\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u06b2"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0a0d\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u14d2\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u0171\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0651\12\121"+
+    "\1\112\2\0\23\121\1\u14d3\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u14d4\1\121\1\u14d5\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u14d6\3\121"+
+    "\1\u0343\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u14d7\1\u14d8\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u14d9\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0c61"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u0bb0\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u110a\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u14da\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u14db\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u14dc"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u14dd\5\121\1\112\2\0\22\121\1\u14de\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u14df\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u14e0"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u14e1\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u14e2\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u14e3\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u04f3\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0120\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u14e4\3\121\1\u14e5\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u14e6\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u14e7\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u14e8\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u14e9\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u14ea\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u048c\1\0"+
+    "\1\112\1\u0108\1\u14eb\1\121\1\0\4\121\14\0\1\121"+
+    "\1\u14ec\1\121\1\u1251\1\u14ed\2\121\1\u076a\1\u048c\1\u14ee"+
+    "\1\121\1\112\2\0\22\121\1\u14ef\17\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u048c\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u048c\2\121\1\u14ed\3\121"+
+    "\1\u048c\1\u14f0\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u072b\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u14f1\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u14f2\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u14f3\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u14f4\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u14f5\4\121\1\112\2\0"+
+    "\25\121\1\u14f6\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u14f7"+
+    "\5\121\1\u14f8\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u14f9\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u14fa\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u14fb\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u14fc\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u14fd\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u07bf"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u12ae\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0ccd"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u14fe\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u14ff\4\121\1\112\2\0\23\121\1\u1500"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1501\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1502\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1503\16\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u1504\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u0ffe\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1505\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1506\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1507\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u14f5\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1508\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1509\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u150a\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u150b\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u150c\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u150d"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u150e\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u150f\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1510\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1511"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u1512\7\121\1\u03e1\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1513\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1514\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1058\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1515\1\121\1\0\4\121"+
+    "\14\0\11\121\1\u1516\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1517"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1518\1\u1519\1\u151a"+
+    "\2\121\1\u02c9\3\121\1\u151b\1\121\1\112\2\0\6\121"+
+    "\1\u151c\13\121\1\u151d\13\121\1\u0972\3\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u151e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u151f\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1520\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u1521\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0b59\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u1522\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u055e\4\121\1\112\2\0"+
+    "\23\121\1\u04a6\1\121\1\u0e54\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u09ae\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u02fc\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1523\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1524\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u1525\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1526\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1527\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1528"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u038b\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1529\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\21\121"+
+    "\1\u152a\20\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u152b"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u152c\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\33\121\1\u02da\6\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u152d\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u152e\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u152f\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u10fb\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1530\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1531"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u036e\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1532\12\121\1\112\2\0\27\121\1\u1533"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1534\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1535\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u0cdb\5\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1536\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u1537\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1538\16\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u1539\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u153a\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u153b\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u153c\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u153d\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0dee\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u153e\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u153f\1\u1540\1\u1541\1\u1542\1\121"+
+    "\1\u072f\1\121\1\u1543\1\u1540\1\u1544\1\121\1\112\2\0"+
+    "\22\121\1\u1545\2\121\1\u1546\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1547\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u1548\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1549\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u10f0"+
+    "\3\121\1\u154a\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u154b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u154c\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u154d\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u154e\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u01e0\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u154f\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u1550\15\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u1551\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1552\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1553\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1554\10\121\1\112\2\0"+
+    "\24\121\1\u1555\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1556\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1557\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1558"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1559\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u155a\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u155b\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u155c"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u155d\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u155e"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u155f\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1560\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1561"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u141e\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1562\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u155d\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1563\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1564\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1565\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1566\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u04e6\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u033a\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u1567\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1568\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1569"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u156a\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u156b\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u156c\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u156d\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u156e\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u156f\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1570"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0570\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1571"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1572\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u04ee\5\121"+
+    "\1\u059e\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1573\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1270\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1574\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1575"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\30\121"+
+    "\1\u1576\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1577"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1578\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1579\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u157a\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u075f"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u157b\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u157c\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u157d\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u157e\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u157f\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u1580\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1581\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1582\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1583\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1584\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1585\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1586\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1587\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1588"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1589\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0aab\12\121\1\112\2\0\6\121\1\u158a"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u158b\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u042a"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u158c\15\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u02ae\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\26\121\1\u1168"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u158d\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u158e\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u158f\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1590\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1591"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1592\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1593"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1594\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1595\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u034c\3\121\1\u0120\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u1596\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1597\7\121\1\112\2\0\21\121\1\u1598\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1599\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u159a"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\16\121\1\u159b\23\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u159c\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u159d"+
+    "\2\121\1\u0e77\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u159e\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u07cb\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u159f\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u15a0\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u15a1\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u111b\2\121\1\112\2\0\22\121\1\u15a2\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u15a3\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u15a4\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u130b\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u15a5\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u15a6"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u15a7\21\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u0e8c\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u15a8\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1117\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u15a9\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u15aa"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u0717\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u105e\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u15ab\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u15ac"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u04da\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u0fc1\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u15ad\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u15ae"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u15af\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1290\1\121\1\u15b0\5\121\1\u15b1\1\u15b2"+
+    "\1\121\1\112\2\0\24\121\1\u04ee\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u15b3\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u15b4\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u15b5\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u15b6\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u15b7\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0987\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u15b8\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u15b9\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u15ba\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u15bb\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u15bc\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u15bd\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u15be"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u15bf\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0c61\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u15c0\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u15c1"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u15c2\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u15c3\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u15c4\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0f4b\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\21\121\1\u15c5\20\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u15c6\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\26\121\1\u0a6b"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u15c7\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0163"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u13ad\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0fbd\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u15c8\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u15c9\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u15ca\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u15cb\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u15cc\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u031c\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u15cd"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u15ce\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\1\u15cf\41\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u15d0\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u15d1\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u15d2\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u15d3\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u15d4"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u15d5\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u15d6\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u15d7\2\121\1\u15d8\1\u052f\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0343\3\121\1\112"+
+    "\2\0\23\121\1\u0b87\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u15d9\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u04ac\15\121"+
+    "\1\u0383\1\u03c9\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\32\121\1\u05fa\7\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u05f6\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u15da\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u15db\4\121\1\112"+
+    "\2\0\6\121\1\u04ac\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u038b\6\121\1\112\2\0\23\121\1\u0383\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u05fa\5\121\1\u15dc\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0941\1\121\1\u15dd\1\121\1\u15de\1\u15df\1\121\1\112"+
+    "\2\0\25\121\1\u15e0\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u15e1\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u15e2\2\121\1\u0588\1\u15e3\2\121"+
+    "\1\112\2\0\20\121\1\u0ff6\2\121\1\u04a6\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u15e4\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u15e5\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u15e6\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u15e7\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u15e8\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u0495\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u15e9\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u15ea\3\121\1\112\2\0\24\121\1\u15eb\3\121\1\u15ec"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u15ed\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u15ee\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u15ef\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u15f0\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u15f1\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u15f2\1\121\1\0\4\121\14\0\3\121"+
+    "\1\u15f3\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u120a\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u15f4"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u120a\1\u15f5"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u15f6\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u15f7\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u15f8"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u15f9\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u15fa\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0ecf\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u15fb\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u15fc\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u15fd\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u15fe\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u12ae\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u15ff\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1600\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1601\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0d5e\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1602\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1603"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1604\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u1605\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0710\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u1606"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1607\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1608\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u11a0\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1609\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u02f5\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u0e77\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u160a\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u160b\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u160c\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u160d"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u105b\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u160e\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u105b\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u160f"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1610\1\u1611\1\u1612\1\121\1\u1613\1\121\1\u1614"+
+    "\2\121\1\112\2\0\6\121\1\u0346\13\121\1\u1615\2\121"+
+    "\1\u1616\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1617"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1618\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u03e1\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u0d7d\14\121\1\112\10\0\6\121\1\0\5\121\1\u1619"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u161a\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u161b\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u161c\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\33\121"+
+    "\1\u161d\6\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u161e\1\121\1\0\4\121\14\0\2\121"+
+    "\1\u02c6\5\121\1\u161f\1\121\1\u1620\1\112\2\0\20\121"+
+    "\1\u0e9b\21\121\1\112\10\0\6\121\1\0\5\121\1\u1404"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0b7c\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1621\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1622\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1623\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1624"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1625\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u1626\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u0d44"+
+    "\13\121\1\u1627\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1628\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\35\121\1\u01fe\4\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u11b2\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1629\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u162a\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u162b\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u162c\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u0163\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u162d\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u162e\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u162f\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1630\3\121\1\u11de\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0163\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1631\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1632\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u1633\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1634\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1635\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u0d86"+
+    "\3\121\1\u1636\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u089d\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1637\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1638\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u053e"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1639\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u163a\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u163b\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u163c"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u163d\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u163e\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u163f\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1640"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1641\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\32\121\1\u1642\7\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0b5c\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u1643\20\121"+
+    "\1\u10fb\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1644\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1645\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1646\2\121\1\112\2\0\20\121"+
+    "\1\u1647\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1648"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1649\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u164a\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u164b\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u164c"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u03b8\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u164d\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u02b0\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u164e"+
+    "\6\121\1\112\2\0\23\121\1\u03a5\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u164f\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1650\1\121\1\u05fb"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1651\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u12ea\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u0fd8\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1442\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1448\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1652\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0fd8\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1653\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1654"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u13cf\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1655\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1656"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1657\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1658"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1659\1\u165a\3\121\1\112\2\0\23\121\1\u165b"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u165c\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1030\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u165d\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u165e\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u165f\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1660"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1661\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u11f2\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1662"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1663\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u131e\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1664\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1665\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0fd9\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1378\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1666\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\1\u0319\41\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1667\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1668\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u1669\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u02fc\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u0163"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u04df\10\121\1\u166a"+
+    "\1\121\1\112\2\0\6\121\1\u166b\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u166c\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u166d\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u166e"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u166f\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u014e\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u146b\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u1670\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1671"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1672\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1673\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1674\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u1675\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1676\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u0f20\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1677\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1678\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1679"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u167a\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u167b\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u167c\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u167d"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u167e\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u167f\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1680\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1681\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1682\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1683\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1684\1\u053c\1\121\1\u07b6\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1685"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\31\121\1\u1686\10\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1687\6\121\1\u1688\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1689\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u168a\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u168b\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u168c\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u168d\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u168e\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u168f\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1690\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1691\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0b9d\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1692\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1693\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1694\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u138c\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1695\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1696\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1697\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u1698\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1699\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u169a\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u0d86\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u169b\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u169c\4\121\1\u04ef\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u169d\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u169e\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u169f\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u16a0\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u148f"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u16a1\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u16a2\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u16a3\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0f02\2\121\1\112\2\0\22\121"+
+    "\1\u051a\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u16a4\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u06ce\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u16a5\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u16a6\1\u16a7\5\121"+
+    "\1\u16a8\1\u16a9\1\121\1\112\2\0\1\u16aa\23\121\1\u16ab"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u16ac\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u16ad"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0717\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u16ae\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0ae1"+
+    "\16\121\1\112\10\0\6\121\1\0\5\121\1\u16af\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u16b0\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0836\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u05a1\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u02c6\1\u0824\1\121\1\u12cb"+
+    "\1\121\1\u102e\1\121\1\u16b1\1\121\1\112\2\0\20\121"+
+    "\1\u16b2\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\21\121\1\u0b15\20\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u16b3\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u16b4\1\121"+
+    "\1\0\4\121\14\0\10\121\1\u16b5\1\u16b6\1\121\1\112"+
+    "\2\0\23\121\1\u03d2\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u16b7\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u03d2\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0345\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u16b8\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u03d2\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u07f1\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u16b9\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u16ba\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u09df\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u16bb\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u16bc"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u16bd\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0941"+
+    "\3\121\1\u16be\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u06ff\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u06ba\2\121\1\112"+
+    "\2\0\20\121\1\u16bf\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u16c0\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u16c1\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u16c2\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u08c7"+
+    "\6\121\1\112\2\0\23\121\1\u0ae8\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u06c6\3\121\1\u0282\1\u0fa1\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u16c3\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0ac3\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u16c4"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u16c5\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u16c6"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u16c7\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u16c8\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u16c9\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0cd9"+
+    "\4\121\1\u16ca\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u16cb\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u16cc\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u16cd"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u16ce\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u02e8\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u16cf\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u09a9\15\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u16d0\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u16d1\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u16d2\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u048c\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\u16d3\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u16d4\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u16d5\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u16d6"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u16d7\1\121\1\u16d8"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u16d9\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u12aa\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u16d9\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u03e1"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u16da\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u02c5\2\121\1\u16db\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u048c\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u048c"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u02c5\1\u16dc\7\121\1\u048c\1\121\1\112\2\0\1\u16dd"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u02c5\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u048c"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u048c\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u16de\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u16df\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u16e0\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u16e1\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u16e2\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u16e3"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\36\121\1\u16e3\3\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u16e4\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u16e5\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u0304\1\u16e6\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u16e7\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u16e8\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u16e9\15\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u16ea\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u16eb\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u0387"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u0387\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u16ec\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0d7d\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u16ed"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\30\121\1\u16ee\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u16ef\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u16f0\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u16f1"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u16f2\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u16f3\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1256\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u16f4\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u16f5\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u16f6\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u16f7\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u16f8"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u16f9\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u16fa\10\121\1\u12c9\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u16fb\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u16fa"+
+    "\10\121\1\u16fc\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u16fd\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u16fe\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u16ff\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u017c"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1700\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u038b\1\u1701\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1702\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1703\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u1704\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0bb5\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0b65\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u1705"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1706\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1707\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1708"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\26\121\1\u1709\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u170a\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u170b\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u170c"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u170d\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u05be\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u170e\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u121c\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u170f\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1710\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0f19\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1711\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1712\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1713"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1714\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1715\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1716"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u13d8\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u138c"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1717\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u1718\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1719\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u171a\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u171b\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0d03\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u171c"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0717\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u171d\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0c32\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u171e\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u171f\12\121\1\112\2\0"+
+    "\23\121\1\u048f\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1720\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0d7a\7\121\1\112\2\0\23\121\1\u1721"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1722\3\121\1\u0c2d"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u1723\1\112\2\0\20\121\1\u1724\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1725\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0b54\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1726\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1727\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u1728"+
+    "\15\121\1\u1729\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u172a\17\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u172b\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u172c\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u0a09\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1550"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u172d\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u10f0\6\121\1\112\2\0\23\121\1\u0eb5"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u172e\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u172f"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1730\1\121\1\0\4\121"+
+    "\14\0\3\121\1\u1731\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1732\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1733\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1734"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1731\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1735\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\27\121"+
+    "\1\u1736\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1737"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1738\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1739\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u141e\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u173a\1\121\1\u173b"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u173c\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u173d\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u173e\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u13bd\4\121\1\u1736\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u173f\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1740\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u1741"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1742\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u06f1\1\u1743\1\u1744\1\112\2\0"+
+    "\22\121\1\u1745\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1746\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1747\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u1748\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u1749\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u174a\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u174b\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u174c\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u174d\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u174e\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u174f\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0ee3"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u1750\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1751\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1752"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1753\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1754\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1755\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1756\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1757\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1758"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u1759\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u175a\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1583\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u175b\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u175c\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u175d\5\121\1\112\2\0\6\121"+
+    "\1\u175e\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u16ef\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u175f\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1760\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u04e6\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1761"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1762\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1763\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1764\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1765\6\121"+
+    "\1\112\2\0\20\121\1\u1766\4\121\1\u1767\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1768\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1769\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1389\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0562\5\121\1\u0760\2\121\1\112\2\0\24\121\1\u04ee"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u176a\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u176b\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u176c\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u176d\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u176e\6\121\1\112"+
+    "\2\0\22\121\1\u176f\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1770\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u06e9\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\2\121\1\u1771\3\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1772"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u09bd\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1360\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1773\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1774"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u14c8\1\121\1\u1775\5\121\1\u15b1\1\u15b2\1\121\1\112"+
+    "\2\0\24\121\1\u04ee\15\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u0e8c\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0cde\2\121\1\u14cc\4\121\1\112\2\0"+
+    "\23\121\1\u04a6\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1776\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u138c\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1777\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\26\121\1\u1044"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u11d4\3\121"+
+    "\1\112\2\0\24\121\1\u05ab\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u130f\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u04c2\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u1778\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u052f\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1779\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u177a"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u177b\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\26\121\1\u177c\13\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0708\12\121\1\112\2\0\22\121\1\u05f7\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u177d\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0535\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u177e\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u177f\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u01fe\1\u1780\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1781\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1782\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u1783\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1784\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1785\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1786"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1787\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u1788\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u15b7\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1789\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u178a\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u178b\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u178c"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u178d\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u178e\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u0bdf\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u07a2\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u178f\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1790\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0a9b\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1791\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1792\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u165d"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1793\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1794"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0bdb\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u04c2\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1795\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u13ba"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1796\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u0fcf\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1797\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1798"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u1799\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u179a\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u01fe\5\121\1\u0383"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u179b\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u179c\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u179d\3\121\1\112\2\0"+
+    "\25\121\1\u179e\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u179f\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u17a0\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u17a1\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u17a2\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0a54\7\121\1\112\2\0\24\121\1\u135d\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u17a3\4\121\1\112\2\0"+
+    "\22\121\1\u17a4\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u17a5\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u17a6\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u17a7"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u17a8\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u17a9"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u17aa\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u17ab\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u17ac\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u17ad"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u17ae\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u17af\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u17b0\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u17b1"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u17b2\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u17b3\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u17b4"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u17b5\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u17b6\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u17b7\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u03ca\1\121\1\u17b8\5\121\1\112"+
+    "\2\0\22\121\1\u17b9\1\u02f3\1\u04ee\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u17ba\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u17bb\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u17bc"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1449\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u17bd\2\121\1\112\2\0\32\121"+
+    "\1\u17be\7\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u17bf\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u02da\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u17c0\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u17c1\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u17c2\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u17c3\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u17c4\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u0bd2\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u17c5\1\u0969\1\121\1\u14af"+
+    "\2\121\1\u17c6\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u17c7\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u17c8\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u17c9\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u17ca\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u17cb\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0d72\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u13fa\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0dac\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u105b\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0ee8\2\121\1\u17cc\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u17cd\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u17ce\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u17cf"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u01fe\4\121"+
+    "\1\u17d0\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u17d1\1\121\1\u0383\1\u17d2\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u17d3"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u17d4\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u17d5\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u17d6\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u17d7\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u17d8\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u17d9\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u17da\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u17db\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u17dc\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u17dd\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u17de\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0cc3\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0eca\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u17df\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u04df\7\121\1\u01fe\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u17e0\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u17e1\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\30\121\1\u17e2\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u05fe\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u17e3\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0383\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u17e4\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u06b0\1\u162f\6\121\1\112\2\0"+
+    "\32\121\1\u059e\7\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u17e5\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\27\121\1\u17e6\12\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u17e7\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u17e8\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u17e9"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u0b5c\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u17ea\1\u04ef\2\121\1\u0785\1\121\1\u03c4"+
+    "\4\121\1\112\2\0\22\121\1\u17eb\1\u02f3\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u17ec\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u17ed\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0485\6\121\1\112\2\0\25\121\1\u17ee\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u0576"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u17ef\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u17f0\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u120a\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u17f0\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u17f1\1\121\1\0\4\121\14\0\10\121\1\u17f2\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u17f3\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u17f4\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u17f5\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u17f6\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u17f7\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u17f8\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u17f9\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u17fa\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u17fb\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u17fc\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u048c\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u17fd\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u17fe\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u05ea"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u04b3\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u17ff\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u1800\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1801\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0d43\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1802\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u1803"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u1804\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1805\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1806\17\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u1807\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1656\4\121\1\112"+
+    "\2\0\25\121\1\u1808\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u1809\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u180a\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u180b\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u180c\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u180d\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u180e\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u180f"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1810\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u1811\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1812\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0956\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1813\4\121\1\112\2\0"+
+    "\22\121\1\u1814\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1815\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u06db\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1816"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u0763\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1817\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1818\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\33\121\1\u1819"+
+    "\6\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u181a\1\121\1\0\4\121\14\0\10\121\1\u01fe"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u181b\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u181c\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u181d\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u181e\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u181f\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1820\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1821\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1822\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u1823"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1824\4\121\1\112\2\0\21\121\1\u1152\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1825\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1826\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\21\121\1\u1827\20\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1828\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u1829\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u182a\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u182b"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u182c\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u182d\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u182e\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u182f"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1830\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1831\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1128\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u1832\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1833\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u147a\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1834\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1835\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1836\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1837\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1838"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1839\2\121"+
+    "\1\u183a\1\121\1\u102e\3\121\1\112\2\0\1\u183b\5\121"+
+    "\1\u0599\13\121\1\u145f\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u183c\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u183d\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1541\10\121\1\112"+
+    "\2\0\1\u183e\17\121\1\u183f\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1840\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u1841\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1842\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1843"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u17ef\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1844\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1845"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u0a9f\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u04f3\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1846\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1847\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0cde\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1848\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1849\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u184a\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u184b\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u184c\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u184d\3\121\1\u184e"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u184f\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1850\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u1851\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\12\121\1\u1852\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1853\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1854\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1855\6\121\1\112\2\0\23\121\1\u1856"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1857\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0c65\1\121\1\u1858\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1859\3\121\1\u0954\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u185a\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u185b\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u185c"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u185d\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u185e\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u185f\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u10a0\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1860\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1861"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1862\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u110a\2\121\1\112\2\0\23\121"+
+    "\1\u0bc1\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1863\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u107d\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u129d\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1541\10\121\1\112"+
+    "\2\0\20\121\1\u1864\2\121\1\u0bc1\1\u1865\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1866"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1867\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u13cf\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u0f3c\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1868\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0c3f\1\121\1\u033b\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\26\121\1\u1869\13\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u14c9\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u01dc\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0345\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u0636\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0e39"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u103b\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u186a\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u186b\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u186c\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u186d"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u186e\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0";
+
+  private static final String ZZ_TRANS_PACKED_4 =
+    "\4\121\14\0\6\121\1\u186f\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\u1870"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u186f\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1871\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1872\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1873"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u1874\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1875\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u1876\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u1877\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1878\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0ee5\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1879"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u187a\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u187b\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0c3c\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u048c"+
+    "\11\121\1\112\2\0\23\121\1\u187c\1\u0735\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u02c5\2\121\1\u04ac\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u048c"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0735\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u187d\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u187e\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u187f\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1880\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1881\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1121\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u07cb\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u072d"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1882\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1883\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1884\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0fe9\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1885\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1886\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u1887"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1888\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1889\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u0956\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u188a\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u188b\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u188c\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u188b\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u188d\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u188e"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u04d3\21\121\1\u0b0c\13\121\1\u188f\3\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0cd0\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1251\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u0c12\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u09ab\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u0d5e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u1701\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1890"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0d1c\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1891\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u017c\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1892\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u1893\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1894\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1895\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0666\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1896\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1897\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1898\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1899"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1898\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u189a\2\121\1\u189b\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u189c\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\36\121\1\u189d\3\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u189e\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u189f\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u18a0\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u18a1\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u18a2\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u18a3\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\21\121\1\u0e91\20\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u18a4\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u18a5\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u18a6\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u18a7\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u18a8\21\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u06ff\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u18a9\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u18aa\6\121\1\u0af7\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u18ab\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u18ac\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u18ad\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u0a0b\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u07bf"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u05ab\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0f9d\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u18ae\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u18af\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u18b0\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u18b1\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u18b2\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u18b3\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u18b4"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u18b5\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u18b6\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u18b7"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u10f0\6\121"+
+    "\1\112\2\0\21\121\1\u18b8\1\u0ff6\4\121\1\u18b9\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u18ba\12\121\1\112\2\0"+
+    "\20\121\1\u1724\1\u18bb\1\u18bc\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u18bd\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u18be\1\u18bf\6\121\1\u18c0\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\26\121\1\u03d2\13\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u18c1\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u18c2\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u18c3\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u18c4"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u18c5\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u18c6\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u0a4f\5\121\1\u18c7\1\121\1\u18c8"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u17e8\6\121\1\112\2\0\22\121\1\u18c9\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\27\121"+
+    "\1\u1360\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u18ca"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u18c4\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u18cb\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u18cc\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u18cd\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u095c\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u18ce\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u11bd\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u18cf\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u18d0\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u18d1\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u11bd\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u09e5\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u18d2\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u18d3\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u18d4\2\121\1\u0d86\3\121\1\u18d5\1\121\1\112"+
+    "\2\0\25\121\1\u18d6\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u18d7\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0a6b\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u18d8"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u18d9\1\u18da\1\121"+
+    "\1\u18db\1\u0767\1\121\1\u18dc\1\121\1\u18dd\2\121\1\112"+
+    "\2\0\22\121\1\u018e\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u18de\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u18df\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u18e0\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u18e1"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u18e2\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u18e3\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u18e4\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u18e5\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u18e6\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1427\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u18e7\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u18e8"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u064d\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u18e9\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u18ea\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u18eb\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u18ec\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u1360\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u18ed\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u18ee\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1541\3\121"+
+    "\1\u18ef\1\121\1\u110a\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u18f0"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u18f1\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u18f2\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u18f1\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u18f3\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u18f4\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u18f5\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u18f6\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u18f7\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\27\121"+
+    "\1\u18f8\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u18f9\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u18fa\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u18fb\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\1\121\1\u18fc\4\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u18fd\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u18fe\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u109b\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u18ff\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1900\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1901\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u0cdb\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1902\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u1903\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1904"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1905\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1906\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1907\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u02e9\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1908\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0562\4\121\1\u0345\1\u07c3\1\u15b2\1\121"+
+    "\1\112\2\0\24\121\1\u1292\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1389\2\121\1\u0cde\2\121\1\u04bd\4\121\1\112"+
+    "\2\0\23\121\1\u04a6\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1909\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u190a\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u190b\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u190c"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u1909\13\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u190d\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u190e"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u190f\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u0d8a\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1910\33\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u0e95\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u03ca\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1911"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1912\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1913\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u090b"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1914\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u0cd8\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1915\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1916\16\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1917\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1918\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0487\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1919\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u191a\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u191b\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u191c\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u191d\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u191e\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u191f\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1920\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1921\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\30\121\1\u1922\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1923\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u1924\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0638\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1925\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1926\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1927\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1928"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u17e6\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1929\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u192a\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u192b\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u192c\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u192d\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u192e\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u192f\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1930\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u12a0\3\121\1\u0bdb\2\121\1\u12a0\2\121"+
+    "\1\112\2\0\22\121\1\u1931\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1932\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1933\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1934\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1935"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0343\3\121\1\112\2\0\23\121\1\u1936\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u1937\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1938"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\30\121\1\u1939\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u193a\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u193b\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u12a2\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u193c"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u193d\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u193e\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u193f\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0c1a"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0c29\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1940\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0730\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u0824"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u1941\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u1173\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1942\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1943\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1944\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1945\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1946\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1947\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1948\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1949\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u194a\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u194b\5\121\1\u194c"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u194d\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u194e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u194f\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u1950\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1951\1\121\1\112\2\0\1\u1952\41\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u1953"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1954\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u115b\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u0eef\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1955"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1956\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u03e1"+
+    "\1\121\1\112\2\0\6\121\1\u1957\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u1958\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1959\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u195a\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0cde\2\121\1\u1824\4\121\1\112\2\0\23\121"+
+    "\1\u04a6\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u195b"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u195c\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u05fe\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u195d\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0bd5\15\121\1\u072b\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0d7a\2\121\1\u08d5\1\u0343\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u195e\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u195f\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1960\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u073c\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1961\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u1962\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1963\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1964\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u0944\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\30\121\1\u1965\11\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u07c9\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1966\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1967"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1968\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u0948\5\121\1\112\2\0\22\121\1\u130d\4\121\1\u10fb"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1969\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u196a\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u196b\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u196c\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u196d\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u196e"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u196f\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1970\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u187b\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1971"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\21\121\1\u113c\20\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1972\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1973\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1974\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1809"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1975\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1976\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1977\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1978"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1979\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u02c9\5\121\1\112\2\0\6\121"+
+    "\1\u0bb5\33\121\1\112\10\0\6\121\1\0\5\121\1\u197a"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u197b\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u038b\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u02c5"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u197c\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u197d"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u197e\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u197f\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u1980"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1981\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1982\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1983\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1984\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1985\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1824"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1986\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1987\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1988\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u0cf0\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1824\4\121\1\112\2\0\21\121\1\u1152\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0fa1\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u1989\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u198a"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u198b\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u198c\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u198d\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u198e\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u198f\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1990\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0753\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1991\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u1992\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\41\121\1\u1993\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1994\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1995\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1996\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u1997\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1998\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u1999\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u199a\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u199b\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u199c"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u199d\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u199e\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u199f\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u19a0\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u19a1\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u19a2\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u19a3\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u19a4\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u19a5\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\30\121\1\u19a6\11\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1108"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u19a7\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u04bd\4\121\1\112\2\0\24\121\1\u04ee\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u14cb\2\121\1\u04bd\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u19a8\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u19a9\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u19aa\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u19ab\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u19ac\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u0989\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u19ad"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u19ae\2\121"+
+    "\1\112\2\0\22\121\1\u19ac\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u19af\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u19b0\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u19b1\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u02e9\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u0956\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u19b2\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u19b3\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u19b4\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u19b5\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u19b6\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u19b7\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u19b8\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u15d4\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u19b9\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u19ba\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u19bb\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u03e1\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u19bc\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u19bd\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u19be\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u19bf\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u19c0\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u07cd\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u19c1"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u16bf\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u19c2\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u19c3\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u09ab"+
+    "\1\121\1\112\2\0\25\121\1\u0cd8\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u19c4\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u16c7\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u19c5\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u19c6\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u19c7\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u19c8"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u19c9\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u19ca\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u19cb\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u142a\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u19cc\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u19cd\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u19ce\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u19cf\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u19d0\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u038b\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u19d1"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u190b\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u19d2\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u0760\2\121\1\112\2\0\24\121"+
+    "\1\u04ee\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u19d3\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u12d8\1\121\1\112\2\0\27\121\1\u0795\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1363\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u09ab"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1061\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u19d4\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0387\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u19d5\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u19d6\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u19d7\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\31\121\1\u19d8\10\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u19d9\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u19da\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u0da5\2\121\1\u14fd\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u19db\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0218\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u19dc\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u19dd\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u19de\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0383\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0486\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u01fe\2\121\1\112\2\0\24\121\1\u0730\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u19df\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u170e"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u19e0\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u19e1\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u19e2\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u19e3\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u05b5\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u19e4\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u147b\1\121\1\u19e5"+
+    "\2\121\1\112\2\0\20\121\1\u19e6\1\121\1\u07b9\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u19e7\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\31\121\1\u19e8\10\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0316\3\121\1\u0624\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u0cdb\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u19e9"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u19ea\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u19eb\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u19ec\17\121\1\112\10\0\6\121\1\0\5\121\1\u038b"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u19ed\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\32\121\1\u01fe\7\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u19ee\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u11cf"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u19ef\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u19f0\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u19f1\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u19f2"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u19f3\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u19f4\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u19f5\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u0dc6\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u19f6\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u19f7\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u19f8\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u19f9\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u19fa"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u19fb\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u19fc"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u19fd\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u19fe\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u19ff\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1a00\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1a01\4\121\1\112\2\0\6\121\1\u06f8\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1a02\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1a03\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1a04\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u048c\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1a05\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u1a06\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1a07"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u1a08\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u070d\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1a09"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u17e8\6\121"+
+    "\1\112\2\0\22\121\1\u1a05\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\1\u02f0\25\121\1\u1a0a\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1a0b\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1a0c\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u086c\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0c7d\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1a0d\2\121\1\u1a0e\1\121"+
+    "\1\u0345\1\u02f0\2\121\1\112\2\0\24\121\1\u04ee\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0cde\1\121\1\u1a0f"+
+    "\1\u0ce0\1\u1a10\3\121\1\112\2\0\23\121\1\u04a6\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1a11\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1a12"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u0730\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1a13\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1a14\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1a15\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1a16\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1a17\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u1a18\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1a19"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u03a2\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1a1a\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u1a1b\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1a1c"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1758\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1800\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1684\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1a1d\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1a1e"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1a1f\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1023\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u1a20\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1a21\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1a22\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0304\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1a23\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1044\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\20\121\1\u0960\21\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1a24\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u04b3\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1a25\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1a26\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1a27\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u1a28\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0ead"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1a29\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1a2a\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1a2b\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\4\121\1\u1a2c\1\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1a2d\3\121\1\u0195\2\121\1\112"+
+    "\2\0\24\121\1\u0836\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1a2e\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u0187\5\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0f4e\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1a2f\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\32\121\1\u0661\7\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1779\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u1a30\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1a31"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0300\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1a32\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1a33\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0f59\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1a34\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\21\121\1\u1a35\20\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u16c2\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1a36\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1a37"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1a38\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1a39\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1a3a\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0fd9\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1a3b\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1a3c"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\20\121\1\u0ea8\21\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1a3d\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1a3e\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u02c5\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1a3f\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1a40\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u0ba6\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1a41\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0b5c"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1a42\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1a43\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1a44\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u14ef\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1a45\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1a46"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1a47\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1a48\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1a49"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\30\121"+
+    "\1\u1a4a\11\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1a4b"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1a4c\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1a4d\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1a4e\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1a4f"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u17ac\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1a50\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1a51\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1a52"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u1a53\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1a54\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1a55\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1a56\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1a57\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1a58\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u0c84\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u1a59\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1a5a\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1a5b\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1a5c\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1a5d"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0651\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1a5e\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1a5f\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u0824\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1a60\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u16ef\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u0ca3\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1a61\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1a62\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1a63\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u1a64\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1a65\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u0120\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1a66"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1a67\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1a68\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\31\121"+
+    "\1\u0c12\10\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u1a69\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1a6a\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1a6b\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1a6c\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1a6d\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1a6e\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1a6f\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u100e\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u1a70"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u16c1\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1a71\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0343\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u0bb2\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1a3c\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u17ec\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u10b0"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1a72\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u0a6b\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u04ef\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u09b7\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1a73\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u1a74"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u11bd\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\20\121\1\u1a75\21\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1a76\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1a77\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1a78\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1a79\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1a7a\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1a7b\12\121\1\112\2\0"+
+    "\22\121\1\u07d7\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1a7c\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u01fe\2\121\1\112\2\0\23\121\1\u1a7d"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u07cb\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\32\121\1\u1a7e\7\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0fe5\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u056d"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u1a7f\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1a80\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1a81\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u1a82\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1809\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u1a83\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1809\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1a84\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1a85\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1a86\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u1a87\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u1a88\5\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u0c12"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0add\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0562\10\121\1\112\2\0\1\u04d3\21\121\1\u0507\1\121"+
+    "\1\u04ee\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u0730\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u193e"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1a89\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u1a8a\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1a8b\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1824\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1a8c\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1a8d\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u1a8e"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1a8f\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1a90\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1a91\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u15cb"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1a92\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1a93"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1a94\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1a95\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u077c\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1a96\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\41\121\1\u1a97\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u042a\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1a98\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u1997\2\121\1\u0b8c\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1a99\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1a9a\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1a9b"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1a9c\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u12ea\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1a9d\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1a9e\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1a9f\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1aa0"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1aa1\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1aa2\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u16a5\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1aa3\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1aa4\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1aa5\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1aa6\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1aa7\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1aa8\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0ee4"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u184d\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u1aa9\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1aaa"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1aab\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1aac\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1aad\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1044\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1aae\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u0d90\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1aaf\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u1ab0\11\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1ab1\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\27\121"+
+    "\1\u100b\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1ab2"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u100b\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1ab3\2\121\1\112\2\0\20\121"+
+    "\1\u1ab4\2\121\1\u1700\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u02de\5\121\1\u1ab3\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1ab5\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u0b0c\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1ab6\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u02fc\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1ab7\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1ab8\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1ab9\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1173\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1aba"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1abb\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1abc"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1abd\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u02c6\1\u1abe\1\u0c1b\2\121\1\u102e"+
+    "\1\121\1\u0d39\1\121\1\112\2\0\20\121\1\u05f9\1\121"+
+    "\1\u1abf\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1ac0\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1ac1\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1ac2\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1ac3\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u0cfe\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0f5c\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1ac4\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1a87\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0c12\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0730\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u118f\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0989\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u0387\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u07a9\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1ac5\3\121"+
+    "\1\u1ac6\1\121\1\u1ac7\2\121\1\112\2\0\21\121\1\u1ac8"+
+    "\1\u1ac9\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1aca"+
+    "\5\121\1\u07a6\1\121\1\112\2\0\6\121\1\u1010\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1acb\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1acc\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1acd\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1ace\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u03bf\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1acf\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u0718"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1ad0\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1ad1\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1ad2"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\26\121\1\u1ad3\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\36\121\1\u01fe\3\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u0708\3\121\1\u1a16\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1ad4\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u170e"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1ad5\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1ad6\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1ad7\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1589"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1ad8\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1ad9\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u04bd\4\121\1\112"+
+    "\2\0\25\121\1\u0cf6\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u1044\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1ada\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1adb\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1adc\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1add"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1ade\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1adf\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u1ae0"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u1173\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1ae1\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u0f5a\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u19fa\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u1ae2\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1ae3\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1ae4\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1ae5\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1ae6\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1ae7\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1ae8\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u03c9\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u1a0a\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1ae9\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1aea\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1aeb\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1aec\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u1aed\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0c0b\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1aee"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1aef\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u095d\4\121\1\112\2\0\26\121"+
+    "\1\u016d\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u0d21"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1af0\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1af1\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\20\121\1\u129c"+
+    "\21\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1af2\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u0576\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1af3\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0383\4\121\1\u1af4\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1af5\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\6\121\1\u1af6\33\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u134b\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0824\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1af7\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u18e4\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1af8\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1af9\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1afa\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1afb\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1afc\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1afd\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1afe\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1aff\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u04ea\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1b00\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1b01\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u1b02\41\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1b03\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1b04\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1b05\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1b06\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u1b07\2\121\1\u1a2d\6\121"+
+    "\1\112\2\0\24\121\1\u0836\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1b08\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\30\121\1\u1b09\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u03ca\1\u1a2d\1\u0bdb"+
+    "\3\121\1\u06db\1\121\1\112\2\0\22\121\1\u1b0a\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u19c9\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u11ac"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1b0b\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1b0c\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u09c2\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u1b0d\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1b0e\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u0730\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1b0f"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1b10\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1a3a\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u09b1\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0d8a\1\u05f6"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1b11\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u1b12\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1b13\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1b14\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1292\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1b15"+
+    "\2\121\1\u1b16\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1b17\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u0f51\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1b18\4\121"+
+    "\1\112\2\0\25\121\1\u1b19\14\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u1b1a\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u0f51\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1b19"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1b1b\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1b1c\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u1b1d\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u04ee\2\121"+
+    "\1\u04da\12\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1b1e"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u04e5\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1b1f\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1b20\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1b21\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1b22\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1b23\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1b24"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1b25\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u10b0"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1b26\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1b27\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1b28\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1b29\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u1b2a\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1b2b\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1b2c\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\20\121"+
+    "\1\u1b2d\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1b2e"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u031c\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1b2f\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1b30\6\121\1\112"+
+    "\2\0\6\121\1\u1b31\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1b32\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u1b33\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1b34\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1b35"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1b36\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1b37\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u0382\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1b38\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1b39\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u1a87\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u06c6\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0962\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u09f8\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1b3a\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1b3b\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u0af3"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1b3c\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u07dc\4\121\1\112\2\0\25\121\1\u07de\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1b3d"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u129c\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u1b3e\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\5\121\1\u1b3f\5\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1b40\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1b41\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1b42"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u06b2\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1b43\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1b44\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1af9\14\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u05a2\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0315\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1b45"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1b46\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1b47"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1b48\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1b49\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\u0ab0"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1b4a\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u0c12\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1b4b\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1b4c\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1b4d\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1b4e\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1470\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u1b4f\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1b50\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1b51\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1b52\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1b53\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1b54\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1b55\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1b56\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1b57\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1b58\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\16\121\1\u1b59"+
+    "\23\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1b5a\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1493\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\34\121\1\u051b\5\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u0729\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1b5b\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1b5c\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0f4e\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u1b5d\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1b5e\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1b5f\2\121\1\u1b60\2\121\1\u1b61\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0d2c\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u1762\1\121\1\u1b62\1\u1b63\1\121\1\u1019\1\121\1\u1b64"+
+    "\2\121\1\112\2\0\22\121\1\u1b65\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1b66\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1b67"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1b68\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1b69\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u0888\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1b6a\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1b6b\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1b6c\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\27\121\1\u1b6d\12\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u018e\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1b6e\2\121\1\u1b6f\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u08e1"+
+    "\1\121\1\u1b70\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1b71\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1b72\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u1b73"+
+    "\5\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u18c5\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1b74\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1b75\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u1b76\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0844\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1b77\1\121\1\u1a7f\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1b78\4\121"+
+    "\1\u110a\2\121\1\112\2\0\20\121\1\u1b79\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1b7a\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1b7b\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1b7c\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0c1a\6\121\1\112\2\0\23\121\1\u1b7d\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1795\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u0b6c\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1b7e"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u11fa\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u14ea\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1b7f\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1b80\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u04a6\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1b81"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1b82\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u031c\3\121\1\u1b83\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1b84\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1b85\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u16f4\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u1b86\2\121\1\u14fd\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u1b87\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1b88\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u170e\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u189a\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\32\121\1\u1b89\7\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u1b8a\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1b8b\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u113c\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1b8c\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1b8d\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u1b8e\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u19fa\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\33\121\1\u0333"+
+    "\6\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1b8f\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1620"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1b90\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u1b91\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1b92\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u18d4\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1b93\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1b94\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u1b95\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1b96\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\5\121\1\u1b97\5\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u1b98\11\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u18be\1\u1b99"+
+    "\6\121\1\u18c0\2\121\1\112\2\0\22\121\1\u018e\1\u02f3"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1b9a\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1b9b\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1b9c\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1b9d\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1a99\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0aaf\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u0163\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0fbf\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1b9e"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u1b9f\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1ba0\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1ba1\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u07b9"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1ba2\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u08af\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1ba3\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1800\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1ba4"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0562\2\121"+
+    "\1\u1ba5\5\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u09bd\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1ba6"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1ba7\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\34\121\1\u088a\5\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1ba8\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1ba9\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u1baa\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1bab"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1bac\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1b05\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1bad\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1bae\3\121"+
+    "\1\u0195\2\121\1\112\2\0\25\121\1\u10b8\1\121\1\u1374"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1baf\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1bb0\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1bb1\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u0ae8\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1bb2\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\26\121\1\u0730\13\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1bb3\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u01fe\2\121\1\112\2\0\22\121\1\u1a37"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u18b9\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u1bb4\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u1bb5\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u04ed"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1bb6\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1bb7"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1bb8\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\7\121\1\u1bb9\3\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1bba"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1bbb\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1bbc\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1bbd\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1922\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1bbe\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1bbf\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1bc0\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u1bc1"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1bc2\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1bc3\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1bc4\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1bc5"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u06be\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1bc6"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1bc7\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1bc8\2\121\1\u1bc9\4\121\1\112"+
+    "\2\0\22\121\1\u1bca\2\121\1\u1bcb\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1bcc\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1bcd\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u120a"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1bce\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u1bcf\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1bd0\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\30\121\1\u1bd1\11\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1bd2\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1bd3\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u1bd4\6\121\1\u06ba\1\u06c7"+
+    "\1\121\1\112\2\0\1\u0827\27\121\1\u1bd5\5\121\1\u0972"+
+    "\3\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1bd6\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\27\121\1\u1bd7\12\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1bd8\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1bd9\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u04ea\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1bda\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1bdb\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1704\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1bdc\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1bdd\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u1bde\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1bdf\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u198e\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1be0\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1be1\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u1be2\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u1be3\41\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u0954\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1be4"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u1be5\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1be6\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1be7\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1be8\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1be9\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u1bea\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u166d\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1beb"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u1bec\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1bed\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1bee\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1bef"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1bf0\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1bf1\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1bf2\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u16c2\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\1\121\1\u01fe"+
+    "\4\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1bf3\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1bf4\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1bf5\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0f4e\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1bf6\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1bf7\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0c3a\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1bf8\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1bf9"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1bfa\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1bfb\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1bfc\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u1bfd"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1bfe\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1bff\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u1c00\6\121\1\u1c01\2\121"+
+    "\1\112\2\0\22\121\1\u0bdf\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1c02\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1c03\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\21\121\1\u1c04\20\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1c05\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1108\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u1c06"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1c07\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1c08"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1c09\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u02fd\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1c0a\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1c0b"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1c0c\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\21\121\1\u1c0d\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1282\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0576\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u1c0e\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1c0f\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u12cb\3\121\1\u0345\1\121\1\112\2\0"+
+    "\20\121\1\u1197\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u12cb\3\121\1\u0345\1\121\1\112\2\0\20\121\1\u1197"+
+    "\4\121\1\u0717\14\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u1c10\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u0bb2\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u02f5\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u11d3\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u1c11\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0c83\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1c12\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1c13\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1195"+
+    "\2\121\1\112\2\0\22\121\1\u1006\2\121\1\u0cd0\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1c14\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1c15\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u1c16"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\26\121\1\u1c17\13\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\27\121\1\u1c18\12\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1c19"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1c1a\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u04de\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u0a4f\1\u1c1b\1\121\1\u1c1c\4\121\1\u1c1d\1\u07a6\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1c1e"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\12\121\1\u1c1f\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u19b0\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c20\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u0a4f\3\121\1\u0316"+
+    "\6\121\1\112\2\0\25\121\1\u1c21\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1c22\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u18ba\5\121\1\u1c23\1\121"+
+    "\1\u1c24\2\121\1\112\2\0\6\121\1\u1c25\11\121\1\u1724"+
+    "\1\u18bb\20\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1c26\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1c27\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1c28\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c29\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u07b6\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1ac5\1\u1c2a\1\u0316\1\121\1\u0d9c\1\121\1\u0624\2\121"+
+    "\1\112\2\0\22\121\1\u1c2b\2\121\1\u1c2c\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c2d\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1c2e\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0d47\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1c2f\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0c33\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\27\121\1\u1c30"+
+    "\12\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u1c31\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u1c32\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1c33\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1afd"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1c34\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\u1c35\41\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1c36"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1c37\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u1c38\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1bae\6\121\1\112"+
+    "\2\0\25\121\1\u10b8\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1c39\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1329\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1c3a\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c3b"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1c3c\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1c3d\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1c3e\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1c3f\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1c40\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1c41\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1c42\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u06e2\4\121\1\u03c4"+
+    "\4\121\1\112\2\0\25\121\1\u1c43\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1c44\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u1c45"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c46\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1c47\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1c48\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c49\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1c4a\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u1c4b\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1c4c\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1c4d\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1c4e\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c4f\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1c50\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1c51\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c52\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c53\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u1c54\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0d7a\2\121\1\u19ea\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0c2d\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1c55\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1c56\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1704\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1c57\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1c58\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u0a6a\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u163a"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1c59\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u017c"+
+    "\12\121\1\112\2\0\25\121\1\u1c5a\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u04f3\1\121\1\112\2\0\20\121"+
+    "\1\u04f3\21\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1c5b"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1b36\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1bd7\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1c5c\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c5d"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1c5e\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1c5f\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1c60\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1a36\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u03ea\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1c61\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c62\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\24\121\1\u1c63\15\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u113c\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1c64\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u1c65"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1c66\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u01fe"+
+    "\2\121\1\112\2\0\23\121\1\u06de\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\6\121\1\u1c67\33\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1c68\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1c69"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u10a0\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u0d6a\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\26\121\1\u1c6a"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c6b\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1c6c\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1c6d\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1c6e\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u11f2\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1c6f"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u0c99\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u1c70\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u1c71\41\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\121\1\u19aa\11\121\1\112"+
+    "\2\0\6\121\1\u0d44\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u0c3a\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1c72\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1c73\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u056d"+
+    "\7\121\1\112\2\0\24\121\1\u1c74\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u05fe\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1c75"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c76\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1c77\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1c78\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c79\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1c7a\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1c7b"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1c7c\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1c7d\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u0ff7\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u1c7e\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u0e77\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\32\121\1\u1c7f\7\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u100b\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u1c80\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u03e1\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u1c81\5\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1c82"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\1\u02b4\41\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\25\121\1\u0c95\14\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u113d\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1c83\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u16fa\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c84\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1c85\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1c86\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u1c87"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1c88\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1c89\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0fd9\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1c8a\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u1c8b\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1c8c\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1044\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u07ae\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1c8d\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121"+
+    "\1\u1c8e\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\5\121\1\u1c8f\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\23\121\1\u1c90\16\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u193b\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1c91"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1c92\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1c93\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1c94\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1c95"+
+    "\1\u07c9\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1c96\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1c97"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1c98\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1c99\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u134b\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\121\1\u1c9a\11\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1c9b\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1c9c"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1c9d\2\121\1\u03c4\4\121\1\112\2\0\22\121"+
+    "\1\u1025\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1c9e"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1c9f\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1ca0\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1ca1\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1ca2\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1ca3"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\22\121\1\u1ca4\17\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u0e6f\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1ca5\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u08af\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1ca6\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1ca7\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1ca8\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u1bb6\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1ca9\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1caa\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1cab\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1cac"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1cad\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u1cae\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u09c2\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1caf"+
+    "\3\121\1\112\2\0\20\121\1\u1cb0\1\121\1\u1cb1\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1cb2\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1cb3\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1cb4\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1cb5\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1cb6\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1cb7\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1af7\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\32\121\1\u17be\7\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u1cb8\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1cb9"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1cba\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1cbb"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1cbc\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1cbd\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1cbe\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\33\121\1\u1cbf\6\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u05fe\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u13f6\3\121\1\u1cc0\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1cc1\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1cc2\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u0ccc"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\121\1\u1cc3\1\121\1\u1ad9\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1cc4\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1cc5"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u0424\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1cc6\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1be3"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1cc7\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1cc8\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1cc9\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u1cca\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1ccb\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1ccc\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u06d7\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1ccd\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u0cd8\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u0f0c"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1cce\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\27\121\1\u1ccf\12\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u1cd0\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u105e"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u169c\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u19aa\6\121\1\u0c62\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1cd1\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1cd2\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1cd3\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u0b78\1\112\2\0\25\121\1\u1cd4\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1cd5\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1cd6"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u11bd\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u0989\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u1cd7\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1cd8\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1cd9\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u193e\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1cda\3\121";
+
+  private static final String ZZ_TRANS_PACKED_5 =
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1cdb\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u038b\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0730\3\121\1\u0d03\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u0713\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1cdc\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1cdd\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u07a5\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1cde\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1cdf\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1ce0"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1ce1\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121"+
+    "\1\u1ce2\1\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1ce3\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1ce4\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1ce5\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u0c0b\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1ce6\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1ce7\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u0406\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1ce8\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u0730\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1ce9\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1c32\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1cea"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u06d9\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1ceb\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1cec\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u0c7c\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u0ead\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1ced"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1cee\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1cef\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\21\121"+
+    "\1\u1cf0\20\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u09f8"+
+    "\11\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\30\121\1\u0350\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1cf1\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1cf2\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1cf3\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1cf4\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1cf5\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u11b1\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1cf6"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1cf7\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1cf8\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\26\121\1\u1cf9\13\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1cfa\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1cfb\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1cfc\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1cfd\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\121\1\u1cfe\11\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1cff"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\25\121"+
+    "\1\u1d00\14\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1d01\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1d02\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1d03\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1d04\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1d05\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d06"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1d07\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u08b9\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\1\u05f6"+
+    "\41\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1d08\3\121"+
+    "\1\u0c8c\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1d09\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u0717\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u1d0a\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u1af9\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1d0b\6\121\1\u1d0c\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\6\121\1\u1d0d"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1bea\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\20\121\1\u1d0e\21\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u0e7b\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1d0f\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d10\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1bef\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u0a4a\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1d11\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u0735\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1d12\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1d13\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u0ee2\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u0c12\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1d14\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1d15"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1d16\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1d17\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u1d18\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1d19"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1c1c\5\121\1\u07a6\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1d1a"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1d1b\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\21\121\1\u1d1c\20\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\23\121\1\u1d1d\16\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u1d1e\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d1f\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1d20\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1d21\1\121\1\u1c24\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\5\121\1\u1d22\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d23"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1d24\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1b78\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1d25\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u0d44\15\121\1\u04ee\1\u1d26\14\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1d27\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u0ead\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\5\121\1\u1d28"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1d29\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1d2a\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1d2b\1\121"+
+    "\1\0\4\121\14\0\11\121\1\u1d2c\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1d2d\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u1d2e\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1d2f\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1d30\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1d31\1\u1d32\1\u1d33\1\u1d34\4\121"+
+    "\1\u1d32\1\121\1\u1d35\1\112\2\0\30\121\1\u1d36\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1d37\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1d38\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1d39\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1d3a\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\24\121"+
+    "\1\u1d3b\15\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1d3c"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1d3d\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1d3e\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1d3f"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d40\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1d41\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1d42\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u1d43\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1d44\3\121\1\u0f62\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1d45\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1a16\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1d46\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1d47\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u1d48\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1d49\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1d4a\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1d4b\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u184d\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u1d4c\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1d4d\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1d4e\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d4f"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u059b\1\121\1\u1cd4\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u1636\1\121\1\112"+
+    "\2\0\23\121\1\u0bc1\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\11\121\1\u1636\1\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1ac4\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u02c9\10\121\1\112"+
+    "\2\0\22\121\1\u1d50\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1d51\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u189a\1\u189e"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u0fbf\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1ac4\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\22\121\1\u0989\17\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1d52"+
+    "\1\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1d53\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1d54\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1044\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u09b7\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1d55\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1d56\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u1c64\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1d57\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1d58\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d59\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1090\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u1d5a\21\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1d5b\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1d5c\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1d5d"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u1d5e\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1d5f\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1d60\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\25\121\1\u1b19\14\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u064c\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\6\121\1\u1d61\33\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\4\121\1\u1d62\6\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1d63\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d64"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u1d65\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1d66\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u0763\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d67"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1d68\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\5\121\1\u1d69\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1d6a\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\22\121\1\u1d6b\17\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1d6c\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1d6d\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1d6e\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1d6f\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1d70"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1d71\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1d72\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1d73"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1d74\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u04b4"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1d75\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\25\121\1\u09d2\14\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u09f8\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1d76"+
+    "\4\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1d77\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1d78\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1d79"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1d7a\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1d7b\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u0799\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\12\121\1\u13ee\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1d7c\4\121\1\112\2\0"+
+    "\6\121\1\u051a\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1d7d"+
+    "\12\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1d7e\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\121\1\u1d7f\11\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1d80\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1d81\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1d82\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\5\121\1\u102e\5\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u0ee4\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u02e8\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u12ae\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1d83\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1957\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d84\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1d85\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\11\121\1\u1d86\1\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1d87\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1d88\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u1d89\11\121\1\112\2\0\6\121\1\u1d8a\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1d8b\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1d8c\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1d8d\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1a66\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u1d8e\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\1\u1d8f\12\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1c50\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\1\u1d90\12\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1d91\15\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1d92\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\7\121\1\u1108\3\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1d93\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1d94\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1d95\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\24\121\1\u1c19"+
+    "\15\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u04ef\11\121"+
+    "\1\112\2\0\22\121\1\u1d96\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\25\121\1\u1d97\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\25\121\1\u1d98"+
+    "\14\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1d99\3\121"+
+    "\1\u040b\3\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u198c\15\121\1\112"+
+    "\10\0\6\121\1\0\5\121\1\u1d9a\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\22\121"+
+    "\1\u1d9b\17\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1d9c"+
+    "\3\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\2\121\1\u1d9d\10\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1d9e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\23\121"+
+    "\1\u1d9f\16\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\1\u1da0\5\121\1\u1da1\15\121\1\u0b17\1\u1da2\1\u1da3"+
+    "\13\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1da4\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u053e\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1da5\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\2\121\1\u1da6\10\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1da7\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1da8\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1da9\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1daa\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1dab\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1dac"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1dad\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1dae"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\24\121\1\u1daf\15\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u1d67\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1db0\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1db1"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1db2\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\6\121\1\u1108\4\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\3\121\1\u1db3\7\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1db4"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1db5\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1a0a\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1db6\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\7\121\1\u1db7\3\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121"+
+    "\1\u1db8\6\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\3\121\1\u1d49\7\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\3\121\1\u1db9\7\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\121\1\u1dba\11\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121"+
+    "\1\u1dbb\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1dbc\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1dbd\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1dbe\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1dbf\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\6\121"+
+    "\1\u1dc0\4\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1dc1\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\4\121\1\u1dc2\6\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\27\121\1\u1dc3\12\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1dc4\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\6\121\1\u05f9\4\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1dc5\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\11\121\1\u12d8\1\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1dc6"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\10\121\1\u1dc7\2\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\27\121\1\u1dc8\12\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1dc9\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1dca\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u17fe\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u1c50\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\26\121\1\u1dcb\13\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1dcc\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1dcd\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1dce\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1dcf\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\22\121\1\u1dd0"+
+    "\17\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1dd1\6\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\1\121"+
+    "\1\u1dd2\11\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\26\121\1\u1dd3\13\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\23\121\1\u1dd4"+
+    "\16\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\6\121\1\u1d1f\33\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\25\121\1\u1dd5\14\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\20\121\1\u1724\1\u18bb\20\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1dd6\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\24\121\1\u1dd7\15\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u1860\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\6\121\1\u1dd8\4\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\6\121\1\u1dd9\4\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\6\121\1\u1dda\4\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\5\121"+
+    "\1\u02c9\5\121\1\112\2\0\25\121\1\u0cd8\14\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u1ddb\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\5\121\1\u1ddc\5\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1ddd\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\4\121\1\u1d87\6\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\30\121\1\u1dde"+
+    "\11\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\20\121\1\u1ddf\21\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1de0\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1de1\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1de2\12\121\1\112\2\0\6\121\1\u1c87"+
+    "\33\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1de3\2\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1de4\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\12\121\1\u0c0b\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1de5\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\4\121\1\u1de6\6\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u105e"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1de7\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1de8\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u1860"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u1de9\10\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121"+
+    "\1\u1860\7\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\6\121\1\u141e\33\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\2\121\1\u176b\10\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1dea\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\23\121\1\u1deb\16\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1dec\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1ded\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\6\121\1\u1dee\4\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1def"+
+    "\7\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\5\121\1\u1df0\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1df1\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u1df2\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1df3\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\1\u1df4\1\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\30\121\1\u04ac\11\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\1\u1df5\12\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\21\121\1\u1df6"+
+    "\20\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1df7\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121\1\u1df8"+
+    "\2\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\3\121\1\u1df9\7\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\3\121\1\u1dfa\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\7\121\1\u1dfb\3\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1dfc\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1dfd\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\22\121\1\u1252\17\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1dfe\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1dff"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\1\u059b\12\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1e00\2\121\1\u0eba\7\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1e01\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1e02"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\7\121\1\u1e03\3\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1e04\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\6\121"+
+    "\1\u1e05\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\1\u1e06\1\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121"+
+    "\1\u1e07\10\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\21\121\1\u1e08\20\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\5\121\1\u1108\5\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\3\121\1\u1e09\7\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\22\121\1\u1e0a\17\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1e0b\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\12\121\1\u1e0c\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\26\121"+
+    "\1\u1e0d\13\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\26\121\1\u1e0e\13\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\26\121\1\u1e0f\13\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\1\u1e10\1\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\11\121\1\u1e11\1\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1e12\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1e13"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1e14\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1e15\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\10\121\1\u1e16\2\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\6\121\1\u1e17\33\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1e18\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\1\u1e19\1\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\7\121\1\u1e1a\3\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\2\121\1\u1e1b\10\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1e1c"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\10\121"+
+    "\1\u1e1d\2\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\24\121\1\u1418\15\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\10\121\1\u1e1e\2\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\1\u1e1f\12\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\2\121\1\u0f3b"+
+    "\10\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\1\u1136\1\121\1\0\4\121"+
+    "\14\0\13\121\1\112\2\0\42\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\10\121\1\u1e20\2\121\1\112\2\0\42\121\1\112"+
+    "\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121"+
+    "\1\0\4\121\14\0\13\121\1\112\2\0\1\u11e7\5\121"+
+    "\1\u11e7\33\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\4\121\1\u1e21"+
+    "\6\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\23\121\1\u1e22\16\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\11\121\1\u1e23\1\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\5\121\1\u1e24\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u1e25\1\121"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\23\121\1\u1e26\16\121\1\112\10\0\6\121"+
+    "\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121"+
+    "\14\0\1\u1e27\12\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\10\121\1\u1e28\2\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\1\u1e29\1\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\1\u1e2a\1\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\11\121\1\u0bd5"+
+    "\1\121\1\112\2\0\42\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u1e2b\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\13\121\1\112\2\0\24\121\1\u0d7f\15\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\13\121\1\112\2\0\31\121"+
+    "\1\u09f8\10\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\12\121\1\u1e2c"+
+    "\1\112\2\0\42\121\1\112\10\0\6\121\1\0\5\121"+
+    "\1\u1bf2\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\13\121\1\112\2\0\25\121\1\u0cd8\2\121\1\u0350\11\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\5\121\1\u0948\5\121\1\112"+
+    "\2\0\42\121\1\112\10\0\6\121\1\0\6\121\1\0"+
+    "\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112"+
+    "\2\0\22\121\1\u1e2d\17\121\1\112\10\0\6\121\1\0"+
+    "\6\121\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0"+
+    "\4\121\1\u04ef\6\121\1\112\2\0\42\121\1\112\10\0"+
+    "\6\121\1\0\6\121\1\0\1\112\1\u0108\2\121\1\0"+
+    "\4\121\14\0\2\121\1\u1e2e\10\121\1\112\2\0\42\121"+
+    "\1\112\10\0\6\121\1\0\6\121\1\0\1\112\1\u0108"+
+    "\2\121\1\0\4\121\14\0\1\u1e2f\12\121\1\112\2\0"+
+    "\42\121\1\112\10\0\6\121\1\0\6\121\1\0\1\112"+
+    "\1\u0108\2\121\1\0\4\121\14\0\13\121\1\112\2\0"+
+    "\23\121\1\u1e30\16\121\1\112\10\0\6\121\1\0\6\121"+
+    "\1\0\1\112\1\u0108\2\121\1\0\4\121\14\0\13\121"+
+    "\1\112\2\0\24\121\1\u1e31\15\121";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[697452];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_2, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_3, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_4, offset, result);
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_5, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\5\0\2\1\1\0\2\1\11\0\2\1\1\11\4\1"+
+    "\1\11\5\1\2\11\3\1\1\11\1\1\3\11\1\1"+
+    "\1\11\26\1\1\11\1\1\1\11\1\1\3\11\1\1"+
+    "\1\11\2\1\2\11\7\1\1\11\3\1\1\11\13\1"+
+    "\1\11\10\1\1\11\1\1\1\11\1\1\2\11\2\1"+
+    "\1\11\3\1\1\11\4\1\1\11\1\1\1\11\22\1"+
+    "\1\11\17\1\1\11\2\1\2\11\2\1\1\11\1\1"+
+    "\1\11\5\1\1\11\5\0\105\1\1\11\3\0\1\11"+
+    "\1\0\73\1\1\11\2\1\1\0\1\11\5\0\12\1"+
+    "\1\11\304\1\2\11\1\1\1\11\2\1\2\0\1\11"+
+    "\4\0\101\1\2\0\1\1\1\0\3\1\1\0\65\1"+
+    "\10\0\u0182\1\1\11\3\0\45\1\2\0\1\11\42\1"+
+    "\1\0\1\11\4\0\u01fa\1\1\11\2\0\25\1\1\11"+
+    "\1\0\25\1\4\0\u0282\1\1\0\14\1\2\0\u02b5\1"+
+    "\1\0\5\1\2\0\u02d5\1\1\0\2\1\2\0\u02a0\1"+
+    "\1\11\1\1\2\11\u0cb6\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[7729];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed HTML tag; thus a new line is beginning
+	 * still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to PHPTokenMaker; this signals that the user has
+	 * ended a line with an unclosed <code>&lt;script&gt;</code> tag.
+	 */
+	public static final int INTERNAL_INTAG_SCRIPT			= -4;
+
+	/**
+	 * Token type specifying we're in a double-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+	/**
+	 * Token type specifying we're in a single-qouted attribute in a
+	 * script tag.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+	/**
+	 * Token type specifying we're in JavaScript.
+	 */
+	public static final int INTERNAL_IN_JS					= -7;
+
+	/**
+	 * Token type specifying we're in a JavaScript multiline comment.
+	 */
+	public static final int INTERNAL_IN_JS_MLC				= -8;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_INVALID	= -9;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS string.
+	 */
+	public static final int INTERNAL_IN_JS_STRING_VALID		= -10;
+
+	/**
+	 * Token type specifying we're in an invalid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_INVALID	= -11;
+
+	/**
+	 * Token type specifying we're in a valid multi-line JS single-quoted string.
+	 */
+	public static final int INTERNAL_IN_JS_CHAR_VALID		= -12;
+
+	/**
+	 * Token type specifying we're in PHP.
+	 */
+	public static final int INTERNAL_IN_PHP					= -(1<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline comment.
+	 */
+	public static final int INTERNAL_IN_PHP_MLC				= -(2<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline string.
+	 */
+	public static final int INTERNAL_IN_PHP_STRING				= -(3<<11);
+
+	/**
+	 * Token type specifying we're in a PHP multiline char.
+	 */
+	public static final int INTERNAL_IN_PHP_CHAR				= -(4<<11);
+
+	/**
+	 * Whether closing markup tags are automatically completed for PHP.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * The state PHP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+	 */
+	private int phpInState;
+
+	/**
+	 * When in the JS_STRING state, whether the current string is valid.
+	 */
+	private boolean validJSString;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PHPTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.FUNCTION || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		phpInState = YYINITIAL; // Shouldn't be necessary
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				start = text.offset;
+				break;
+			case Token.VARIABLE:
+				state = DTD;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				start = text.offset;
+				break;
+			case INTERNAL_INTAG_SCRIPT:
+				state = INTAG_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+				state = INATTR_DOUBLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+				state = INATTR_SINGLE_SCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS:
+				state = JAVASCRIPT;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_MLC:
+				state = JS_MLC;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_INVALID:
+				state = JS_STRING;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_STRING_VALID:
+				state = JS_STRING;
+				validJSString = true;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_INVALID:
+				state = JS_CHAR;
+				validJSString = false;
+				start = text.offset;
+				break;
+			case INTERNAL_IN_JS_CHAR_VALID:
+				state = JS_CHAR;
+				validJSString = true;
+				start = text.offset;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_PHPxxx - phpInState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_PHP:
+							state = PHP;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_PHP_MLC:
+							state = PHP_MLC;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_PHP_STRING:
+							state = PHP_STRING;
+							start = text.offset;
+							break;
+						case INTERNAL_IN_PHP_CHAR:
+							state = PHP_CHAR;
+							start = text.offset;
+							break;
+					}
+					phpInState = -initialTokenType&0xff;
+				}
+				else {
+					state = Token.NULL;
+				}
+				break;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.  You might not want
+	 * this to be the case, since some tags in standard HTML aren't usually
+	 * closed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public PHPTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public PHPTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 204) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 71: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 84: break;
+        case 57: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 85: break;
+        case 9: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.VARIABLE);
+          }
+        case 86: break;
+        case 23: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+          }
+        case 87: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 88: break;
+        case 32: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_CHAR);
+									addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+								}
+								return firstToken;
+          }
+        case 89: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 90: break;
+        case 41: 
+          { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+          }
+        case 91: break;
+        case 80: 
+          { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+								  start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+          }
+        case 92: break;
+        case 37: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+          }
+        case 93: break;
+        case 68: 
+          { addToken(Token.FUNCTION);
+          }
+        case 94: break;
+        case 73: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE);
+          }
+        case 95: break;
+        case 34: 
+          { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 96: break;
+        case 54: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+          }
+        case 97: break;
+        case 61: 
+          { /* Skip all escaped chars. */
+          }
+        case 98: break;
+        case 81: 
+          { yybegin(YYINITIAL);
+								  addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+								  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+								  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 99: break;
+        case 40: 
+          { start = zzMarkedPos-1; yybegin(PHP_STRING);
+          }
+        case 100: break;
+        case 16: 
+          { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+          }
+        case 101: break;
+        case 19: 
+          { /* Allowing "<?" and "<?php" to start PHP */
+          }
+        case 102: break;
+        case 63: 
+          { /* Invalid latin-1 character \xXX */ validJSString = false;
+          }
+        case 103: break;
+        case 35: 
+          { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 104: break;
+        case 77: 
+          { addToken(Token.COMMENT_MULTILINE);
+          }
+        case 105: break;
+        case 50: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 106: break;
+        case 46: 
+          { /* Skip escaped chars. */
+          }
+        case 107: break;
+        case 62: 
+          { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+          }
+        case 108: break;
+        case 64: 
+          { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 109: break;
+        case 26: 
+          { addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 110: break;
+        case 39: 
+          { addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+          }
+        case 111: break;
+        case 31: 
+          { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 112: break;
+        case 14: 
+          { addToken(Token.OPERATOR);
+          }
+        case 113: break;
+        case 75: 
+          { start = zzMarkedPos-4; yybegin(COMMENT);
+          }
+        case 114: break;
+        case 52: 
+          { addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP);
+          }
+        case 115: break;
+        case 66: 
+          { addToken(Token.VARIABLE);
+          }
+        case 116: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 117: break;
+        case 53: 
+          { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP);
+          }
+        case 118: break;
+        case 76: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 119: break;
+        case 79: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 120: break;
+        case 48: 
+          { /* Skip escaped single quotes only, but this should still work. */
+          }
+        case 121: break;
+        case 65: 
+          { start = zzMarkedPos-2; yybegin(PHP_MLC);
+          }
+        case 122: break;
+        case 82: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 123: break;
+        case 27: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+          }
+        case 124: break;
+        case 43: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken;
+          }
+        case 125: break;
+        case 33: 
+          { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+          }
+        case 126: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 127: break;
+        case 69: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.FUNCTION);
+									zzMarkedPos -= (count-1); //yypushback(count-1);
+          }
+        case 128: break;
+        case 30: 
+          { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+          }
+        case 129: break;
+        case 22: 
+          { yybegin(JAVASCRIPT); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 130: break;
+        case 24: 
+          { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT);
+          }
+        case 131: break;
+        case 74: 
+          { boolean highlightedAsRegex = false;
+			if (firstToken==null) {
+				addToken(Token.REGEX);
+				highlightedAsRegex = true;
+			}
+			else {
+				// If this is *likely* to be a regex, based on
+				// the previous token, highlight it as such.
+				Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+				if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+					addToken(Token.REGEX);
+					highlightedAsRegex = true;
+				}
+			}
+			// If it doesn't *appear* to be a regex, highlight it as
+			// individual tokens.
+			if (!highlightedAsRegex) {
+				int temp = zzStartRead + 1;
+				addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+				zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+			}
+
+          }
+        case 132: break;
+        case 56: 
+          { start = zzMarkedPos-2; yybegin(JS_MLC);
+          }
+        case 133: break;
+        case 59: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 134: break;
+        case 70: 
+          { yybegin(PHP); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 135: break;
+        case 45: 
+          { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 136: break;
+        case 25: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 137: break;
+        case 78: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 138: break;
+        case 17: 
+          { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+          }
+        case 139: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 140: break;
+        case 60: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 141: break;
+        case 47: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken;
+          }
+        case 142: break;
+        case 11: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 143: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+          }
+        case 144: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 145: break;
+        case 67: 
+          { addToken(Token.SEPARATOR); start = zzMarkedPos; yybegin(phpInState);
+          }
+        case 146: break;
+        case 83: 
+          { yybegin(YYINITIAL);
+							  int temp = zzStartRead;
+							  addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+							  addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+							  addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+							  addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+          }
+        case 147: break;
+        case 6: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 148: break;
+        case 49: 
+          { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 149: break;
+        case 29: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 150: break;
+        case 72: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									zzMarkedPos -= (count-2); //yypushback(count-2);
+									yybegin(INTAG_CHECK_TAG_NAME);
+          }
+        case 151: break;
+        case 18: 
+          { addToken(Token.MARKUP_TAG_NAME);
+          }
+        case 152: break;
+        case 10: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 153: break;
+        case 42: 
+          { start = zzMarkedPos-1; yybegin(PHP_CHAR);
+          }
+        case 154: break;
+        case 44: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken;
+          }
+        case 155: break;
+        case 55: 
+          { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+          }
+        case 156: break;
+        case 36: 
+          { /* Line ending in '\' => continue to next line. */
+								if (validJSString) {
+									addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+									addEndToken(INTERNAL_IN_JS_STRING_VALID);
+								}
+								else {
+									addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+									addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+								}
+								return firstToken;
+          }
+        case 157: break;
+        case 58: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 158: break;
+        case 15: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 159: break;
+        case 12: 
+          { addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 160: break;
+        case 28: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 161: break;
+        case 51: 
+          { start = zzMarkedPos-2; yybegin(DTD);
+          }
+        case 162: break;
+        case 20: 
+          { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG);
+          }
+        case 163: break;
+        case 21: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+          }
+        case 164: break;
+        case 38: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+          }
+        case 165: break;
+        case 1: 
+          { 
+          }
+        case 166: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case PHP: {
+              addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+            }
+            case 7730: break;
+            case INATTR_SINGLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 7731: break;
+            case JS_CHAR: {
+              addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7732: break;
+            case JS_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+            }
+            case 7733: break;
+            case INTAG_SCRIPT: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+            }
+            case 7734: break;
+            case PHP_MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken;
+            }
+            case 7735: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 7736: break;
+            case INATTR_DOUBLE_SCRIPT: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+            }
+            case 7737: break;
+            case PHP_STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken;
+            }
+            case 7738: break;
+            case JAVASCRIPT: {
+              addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7739: break;
+            case INTAG: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 7740: break;
+            case INTAG_CHECK_TAG_NAME: {
+              addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+            }
+            case 7741: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.VARIABLE); return firstToken;
+            }
+            case 7742: break;
+            case PHP_CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken;
+            }
+            case 7743: break;
+            case JS_EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7744: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 7745: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 7746: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 7747: break;
+            case JS_STRING: {
+              addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+            }
+            case 7748: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex	(revision 25584)
@@ -0,0 +1,810 @@
+/*
+ * 01/26/2008
+ *
+ * PerlTokenMaker.java - Scanner for Perl
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Perl.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PerlTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class PerlTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -3;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -4;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals we are in a POD
+	 * block.
+	 */
+	public static final int INTERNAL_POD						= -5;
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PerlTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return super.getMarkOccurrencesOfTokenType(type) || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_POD:
+				state = POD;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		// We basically try to mimic Eclipse's JS editor's behavior here.
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='[' ||
+					ch=='!' ||
+					ch=='&'
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+/*Escape							= ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)))*/
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
+IdentifierStart					= ({Letter}|"_")
+IdentifierPart						= ({IdentifierStart}|{Digit})
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+LineCommentBegin			= "#"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;:,.])
+
+VariableStart				= ([\$\@\%)]"$"?)
+BracedVariable				= ({VariableStart}\{{Identifier}\})
+UnbracedVariable			= ({VariableStart}{Identifier})
+BracedShellVariable			= ([\$]\{[\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)\}])
+UnbracedShellVariable		= ([\$][\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)])
+MatchVariable				= ([\$]{Digit})
+Variable					= ({BracedVariable}|{UnbracedVariable}|{BracedShellVariable}|{UnbracedShellVariable}|{MatchVariable})
+Regex						= ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[msixpogcadlu]*)
+
+NonAssignmentOperator		= ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>"|"->")
+AssignmentOperator			= ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+BindingOperator				= ("=~"|"!~")
+FunnyOperator				= (([\*][\'\"])|([\&][\'\"]))
+Operator					= ({NonAssignmentOperator}|{AssignmentOperator}|{BindingOperator}|{FunnyOperator})
+
+PodCommandsExceptCut		= ("="("pod"|"head1"|"head2"|"head3"|"head4"|"over"|"item"|"back"|"begin"|"end"|"for"|"encoding"))
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+
+%state STRING
+%state CHAR_LITERAL
+%state BACKTICKS
+%state HEREDOC_EOF_UNQUOTED
+%state HEREDOC_EOF_SINGLE_QUOTED
+%state HEREDOC_EOT_UNQUOTED
+%state HEREDOC_EOT_SINGLE_QUOTED
+%state POD
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"and" |
+	"cmp" |
+	"continue" |
+	"do" |
+	"else" |
+	"elsif" |
+	"eq" |
+	"esac" |
+	"for" |
+	"foreach" |
+	"ge" |
+	"if" |
+	"last" |
+	"le" |
+	"ne" |
+	"next" |
+	"not" |
+	"or" |
+	"redo" |
+	"sub" |
+	"unless" |
+	"until" |
+	"while" |
+	"xor"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Standard Functions */
+	"abs" |
+	"accept" |
+	"alarm" |
+	"atan2" |
+	"bind" |
+	"binmode" |
+	"bless" |
+	"caller" |
+	"chdir" |
+	"chmod" |
+	"chomp" |
+	"chop" |
+	"chown" |
+	"chr" |
+	"chroot" |
+	"close" |
+	"closedir" |
+	"connect" |
+	"cos" |
+	"crypt" |
+	"dbmclose" |
+	"dbmopen" |
+	"defined" |
+	"delete" |
+	"die" |
+	"dump" |
+	"each" |
+	"endgrent" |
+	"endhostent" |
+	"endnetent" |
+	"endprotoent" |
+	"endpwent" |
+	"endservent" |
+	"eof" |
+	"eval" |
+	"exec" |
+	"exists" |
+	"exit" |
+	"exp" |
+	"fcntl" |
+	"fileno" |
+	"flock" |
+	"fork" |
+	"formline" |
+	"getc" |
+	"getgrent" |
+	"getgrgid" |
+	"getgrnam" |
+	"gethostbyaddr" |
+	"gethostbyname" |
+	"gethostent" |
+	"getlogin" |
+	"getnetbyaddr" |
+	"getnetbyname" |
+	"getnetent" |
+	"getpeername" |
+	"getpgrp" |
+	"getppid" |
+	"getpriority" |
+	"getprotobyname" |
+	"getprotobynumber" |
+	"getprotoent" |
+	"getpwent" |
+	"getpwnam" |
+	"getpwuid" |
+	"getservbyname" |
+	"getservbyport" |
+	"getservent" |
+	"getsockname" |
+	"getsockopt" |
+	"glob" |
+	"gmtime" |
+	"goto" |
+	"grep" |
+	"hex" |
+	"index" |
+	"int" |
+	"ioctl" |
+	"join" |
+	"keys" |
+	"kill" |
+	"last" |
+	"lc" |
+	"lcfirst" |
+	"length" |
+	"link" |
+	"listen" |
+	"local" |
+	"localtime" |
+	"log" |
+	"lstat" |
+	"map" |
+	"mkdir" |
+	"msgctl" |
+	"msgget" |
+	"msgrcv" |
+	"msgsnd" |
+	"my" |
+	"next" |
+	"no" |
+	"oct" |
+	"open" |
+	"opendir" |
+	"ord" |
+	"our" |
+	"pack" |
+	"package" |
+	"pipe" |
+	"pop" |
+	"pos" |
+	"print" |
+	"printf" |
+	"prototype" |
+	"push" |
+	"quotemeta" |
+	"rand" |
+	"read" |
+	"readdir" |
+	"readline" |
+	"readlink" |
+	"readpipe" |
+	"recv" |
+	"redo" |
+	"ref" |
+	"rename" |
+	"require" |
+	"reset" |
+	"return" |
+	"reverse" |
+	"rewinddir" |
+	"rindex" |
+	"rmdir" |
+	"scalar" |
+	"seek" |
+	"seekdir" |
+	"select" |
+	"semctl" |
+	"semget" |
+	"semop" |
+	"send" |
+	"sethostent" |
+	"setgrent" |
+	"setnetent" |
+	"setpgrp" |
+	"setpriority" |
+	"setprotoent" |
+	"setpwent" |
+	"setservent" |
+	"setsockopt" |
+	"shift" |
+	"shmctl" |
+	"shmget" |
+	"shmread" |
+	"shmwrite" |
+	"shutdown" |
+	"sin" |
+	"sleep" |
+	"socket" |
+	"socketpair" |
+	"sort" |
+	"splice" |
+	"split" |
+	"sprintf" |
+	"sqrt" |
+	"srand" |
+	"stat" |
+	"study" |
+	"sub" |
+	"substr" |
+	"symlink" |
+	"syscall" |
+	"sysopen" |
+	"sysread" |
+	"sysseek" |
+	"system" |
+	"syswrite" |
+	"tell" |
+	"telldir" |
+	"tie" |
+	"tied" |
+	"time" |
+	"times" |
+	"truncate" |
+	"uc" |
+	"ucfirst" |
+	"umask" |
+	"undef" |
+	"unlink" |
+	"unpack" |
+	"unshift" |
+	"untie" |
+	"use" |
+	"utime" |
+	"values" |
+	"vec" |
+	"wait" |
+	"waitpid" |
+	"wantarray" |
+	"warn" |
+	"write"			{ addToken(Token.FUNCTION); }
+
+}
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+	{Variable}					{ addToken(Token.VARIABLE); }
+
+	/* String/Character literals. */
+	\"							{ start = zzMarkedPos-1; yybegin(STRING); }
+	\'							{ start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+	\`							{ start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+	/* Comment literals. */
+	{LineCommentBegin}"!".*			{ addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Easily identifiable regexes of the form "/.../". This is not foolproof. */
+	{Regex}		{
+					boolean highlightedAsRegex = false;
+					if (firstToken==null) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+					else {
+						// If this is *likely* to be a regex, based on
+						// the previous token, highlight it as such.
+						Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+						if (regexCanFollow(t)) {
+							addToken(Token.REGEX);
+							highlightedAsRegex = true;
+						}
+					}
+					// If it doesn't *appear* to be a regex, highlight it as
+					// individual tokens.
+					if (!highlightedAsRegex) {
+						int temp = zzStartRead + 1;
+						addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+						zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+					}
+				}
+
+	/* More regexes (m/.../, s!...!!, etc.).  This is nowhere near */
+	/* exhaustive, but is rather just the common ones.             */
+	m"/"[^/]*"/"[msixpodualgc]*				{ addToken(Token.REGEX); }
+	m"!"[^!]*"!"[msixpodualgc]*				{ addToken(Token.REGEX); }
+	m"|"[^\|]*"|"[msixpodualgc]*			{ addToken(Token.REGEX); }
+	m\\[^\\]*\\[msixpodualgc]*				{ addToken(Token.REGEX); }
+	s"/"[^/]*"/"[^/]*"/"[msixpodualgcer]*	{ addToken(Token.REGEX); }
+	s"!"[^!]*"!"[^!]*"!"[msixpodualgcer]*	{ addToken(Token.REGEX); }
+	s"|"[^\|]*"|"[^\|]*"|"[msixpodualgcer]*	{ addToken(Token.REGEX); }
+	(tr|y)"/"[^/]*"/"[^/]*"/"[cdsr]*		{ addToken(Token.REGEX); }
+	(tr|y)"!"[^!]*"!"[^!]*"!"[cdsr]*		{ addToken(Token.REGEX); }
+	(tr|y)"|"[^\|]*"|"[^\|]*"|"[cdsr]*		{ addToken(Token.REGEX); }
+	(tr|y)\\[^\\]*\\[^\\]*\\[cdsr]*		{ addToken(Token.REGEX); }
+	qr"/"[^/]*"/"[msixpodual]*			{ addToken(Token.REGEX); }
+	qr"!"[^/]*"!"[msixpodual]*			{ addToken(Token.REGEX); }
+	qr"|"[^/]*"|"[msixpodual]*			{ addToken(Token.REGEX); }
+	qr\\[^/]*\\[msixpodual]*			{ addToken(Token.REGEX); }
+
+	/* "Here-document" syntax.  This is only implemented for the common */
+	/* cases.                                                           */
+	"<<EOF"						{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOF"\"		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOF"\'		{ start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOF"\`		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<EOT"						{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOT"\"		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOT"\'		{ start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOT"\`		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+
+	/* POD commands. */
+	{PodCommandsExceptCut}			{ addToken(Token.COMMENT_EOL); start = zzMarkedPos; yybegin(POD); }
+
+	/* Separators and operators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<STRING> {
+	[^\n\\\$\@\%\"]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?					{ /* Skip escaped single quotes only, but this should still work. */ }
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	\'					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+	[^\n\\\$\@\%\`]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	\`					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<HEREDOC_EOF_UNQUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOF, double quoted       */
+	/* <<"EOF" and backticks <<`EOF`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\\$\@\%]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_UNQUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOT, double quoted       */
+	/* <<"EOT" and backticks <<`EOT`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\\$\@\%]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	{Variable}			{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	{VariableStart}		{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOT and any other chars.                                         */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<POD> {
+	[^\n\=]+				{}
+	"=cut"				{ if (start==zzStartRead) { addToken(Token.COMMENT_DOCUMENTATION); yybegin(YYINITIAL); } }
+	{PodCommandsExceptCut}	{ if (start==zzStartRead) { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; } }
+	=					{}
+	\n |
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken; }
+}
+
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java	(revision 25584)
@@ -0,0 +1,2106 @@
+/* The following code was generated by JFlex 1.4.1 on 3/11/12 12:58 AM */
+
+/*
+ * 01/26/2008
+ *
+ * PerlTokenMaker.java - Scanner for Perl
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Perl.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated PerlTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class PerlTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int HEREDOC_EOF_SINGLE_QUOTED = 5;
+  public static final int HEREDOC_EOT_SINGLE_QUOTED = 7;
+  public static final int HEREDOC_EOT_UNQUOTED = 6;
+  public static final int STRING = 1;
+  public static final int BACKTICKS = 3;
+  public static final int YYINITIAL = 0;
+  public static final int HEREDOC_EOF_UNQUOTED = 4;
+  public static final int CHAR_LITERAL = 2;
+  public static final int POD = 8;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\12\1\11\1\0\1\12\1\6\22\0\1\12\1\46\1\102"+
+    "\1\7\1\26\1\24\1\50\1\53\1\21\1\25\1\33\1\41\1\22"+
+    "\1\17\1\20\1\32\1\3\1\61\1\62\1\61\1\61\3\5\2\2"+
+    "\1\22\1\22\1\42\1\43\1\45\1\47\1\23\3\4\1\15\1\16"+
+    "\1\104\5\1\1\14\2\1\1\103\4\1\1\105\3\1\1\13\2\1"+
+    "\1\21\1\10\1\21\1\44\1\1\1\31\1\60\1\70\1\35\1\40"+
+    "\1\57\1\74\1\72\1\56\1\65\1\101\1\71\1\37\1\67\1\73"+
+    "\1\55\1\54\1\76\1\64\1\34\1\66\1\75\1\63\1\77\1\36"+
+    "\1\100\1\1\1\27\1\52\1\30\1\51\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\11\0\1\1\1\2\2\3\1\1\1\4\1\5\1\6"+
+    "\1\7\1\2\1\10\1\2\1\1\1\7\1\10\1\1"+
+    "\1\11\2\7\5\2\10\7\1\12\24\2\1\13\1\14"+
+    "\1\15\1\16\3\14\1\17\1\14\1\20\1\21\1\22"+
+    "\1\14\1\23\3\14\1\24\1\14\1\25\5\14\1\26"+
+    "\1\14\1\27\1\14\1\30\2\14\1\31\1\14\1\32"+
+    "\1\3\1\33\1\32\1\33\1\32\1\34\1\32\1\4"+
+    "\1\35\1\36\1\1\1\0\1\36\1\0\3\36\3\0"+
+    "\1\7\1\0\2\2\2\0\22\2\1\37\1\2\1\40"+
+    "\2\2\1\40\4\2\10\0\1\7\7\2\1\40\31\2"+
+    "\1\1\1\0\1\2\2\0\1\2\1\37\6\2\1\40"+
+    "\2\2\1\37\1\40\14\2\1\1\3\0\1\2\1\15"+
+    "\1\41\1\14\1\0\2\41\1\0\1\20\1\42\1\14"+
+    "\1\0\2\42\1\0\1\14\1\43\1\14\1\0\2\43"+
+    "\1\0\3\14\10\0\1\33\1\0\2\34\1\0\1\44"+
+    "\1\0\1\2\2\0\14\2\1\40\6\2\1\37\15\2"+
+    "\15\0\33\2\1\37\1\2\1\0\2\45\7\2\1\40"+
+    "\10\2\1\1\3\0\5\2\1\0\1\1\5\0\1\46"+
+    "\1\0\1\46\11\0\1\45\10\2\1\37\26\2\4\0"+
+    "\1\47\5\0\1\37\11\2\1\37\5\2\1\37\17\2"+
+    "\1\0\4\45\2\2\1\37\1\2\1\0\2\45\1\50"+
+    "\1\51\5\0\16\2\1\37\2\2\1\52\1\53\6\0"+
+    "\2\2\1\37\25\2\1\45\2\2\3\0\1\37\7\2"+
+    "\7\0\14\2\1\0\4\2\1\54\1\55\1\0\10\2"+
+    "\1\0\1\2\1\0\4\2\1\0\12\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[601];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\106\0\214\0\322\0\u0118\0\u015e\0\u01a4\0\u01ea"+
+    "\0\u0230\0\u0276\0\u02bc\0\u0302\0\u0348\0\u038e\0\u03d4\0\u038e"+
+    "\0\u041a\0\u0460\0\u04a6\0\u038e\0\u038e\0\u04ec\0\u0532\0\u0578"+
+    "\0\u05be\0\u038e\0\u0604\0\u064a\0\u0690\0\u06d6\0\u071c\0\u0762"+
+    "\0\u07a8\0\u07ee\0\u0834\0\u087a\0\u08c0\0\u0906\0\u094c\0\u038e"+
+    "\0\u0992\0\u038e\0\u09d8\0\u0a1e\0\u0a64\0\u0aaa\0\u0af0\0\u0b36"+
+    "\0\u0b7c\0\u0bc2\0\u0c08\0\u0c4e\0\u0c94\0\u0cda\0\u0d20\0\u0d66"+
+    "\0\u0dac\0\u0df2\0\u0e38\0\u0e7e\0\u0ec4\0\u0f0a\0\u038e\0\u0f50"+
+    "\0\u0f96\0\u038e\0\u0fdc\0\u1022\0\u1068\0\u038e\0\u10ae\0\u10f4"+
+    "\0\u038e\0\u038e\0\u113a\0\u038e\0\u1180\0\u11c6\0\u120c\0\u038e"+
+    "\0\u1252\0\u038e\0\u1298\0\u12de\0\u1324\0\u136a\0\u13b0\0\u038e"+
+    "\0\u13f6\0\u038e\0\u143c\0\u038e\0\u1482\0\u14c8\0\u038e\0\u150e"+
+    "\0\u1554\0\u1554\0\u1554\0\u159a\0\u15e0\0\u1626\0\u166c\0\u16b2"+
+    "\0\u16f8\0\u173e\0\u1784\0\u17ca\0\u1810\0\u1856\0\u189c\0\u0276"+
+    "\0\u038e\0\u17ca\0\u18e2\0\u1928\0\u196e\0\u1928\0\u19b4\0\u19fa"+
+    "\0\u1a40\0\u1a86\0\u1acc\0\u1b12\0\u1b58\0\u1b9e\0\u1be4\0\u1c2a"+
+    "\0\u1c70\0\u1cb6\0\u1cfc\0\u1d42\0\u1d88\0\u1dce\0\u1e14\0\u1e5a"+
+    "\0\u1ea0\0\u1ee6\0\u1f2c\0\u1f72\0\u1fb8\0\u1ffe\0\u2044\0\u208a"+
+    "\0\u20d0\0\u2116\0\u02bc\0\u215c\0\u21a2\0\u21e8\0\u222e\0\u2274"+
+    "\0\u22ba\0\u2300\0\u2346\0\u238c\0\u23d2\0\u2418\0\u245e\0\u24a4"+
+    "\0\u24ea\0\u2530\0\u2576\0\u25bc\0\u2602\0\u2648\0\u268e\0\u26d4"+
+    "\0\u271a\0\u2760\0\u27a6\0\u27ec\0\u2832\0\u2878\0\u28be\0\u2904"+
+    "\0\u294a\0\u2990\0\u29d6\0\u2a1c\0\u2a62\0\u2aa8\0\u2aee\0\u2b34"+
+    "\0\u2b7a\0\u2bc0\0\u2c06\0\u2c4c\0\u2c92\0\u2cd8\0\u2d1e\0\u2d64"+
+    "\0\u2daa\0\u2df0\0\u2e36\0\u2e7c\0\u2ec2\0\u2f08\0\u2f4e\0\u02bc"+
+    "\0\u2f94\0\u2fda\0\u3020\0\u3066\0\u30ac\0\u30f2\0\u3138\0\u317e"+
+    "\0\u31c4\0\u320a\0\u3250\0\u3296\0\u32dc\0\u3322\0\u3368\0\u33ae"+
+    "\0\u33f4\0\u343a\0\u3480\0\u34c6\0\u350c\0\u3552\0\u3598\0\u35de"+
+    "\0\u3624\0\u366a\0\u36b0\0\u36f6\0\u038e\0\u373c\0\u3782\0\u37c8"+
+    "\0\u038e\0\u3782\0\u380e\0\u038e\0\u3854\0\u389a\0\u38e0\0\u038e"+
+    "\0\u389a\0\u3926\0\u396c\0\u39b2\0\u39f8\0\u3a3e\0\u038e\0\u39f8"+
+    "\0\u3a84\0\u3aca\0\u3b10\0\u3b56\0\u3b9c\0\u3be2\0\u3c28\0\u3c6e"+
+    "\0\u3cb4\0\u3cfa\0\u3d40\0\u3d86\0\u3dcc\0\u3e12\0\u1554\0\u3e58"+
+    "\0\u3e9e\0\u3ee4\0\u3f2a\0\u3f70\0\u3fb6\0\u3ffc\0\u4042\0\u4088"+
+    "\0\u40ce\0\u4114\0\u415a\0\u41a0\0\u41e6\0\u422c\0\u4272\0\u42b8"+
+    "\0\u26d4\0\u42fe\0\u4344\0\u438a\0\u43d0\0\u4416\0\u445c\0\u44a2"+
+    "\0\u44e8\0\u452e\0\u4574\0\u45ba\0\u4600\0\u4646\0\u468c\0\u46d2"+
+    "\0\u4718\0\u320a\0\u475e\0\u47a4\0\u47ea\0\u4830\0\u4876\0\u48bc"+
+    "\0\u4902\0\u4948\0\u498e\0\u49d4\0\u4a1a\0\u4a60\0\u4aa6\0\u4aec"+
+    "\0\u4b32\0\u4b78\0\u4bbe\0\u4c04\0\u4c4a\0\u4c90\0\u4cd6\0\u4d1c"+
+    "\0\u4d62\0\u4da8\0\u4dee\0\u4e34\0\u4e7a\0\u4ec0\0\u4f06\0\u4f4c"+
+    "\0\u4f92\0\u4fd8\0\u501e\0\u5064\0\u50aa\0\u50f0\0\u5136\0\u517c"+
+    "\0\u51c2\0\u5208\0\u524e\0\u5294\0\u52da\0\u5320\0\u5366\0\u26d4"+
+    "\0\u53ac\0\u53f2\0\u5438\0\u547e\0\u54c4\0\u550a\0\u5550\0\u5596"+
+    "\0\u55dc\0\u5622\0\u5668\0\u56ae\0\u56f4\0\u573a\0\u5780\0\u57c6"+
+    "\0\u580c\0\u5852\0\u5898\0\u58de\0\u5924\0\u596a\0\u59b0\0\u59f6"+
+    "\0\u5a3c\0\u5a82\0\u5ac8\0\u5b0e\0\u5b54\0\u5b9a\0\u5be0\0\u5c26"+
+    "\0\u5c6c\0\u5cb2\0\u5cf8\0\u5d3e\0\u1252\0\u5d84\0\u13b0\0\u5dca"+
+    "\0\u5e10\0\u5e56\0\u5e9c\0\u5ee2\0\u5f28\0\u5f6e\0\u5fb4\0\u5ffa"+
+    "\0\u6040\0\u6086\0\u60cc\0\u6112\0\u6158\0\u619e\0\u61e4\0\u622a"+
+    "\0\u6270\0\u2c4c\0\u62b6\0\u62fc\0\u6342\0\u6388\0\u63ce\0\u6414"+
+    "\0\u645a\0\u64a0\0\u64e6\0\u652c\0\u6572\0\u65b8\0\u65fe\0\u6644"+
+    "\0\u668a\0\u66d0\0\u6716\0\u675c\0\u67a2\0\u67e8\0\u682e\0\u6874"+
+    "\0\u68ba\0\u6900\0\u6946\0\u698c\0\u038e\0\u69d2\0\u6a18\0\u6a5e"+
+    "\0\u6aa4\0\u6aea\0\u6b30\0\u6b76\0\u6bbc\0\u6c02\0\u6c48\0\u6c8e"+
+    "\0\u6cd4\0\u6d1a\0\u6d60\0\u6da6\0\u6dec\0\u6e32\0\u6e78\0\u6ebe"+
+    "\0\u6f04\0\u6f4a\0\u2a62\0\u6f90\0\u6fd6\0\u701c\0\u7062\0\u70a8"+
+    "\0\u70ee\0\u7134\0\u717a\0\u71c0\0\u7206\0\u724c\0\u7292\0\u72d8"+
+    "\0\u731e\0\u7364\0\u73aa\0\u73f0\0\u7436\0\u747c\0\u74c2\0\u7508"+
+    "\0\u754e\0\u7594\0\u75da\0\u7620\0\u7666\0\u76ac\0\u038e\0\u038e"+
+    "\0\u76f2\0\u7738\0\u777e\0\u77c4\0\u780a\0\u7850\0\u7896\0\u78dc"+
+    "\0\u7922\0\u7968\0\u79ae\0\u79f4\0\u7a3a\0\u7a80\0\u7ac6\0\u7b0c"+
+    "\0\u7b52\0\u7b98\0\u7bde\0\u31c4\0\u7c24\0\u7c6a\0\u038e\0\u038e"+
+    "\0\u7cb0\0\u7cf6\0\u7d3c\0\u7d82\0\u7dc8\0\u7e0e\0\u7e54\0\u7e9a"+
+    "\0\u2878\0\u7ee0\0\u7f26\0\u7f6c\0\u7fb2\0\u7ff8\0\u803e\0\u8084"+
+    "\0\u80ca\0\u8110\0\u8156\0\u819c\0\u81e2\0\u8228\0\u826e\0\u82b4"+
+    "\0\u82fa\0\u8340\0\u8386\0\u83cc\0\u8412\0\u8458\0\u849e\0\u84e4"+
+    "\0\u852a\0\u8570\0\u85b6\0\u85fc\0\u8642\0\u8688\0\u86ce\0\u8714"+
+    "\0\u875a\0\u87a0\0\u87e6\0\u882c\0\u8872\0\u88b8\0\u88fe\0\u8944"+
+    "\0\u898a\0\u89d0\0\u8a16\0\u8a5c\0\u8aa2\0\u8ae8\0\u8b2e\0\u8b74"+
+    "\0\u8bba\0\u8c00\0\u8c46\0\u8c8c\0\u8cd2\0\u8d18\0\u8d5e\0\u8da4"+
+    "\0\u8dea\0\u8e30\0\u8e76\0\u8ebc\0\u038e\0\u038e\0\u8f02\0\u8f48"+
+    "\0\u8f8e\0\u8fd4\0\u901a\0\u9060\0\u90a6\0\u90ec\0\u9132\0\u9178"+
+    "\0\u91be\0\u9204\0\u924a\0\u9290\0\u92d6\0\u931c\0\u9362\0\u93a8"+
+    "\0\u93ee\0\u9434\0\u947a\0\u94c0\0\u9506\0\u954c\0\u9592\0\u95d8"+
+    "\0\u961e";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[601];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\12\1\13\1\14\1\15\1\13\1\14\1\16\1\17"+
+    "\1\12\1\20\1\21\4\13\1\22\1\23\1\24\1\25"+
+    "\1\26\1\27\1\30\1\31\2\24\1\32\1\33\1\34"+
+    "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+
+    "\1\45\1\46\1\47\1\50\1\51\1\50\1\45\1\52"+
+    "\1\53\1\54\1\55\1\56\1\57\2\14\1\60\1\61"+
+    "\1\62\1\63\1\64\1\65\1\66\1\67\1\70\1\71"+
+    "\1\72\1\73\1\74\1\75\1\76\1\77\3\13\10\100"+
+    "\1\101\1\102\11\100\2\103\1\104\1\105\53\100\1\106"+
+    "\3\100\10\107\1\110\1\111\41\107\1\112\32\107\10\113"+
+    "\1\101\1\114\11\113\2\115\1\116\1\117\2\113\1\120"+
+    "\54\113\10\121\1\101\1\122\4\121\1\123\4\121\2\124"+
+    "\1\125\1\126\57\121\10\127\1\101\1\130\4\127\1\131"+
+    "\67\127\10\121\1\101\1\132\4\121\1\133\4\121\2\124"+
+    "\1\125\1\126\57\121\10\127\1\101\1\134\4\127\1\135"+
+    "\67\127\11\136\1\137\31\136\1\140\42\136\6\12\1\0"+
+    "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+    "\5\12\13\0\26\12\1\0\4\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\26\13\1\0\3\13\2\141\2\14\1\141\1\14"+
+    "\1\0\2\141\2\0\1\141\1\142\1\143\1\144\1\0"+
+    "\1\145\2\0\1\141\2\0\1\141\5\0\3\141\1\142"+
+    "\1\143\13\0\3\141\1\144\1\141\2\14\11\141\1\143"+
+    "\5\141\1\0\1\141\1\143\3\141\1\146\1\147\1\141"+
+    "\1\147\1\0\2\141\2\0\1\150\1\142\1\143\1\144"+
+    "\1\0\1\145\2\0\1\141\2\0\1\141\5\0\2\141"+
+    "\1\150\1\142\1\143\13\0\3\141\1\144\1\141\2\147"+
+    "\11\141\1\143\5\141\1\0\1\141\1\143\1\141\106\0"+
+    "\11\151\1\0\34\151\1\152\37\151\12\0\1\21\112\0"+
+    "\1\50\23\0\1\50\1\0\1\50\42\0\2\145\1\0"+
+    "\1\145\53\0\2\145\23\0\1\12\1\153\2\12\1\153"+
+    "\1\12\1\0\2\12\2\0\4\153\4\0\1\12\2\0"+
+    "\1\154\1\155\4\0\5\153\13\0\5\153\2\12\17\153"+
+    "\1\0\3\153\1\0\1\156\2\0\1\156\6\0\4\156"+
+    "\7\0\1\157\1\155\4\0\5\156\2\0\1\50\10\0"+
+    "\5\156\2\0\17\156\1\0\3\156\1\0\1\156\2\0"+
+    "\1\156\6\0\4\156\7\0\1\157\1\155\4\0\5\156"+
+    "\13\0\5\156\2\0\17\156\1\0\3\156\1\12\1\153"+
+    "\2\160\1\153\1\160\1\0\2\160\2\0\4\153\4\161"+
+    "\1\160\2\161\1\162\1\163\1\0\3\161\5\153\13\161"+
+    "\5\153\2\160\17\153\1\161\3\153\10\164\1\165\21\164"+
+    "\2\0\7\164\1\166\42\164\43\0\1\50\7\0\1\50"+
+    "\26\0\1\50\3\0\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\3\0\1\167\1\0"+
+    "\1\13\1\170\1\13\1\171\1\13\5\0\1\172\3\0"+
+    "\1\173\1\0\1\174\1\175\1\176\1\177\4\13\1\200"+
+    "\1\201\1\202\6\13\1\203\1\204\1\13\1\205\1\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\206\1\13"+
+    "\13\0\1\13\1\207\1\210\1\13\1\211\3\13\1\212"+
+    "\2\13\1\213\12\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\214\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\215\1\216\3\13\13\0\1\13\1\217"+
+    "\1\13\1\220\1\221\4\13\1\222\14\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\223\1\13"+
+    "\1\224\5\13\1\225\2\13\1\226\4\13\1\227\4\13"+
+    "\1\0\3\13\41\0\1\50\1\0\1\50\104\0\1\230"+
+    "\1\50\105\0\1\50\5\0\1\50\2\0\1\231\1\232"+
+    "\1\233\1\234\5\0\1\235\2\0\1\236\3\0\1\237"+
+    "\54\0\1\50\105\0\1\50\1\0\1\240\103\0\1\50"+
+    "\5\0\1\50\77\0\1\50\4\0\1\50\2\0\1\50"+
+    "\26\0\1\50\3\0\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\13\1\241\2\13\1\242\3\13\1\243\1\244\7\13"+
+    "\1\245\4\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\13"+
+    "\1\246\3\13\13\0\1\247\7\13\1\250\10\13\1\251"+
+    "\4\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\252\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\253\1\13\1\254\1\255\1\13\13\0\1\13\1\256"+
+    "\2\13\1\257\2\13\1\260\7\13\1\261\2\13\1\223"+
+    "\3\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\262"+
+    "\1\13\1\263\1\13\13\0\12\13\1\264\1\13\1\265"+
+    "\2\13\1\266\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\267\1\270\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\271\1\272"+
+    "\4\13\1\273\1\13\1\274\12\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\275\15\13\1\276"+
+    "\1\223\5\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\277\4\13\1\300\1\301\14\13\1\0"+
+    "\3\13\1\12\5\13\1\0\1\12\1\302\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\3\0\1\303\1\0\1\304"+
+    "\4\13\5\0\1\305\3\0\1\306\1\0\4\13\1\307"+
+    "\10\13\1\274\6\13\1\310\1\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\3\13\1\311\1\13\13\0\11\13\1\312"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\313\5\13\1\314\14\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\3\13\1\315\1\13\13\0\1\13\1\316"+
+    "\1\13\1\317\4\13\1\320\2\13\1\321\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\322"+
+    "\1\13\1\323\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\324\1\13\1\325\1\13\13\0\1\13\1\326"+
+    "\7\13\1\327\14\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\225\1\216\3\13\13\0\12\13\1\330\1\331\3\13"+
+    "\1\332\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\10\13\1\333\10\13\1\334\4\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\2\13\1\335\1\13"+
+    "\1\336\3\13\1\337\15\13\1\0\3\13\1\12\5\13"+
+    "\1\0\1\12\1\340\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\3\0\1\341\1\0\5\13\5\0\1\342\3\0"+
+    "\1\343\1\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\344\24\13\1\0\3\13\10\100"+
+    "\2\0\11\100\2\0\1\100\1\0\53\100\1\0\3\100"+
+    "\11\345\1\0\74\345\1\0\1\346\2\0\1\346\6\0"+
+    "\4\346\7\0\1\347\1\350\4\0\5\346\13\0\5\346"+
+    "\2\0\17\346\1\0\3\346\10\100\2\0\11\100\2\0"+
+    "\1\100\1\347\53\100\1\0\3\100\1\0\1\346\2\351"+
+    "\1\346\1\351\1\0\2\351\2\0\4\346\7\351\1\352"+
+    "\1\353\1\0\3\351\5\346\13\351\5\346\2\351\17\346"+
+    "\1\351\3\346\10\107\2\0\41\107\1\0\32\107\11\354"+
+    "\1\0\74\354\10\113\2\0\11\113\2\0\1\113\1\0"+
+    "\2\113\1\0\54\113\1\0\1\355\2\0\1\355\6\0"+
+    "\4\355\7\0\1\356\1\357\4\0\5\355\13\0\5\355"+
+    "\2\0\17\355\1\0\3\355\10\113\2\0\11\113\2\0"+
+    "\1\113\1\356\2\113\1\0\54\113\1\0\1\355\2\360"+
+    "\1\355\1\360\1\0\2\360\2\0\4\355\7\360\1\361"+
+    "\1\362\1\0\3\360\5\355\13\360\5\355\2\360\17\355"+
+    "\1\360\3\355\10\121\2\0\11\121\2\0\1\121\1\0"+
+    "\67\121\2\0\11\121\2\0\1\121\1\0\54\121\1\363"+
+    "\2\121\1\0\1\364\2\0\1\364\6\0\4\364\7\0"+
+    "\1\365\1\366\4\0\5\364\13\0\5\364\2\0\17\364"+
+    "\1\0\3\364\10\121\2\0\11\121\2\0\1\121\1\365"+
+    "\57\121\1\0\1\364\2\367\1\364\1\367\1\0\2\367"+
+    "\2\0\4\364\7\367\1\370\1\371\1\0\3\367\5\364"+
+    "\13\367\5\364\2\367\17\364\1\367\3\364\10\127\2\0"+
+    "\104\127\2\0\71\127\1\372\2\127\10\121\2\0\11\121"+
+    "\2\0\1\121\1\0\54\121\1\373\2\121\10\127\2\0"+
+    "\71\127\1\374\2\127\11\136\1\0\31\136\1\0\42\136"+
+    "\35\0\1\375\16\0\1\376\1\377\1\u0100\1\u0101\5\0"+
+    "\1\u0102\2\0\1\u0103\3\0\1\u0104\11\0\6\141\1\0"+
+    "\2\141\2\0\4\141\4\0\1\141\2\0\1\141\5\0"+
+    "\5\141\13\0\26\141\1\0\5\141\2\u0105\1\141\1\u0105"+
+    "\1\0\2\141\2\0\4\141\1\u0106\3\0\1\141\2\0"+
+    "\1\141\5\0\5\141\1\u0106\12\0\5\141\2\u0105\17\141"+
+    "\1\0\5\141\2\145\1\141\1\145\1\0\2\141\2\0"+
+    "\2\141\1\143\1\144\4\0\1\141\2\0\1\141\5\0"+
+    "\4\141\1\143\13\0\3\141\1\144\1\141\2\145\11\141"+
+    "\1\143\5\141\1\0\1\141\1\143\3\141\2\146\1\141"+
+    "\1\146\1\0\2\141\2\0\2\141\1\143\1\144\1\0"+
+    "\1\145\2\0\1\141\2\0\1\141\5\0\4\141\1\143"+
+    "\13\0\3\141\1\144\1\141\2\146\11\141\1\143\5\141"+
+    "\1\0\1\141\1\143\3\141\1\146\1\147\1\141\1\147"+
+    "\1\0\2\141\2\0\1\141\1\u0107\1\143\1\144\1\0"+
+    "\1\145\2\0\1\141\2\0\1\141\5\0\3\141\1\u0107"+
+    "\1\143\13\0\3\141\1\144\1\141\2\147\11\141\1\143"+
+    "\5\141\1\0\1\141\1\143\3\141\4\u0108\1\0\2\141"+
+    "\2\0\2\141\2\u0108\4\0\1\141\2\0\1\141\5\0"+
+    "\1\141\1\u0108\2\141\1\u0108\13\0\3\141\4\u0108\5\141"+
+    "\1\u0108\3\141\1\u0108\5\141\1\0\1\141\1\u0108\1\141"+
+    "\11\151\1\0\74\151\11\152\1\0\74\152\1\12\5\153"+
+    "\1\0\2\12\2\0\4\153\4\0\1\12\2\0\1\12"+
+    "\5\0\5\153\13\0\26\153\1\0\3\153\1\12\1\153"+
+    "\2\12\1\153\1\12\1\0\2\12\2\0\4\153\4\0"+
+    "\1\12\2\0\1\12\1\155\4\0\5\153\13\0\5\153"+
+    "\2\12\17\153\1\0\3\153\1\0\1\u0109\2\0\1\u0109"+
+    "\6\0\4\u0109\15\0\5\u0109\13\0\5\u0109\2\0\17\u0109"+
+    "\1\0\3\u0109\1\0\5\156\5\0\4\156\15\0\5\156"+
+    "\13\0\26\156\1\0\3\156\1\0\1\156\2\0\1\156"+
+    "\6\0\4\156\10\0\1\155\4\0\5\156\13\0\5\156"+
+    "\2\0\17\156\1\0\3\156\1\0\1\u0109\2\0\1\u0109"+
+    "\2\0\2\161\2\0\4\u0109\10\161\1\0\4\161\5\u0109"+
+    "\13\161\5\u0109\2\0\17\u0109\1\161\3\u0109\10\164\1\165"+
+    "\21\164\1\u010a\64\164\1\0\74\164\32\167\1\u010b\53\167"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\4\13\1\u010c\21\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\320\22\13\1\0\3\13\46\172\1\u010d\37\172\52\173"+
+    "\1\u010e\33\173\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\u010f\1\13"+
+    "\13\0\10\13\1\u0110\15\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\13\1\u0111\3\13\13\0\10\13\1\246\15\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+    "\1\u0112\1\13\1\u0113\5\13\1\u0114\4\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\u0115\1\13\13\0\3\13"+
+    "\1\u0116\6\13\1\u0117\1\u0118\3\13\1\u0119\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\272"+
+    "\21\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\310\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\4\13\1\246\14\13\1\u011a\4\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\14\13\1\u011b"+
+    "\11\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\246\15\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u011c\4\13\13\0\13\13\1\u011d\12\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u011e\24\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\310\4\13\13\0"+
+    "\17\13\1\u011f\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\4\13\1\u0120\13\0\1\13\1\u0121\6\13\1\u0122\2\13"+
+    "\1\u0123\12\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+    "\1\u0124\1\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\24\13\1\u0125\1\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\223\25\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\223"+
+    "\15\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\12\13\1\u0126\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\20\13\1\u0127\5\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u0128\3\13\13\0\16\13\1\310"+
+    "\7\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\u0129\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u012a\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u012b\4\13\13\0\17\13\1\u012c\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u012d\1\13\13\0"+
+    "\20\13\1\u012e\5\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\310\22\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\13\13\1\u012f\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\13\13\1\307"+
+    "\12\13\1\0\3\13\12\0\1\u0130\3\0\1\u0131\12\0"+
+    "\1\u0132\11\0\1\50\7\0\1\u0133\26\0\1\u0134\60\0"+
+    "\1\u0135\113\0\1\u0136\101\0\1\u0137\121\0\1\u0138\100\0"+
+    "\1\u0139\76\0\1\u013a\1\u013b\102\0\1\u013c\73\0\1\50"+
+    "\1\0\1\45\40\0\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\310\4\13"+
+    "\13\0\1\310\25\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u013d\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u013e\7\13\1\u013f"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\225\25\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\u0140"+
+    "\4\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\310\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\3\13\1\u0141\22\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\4\13\1\310\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\310\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\2\13"+
+    "\1\310\2\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\u0142\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\310\2\13\1\267"+
+    "\5\13\1\u0143\14\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u0144\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\20\13\1\310\5\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\1\13\1\u0140\3\13\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u0145\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\u0146\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u0147\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\4\13\1\u0148\21\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\u0149"+
+    "\21\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\310\4\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\223\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\310\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\3\13\1\u014a\1\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\1\u014b\1\u014c\2\13\1\u014d"+
+    "\13\0\4\13\1\u014e\2\13\1\u014f\2\13\1\u0150\4\13"+
+    "\1\u0151\1\310\1\13\1\u0152\1\u0153\2\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\17\13\1\u0119\6\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u0154\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\u0120\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u0155\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\4\13\1\55\13\0\12\13\1\310\13\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\u0156\1\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\1\12"+
+    "\1\340\2\0\4\13\4\0\1\12\2\0\1\12\3\0"+
+    "\1\341\1\0\5\13\5\0\1\342\3\0\1\343\1\0"+
+    "\21\13\1\u0157\4\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\u0158\7\13\1\u0159\12\13\1\0"+
+    "\3\13\6\302\1\u015a\1\302\1\u015b\2\u015a\4\302\4\u015a"+
+    "\1\302\2\u015a\1\302\5\u015a\5\302\13\u015a\26\302\1\u015a"+
+    "\3\302\32\303\1\u015c\53\303\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\16\13\1\u015d\7\13\1\0\3\13\46\305\1\u015c"+
+    "\37\305\52\306\1\u015c\33\306\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\310\25\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\3\13\1\u015e\22\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u015f\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\24\13\1\265"+
+    "\1\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\3\13\1\u0145"+
+    "\1\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u0160\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u0161\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\12\13\1\u0162"+
+    "\13\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\307\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\330\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\223\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\2\13\1\u012a\2\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\u0155\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u0163\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\10\13\1\u0164\15\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u0165\1\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\11\13\1\u0166\14\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\4\13\1\u0167\21\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\u0168\2\13\1\u0169\1\u016a\13\0\1\u016b"+
+    "\11\13\1\u016c\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\1\12\1\u016d\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\3\0\1\u016e\1\0\5\13\5\0\1\u016f\3\0\1\u0170"+
+    "\1\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\13\1\u0171\24\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\11\13\1\u0172\14\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\201\1\u0173"+
+    "\5\13\1\u0174\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\11\13\1\u0175\14\13\1\0\3\13\6\340"+
+    "\1\u0176\1\340\1\u0177\2\u0176\4\340\4\u0176\1\340\2\u0176"+
+    "\1\340\5\u0176\5\340\13\u0176\26\340\1\u0176\3\340\32\341"+
+    "\1\u0178\53\341\46\342\1\u0179\37\342\52\343\1\u017a\33\343"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\201\14\13"+
+    "\1\0\3\13\1\0\5\346\5\0\4\346\15\0\5\346"+
+    "\13\0\26\346\1\0\3\346\1\0\1\346\2\0\1\346"+
+    "\6\0\4\346\10\0\1\350\4\0\5\346\13\0\5\346"+
+    "\2\0\17\346\1\0\3\346\1\0\1\u017b\2\0\1\u017b"+
+    "\6\0\4\u017b\15\0\5\u017b\13\0\5\u017b\2\0\17\u017b"+
+    "\1\0\3\u017b\1\0\1\u017b\2\0\1\u017b\2\0\2\351"+
+    "\2\0\4\u017b\10\351\1\0\4\351\5\u017b\13\351\5\u017b"+
+    "\2\0\17\u017b\1\351\3\u017b\1\0\5\355\5\0\4\355"+
+    "\15\0\5\355\13\0\26\355\1\0\3\355\1\0\1\355"+
+    "\2\0\1\355\6\0\4\355\10\0\1\357\4\0\5\355"+
+    "\13\0\5\355\2\0\17\355\1\0\3\355\1\0\1\u017c"+
+    "\2\0\1\u017c\6\0\4\u017c\15\0\5\u017c\13\0\5\u017c"+
+    "\2\0\17\u017c\1\0\3\u017c\1\0\1\u017c\2\0\1\u017c"+
+    "\2\0\2\360\2\0\4\u017c\10\360\1\0\4\360\5\u017c"+
+    "\13\360\5\u017c\2\0\17\u017c\1\360\3\u017c\10\121\2\0"+
+    "\11\121\2\0\1\121\1\0\55\121\1\u017d\1\121\1\0"+
+    "\5\364\5\0\4\364\15\0\5\364\13\0\26\364\1\0"+
+    "\3\364\1\0\1\364\2\0\1\364\6\0\4\364\10\0"+
+    "\1\366\4\0\5\364\13\0\5\364\2\0\17\364\1\0"+
+    "\3\364\1\0\1\u017e\2\0\1\u017e\6\0\4\u017e\15\0"+
+    "\5\u017e\13\0\5\u017e\2\0\17\u017e\1\0\3\u017e\1\0"+
+    "\1\u017e\2\0\1\u017e\2\0\2\367\2\0\4\u017e\10\367"+
+    "\1\0\4\367\5\u017e\13\367\5\u017e\2\0\17\u017e\1\367"+
+    "\3\u017e\10\127\2\0\72\127\1\u017f\1\127\10\121\2\0"+
+    "\11\121\2\0\1\121\1\0\56\121\1\u017d\10\127\2\0"+
+    "\73\127\1\u017f\75\0\1\u0180\65\0\1\u0181\113\0\1\u0182"+
+    "\101\0\1\u0183\121\0\1\u0184\100\0\1\u0185\76\0\1\u0186"+
+    "\1\u0187\102\0\1\u0188\30\0\2\141\2\u0105\1\141\1\u0105"+
+    "\1\0\2\141\2\0\2\141\1\143\1\141\4\0\1\141"+
+    "\2\0\1\141\5\0\4\141\1\143\13\0\5\141\2\u0105"+
+    "\11\141\1\143\5\141\1\0\1\141\1\143\1\141\2\0"+
+    "\2\u0105\1\0\1\u0105\53\0\2\u0105\23\0\2\141\4\u0108"+
+    "\1\0\2\141\2\0\1\141\1\u0107\2\u0108\4\0\1\141"+
+    "\2\0\1\141\5\0\1\141\1\u0108\1\141\1\u0107\1\u0108"+
+    "\13\0\3\141\4\u0108\5\141\1\u0108\3\141\1\u0108\5\141"+
+    "\1\0\1\141\1\u0108\1\141\1\0\5\u0109\5\0\4\u0109"+
+    "\11\0\1\161\3\0\5\u0109\13\0\26\u0109\1\0\3\u0109"+
+    "\34\0\5\u010a\13\0\2\u010a\2\0\1\u010a\4\0\1\u010a"+
+    "\1\0\1\u010a\2\0\1\u010a\2\0\1\u010a\10\0\32\u010b"+
+    "\1\u0189\53\u010b\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\3\13\1\u018a\1\13"+
+    "\13\0\26\13\1\0\3\13\46\u010d\1\u0189\37\u010d\52\u010e"+
+    "\1\u0189\33\u010e\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+    "\1\u018b\14\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u018c\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\15\13\1\u018d\10\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\20\13\1\246\5\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\13\1\u0155\3\13"+
+    "\13\0\10\13\1\u018e\5\13\1\u014b\4\13\1\u018f\2\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\u0190\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0191\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\15\13\1\u0192\10\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\1\u0193\4\13\13\0\1\u0194\1\13"+
+    "\1\u0195\13\13\1\u0196\1\u0197\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u0155\3\13\13\0\1\13\1\307"+
+    "\14\13\1\u014b\7\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\4\13\1\u0198\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u0199\4\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\u019a\1\u019b\3\13\13\0\1\13\1\u019c"+
+    "\6\13\1\u018e\1\13\1\u019d\10\13\1\u018f\2\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u019e\1\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\u019f\4\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\12\13\1\u01a0\4\13\1\u0115\6\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\251\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\1\310"+
+    "\12\13\1\307\7\13\1\201\2\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u01a1\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u0119"+
+    "\24\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\3\13\1\u01a2"+
+    "\1\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\246\25\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\246\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01a3\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u01a4\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\16\13\1\u01a5\7\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\12\13\1\u01a6\13\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\15\13\1\310\10\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\u0175\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u01a7\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\13\1\u01a8\3\13\13\0\1\13\1\u019c\24\13"+
+    "\1\0\3\13\12\0\1\u0130\16\0\1\u0132\21\0\1\u0133"+
+    "\26\0\1\u0134\106\0\1\u01a9\20\0\1\u01aa\105\0\1\u01ab"+
+    "\105\0\1\u01ac\127\0\1\u01ad\124\0\1\u013c\106\0\1\u01ae"+
+    "\62\0\1\u01af\2\0\1\u01ad\124\0\1\u01b0\120\0\1\u01b1"+
+    "\50\0\1\u01b2\134\0\1\u01ad\21\0\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\15\13\1\u01b3\10\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u01b4\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\17\13\1\u01b5"+
+    "\6\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\2\13\1\310\23\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\17\13\1\u0192\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\223\3\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\1\u01b6\4\13\13\0\12\13"+
+    "\1\310\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\223\5\13\1\u01b7\14\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\310\1\13\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\u01b8\4\13\13\0"+
+    "\1\u01b9\1\13\1\u0195\13\13\1\u0196\1\u0197\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u0125"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\u01ba\15\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\17\13\1\u01bb\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\21\13\1\u01bc\4\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\246"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\7\13\1\310\16\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\223\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\4\13\1\u01bd\13\0\26\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u01be\22\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\21\13"+
+    "\1\u01bf\4\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0166\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\21\13\1\u01c0\4\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01c1\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\4\13\1\55\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\12\13\1\u0145\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\3\13\1\u0192\1\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u01c2\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01c3"+
+    "\22\13\1\0\3\13\10\u015a\1\u015c\75\u015a\6\12\1\0"+
+    "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+    "\5\u015b\13\0\2\u015b\2\12\1\u015b\4\12\1\u015b\1\12"+
+    "\1\u015b\2\12\1\u015b\2\12\1\u015b\4\12\1\0\3\12"+
+    "\34\0\5\u015c\13\0\2\u015c\2\0\1\u015c\4\0\1\u015c"+
+    "\1\0\1\u015c\2\0\1\u015c\2\0\1\u015c\10\0\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\272\1\u0155\3\13\13\0\10\13\1\u01c4"+
+    "\5\13\1\u014b\7\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\265\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\4\13\1\310\13\0\13\13\1\u01c5\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\14\13\1\310"+
+    "\11\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\13\1\310\24\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\u01c6\1\310\1\13\1\u01c7\1\13\13\0\1\u01c8\1\13"+
+    "\1\u01c9\13\13\1\u01ca\1\u01cb\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u012c\3\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01cc"+
+    "\7\13\1\u01cd\1\13\1\310\10\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\3\13\1\u01ce\22\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\13\13\1\225"+
+    "\12\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\u012c\4\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\2\13\1\u01cf\23\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u01d0\5\13\1\u01d1\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\256\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0163\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\11\13\1\u01d2\14\13\1\0\3\13"+
+    "\6\u016d\1\u01d3\1\u016d\1\u01d4\2\u01d3\4\u016d\4\u01d3\1\u016d"+
+    "\2\u01d3\1\u016d\3\u01d3\1\0\1\u01d3\5\u016d\13\u01d3\26\u016d"+
+    "\1\u01d3\3\u016d\32\u016e\1\u01d5\53\u016e\32\u016f\1\0\13\u016f"+
+    "\1\u01d6\37\u016f\32\u0170\1\0\17\u0170\1\u01d7\33\u0170\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u01d8\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\u01d9\1\13\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\12\13\1\u01da\13\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\u01db\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\225\13\13\1\0"+
+    "\3\13\10\u0176\1\u01dc\75\u0176\6\u0177\1\u01dc\1\u0177\1\u01dd"+
+    "\2\u01dc\4\u0177\4\u01dc\1\u0177\2\u01dc\1\u0177\5\u01dc\5\u0177"+
+    "\13\u01dc\26\u0177\1\u01dc\3\u0177\32\u0178\1\u01de\53\u0178\46\u0179"+
+    "\1\u01de\37\u0179\52\u017a\1\u01de\33\u017a\1\0\5\u017b\5\0"+
+    "\4\u017b\11\0\1\351\3\0\5\u017b\13\0\26\u017b\1\0"+
+    "\3\u017b\1\0\5\u017c\5\0\4\u017c\11\0\1\360\3\0"+
+    "\5\u017c\13\0\26\u017c\1\0\3\u017c\1\0\5\u017e\5\0"+
+    "\4\u017e\11\0\1\367\3\0\5\u017e\13\0\26\u017e\1\0"+
+    "\3\u017e\66\0\1\u01df\57\0\1\u01e0\124\0\1\u0188\106\0"+
+    "\1\u01e1\62\0\1\u01e2\2\0\1\u01e0\124\0\1\u01e3\120\0"+
+    "\1\u01e4\50\0\1\u01e5\134\0\1\u01e0\55\0\5\u0189\13\0"+
+    "\2\u0189\1\0\2\u0189\3\0\2\u0189\1\0\1\u0189\2\0"+
+    "\1\u0189\2\0\1\u0189\10\0\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\251\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\13\1\225\3\13\13\0\12\13\1\310\13\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u01e6\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u01e7\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u01e8\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\337\15\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\4\13\1\u01e9\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\246"+
+    "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u01ea\1\13\1\u01eb\22\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u01ec"+
+    "\5\13\1\u01ed\4\13\1\u01ee\2\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u01ef\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u01ee"+
+    "\15\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\u01f0\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\24\13\1\310\1\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\251\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01f1"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\4\13\1\314\21\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\u01a6\25\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u01ba\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01d1\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+    "\1\u0192\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u01f2\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\246\24\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\251\22\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\u01f3\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+    "\1\u01f4\1\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\12\13\1\u0140\13\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\201\22\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u01f5\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+    "\1\u01f6\1\13\13\0\26\13\1\0\3\13\104\0\1\u01f7"+
+    "\1\u01f8\103\0\1\u01f9\105\0\1\u01fa\105\0\1\u01fb\42\0"+
+    "\1\u01fc\122\0\1\u01fd\117\0\1\u01ad\103\0\1\u01fe\111\0"+
+    "\1\u01ad\14\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u01ff\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\13\1\u0200\24\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\12\13\1\u0201\13\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\12\13\1\265\13\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\20\13"+
+    "\1\223\5\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u01eb\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\10\13\1\u0202\12\13\1\u01ee\2\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\13\13"+
+    "\1\310\12\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\6\13\1\310\17\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\265\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\u0203\1\u0120\13\0\1\u0204"+
+    "\25\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\u0205\15\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\10\13\1\201\15\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\11\13\1\u0206\14\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\17\13\1\u0207"+
+    "\6\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\u0208"+
+    "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\13\1\u014c\3\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u0209\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u020a"+
+    "\1\13\1\u020b\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u020c\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\u020d\2\13\1\u020e\4\13"+
+    "\1\u020f\5\13\1\u01ed\4\13\1\u0210\2\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u0211\24\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\u0212\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0213\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\u0214\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\3\13\1\u0215\1\13\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u0161\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\11\13\1\u0112\14\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u0216\4\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u012c\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\3\13\1\223\1\13\13\0"+
+    "\3\13\1\310\22\13\1\0\3\13\10\u01d3\1\u0217\21\u01d3"+
+    "\1\0\53\u01d3\6\u016d\1\u01d3\1\u016d\1\u01d4\2\u01d3\4\u016d"+
+    "\4\u01d3\1\u016d\2\u01d3\1\u016d\3\u01d3\1\0\1\u01d3\1\u01d4"+
+    "\1\u016d\3\u01d4\13\u01d3\2\u01d4\2\u016d\1\u01d4\4\u016d\1\u01d4"+
+    "\1\u016d\1\u01d4\5\u016d\1\u01d4\4\u016d\1\u01d3\3\u016d\34\0"+
+    "\1\u01d5\1\0\3\u01d5\13\0\2\u01d5\2\0\1\u01d5\4\0"+
+    "\1\u01d5\1\0\1\u01d5\5\0\1\u01d5\10\0\32\u016f\1\0"+
+    "\1\u016f\1\u01d6\1\u016f\3\u01d6\5\u016f\1\u01d6\5\u016f\2\u01d6"+
+    "\2\u016f\1\u01d6\4\u016f\1\u01d6\1\u016f\1\u01d6\5\u016f\1\u01d6"+
+    "\10\u016f\32\u0170\1\0\1\u0170\1\u01d7\1\u0170\3\u01d7\11\u0170"+
+    "\1\u01d7\1\u0170\2\u01d7\2\u0170\1\u01d7\4\u0170\1\u01d7\1\u0170"+
+    "\1\u01d7\5\u0170\1\u01d7\10\u0170\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0218\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\223\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\u020d\25\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\u0219"+
+    "\21\13\1\0\3\13\10\u01dc\1\u01de\75\u01dc\6\12\1\0"+
+    "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+    "\2\u01dd\2\12\1\u01dd\13\0\10\12\1\u01dd\15\12\1\0"+
+    "\3\12\34\0\2\u01de\2\0\1\u01de\23\0\1\u01de\61\0"+
+    "\1\u021a\122\0\1\u021b\117\0\1\u01e0\103\0\1\u021c\111\0"+
+    "\1\u01e0\14\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\256\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\12\13\1\u021d\13\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\4\13\1\u0119\21\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u021e\24\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\1\13\1\u021f\3\13"+
+    "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\10\13\1\u0220\15\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\u0221\7\13\1\u0222\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+    "\1\307\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\3\13\1\u0223\22\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\1\u01f0\4\13\13\0\26\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\12\13\1\u01ee\13\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u012c"+
+    "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\17\13\1\u0224\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\1\246\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u0119\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\1\13\1\u0205\24\13"+
+    "\1\0\3\13\104\0\1\u0225\1\u0226\104\0\1\u0227\1\u0228"+
+    "\104\0\1\u0229\1\u022a\61\0\2\u01ad\63\0\1\u022b\140\0"+
+    "\1\u01ad\12\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\16\13"+
+    "\1\225\7\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\12\13\1\u022c\13\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\u0221\24\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\11\13\1\u022d\14\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+    "\1\244\14\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\225"+
+    "\4\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\10\13\1\225\15\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\4\13\1\274\13\0\26\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\4\13\1\u0175\21\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\4\13\1\225\13\0"+
+    "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\u022e"+
+    "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\10\13\1\u022f\15\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\16\13\1\344\7\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0119"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\3\13\1\u0230\22\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\u0231\7\13\1\u0222\14\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223"+
+    "\13\13\1\u0232\1\13\1\u020d\4\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\u0213\4\13\13\0\26\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\12\13"+
+    "\1\u020d\1\u0232\6\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\u0233\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\1\13\1\u0234\3\13\13\0\26\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0235"+
+    "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\1\223\4\13"+
+    "\13\0\26\13\1\0\3\13\10\u01d3\1\u0217\21\u01d3\1\0"+
+    "\1\u01d3\1\u0217\1\u01d3\3\u0217\13\u01d3\2\u0217\2\u01d3\1\u0217"+
+    "\4\u01d3\1\u0217\1\u01d3\1\u0217\5\u01d3\1\u0217\10\u01d3\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\13\13\1\u0236\12\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u0237"+
+    "\15\13\1\0\3\13\61\0\2\u01e0\63\0\1\u0238\140\0"+
+    "\1\u01e0\12\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\1\u0239"+
+    "\25\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\23\13\1\201\2\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\15\13\1\u023a\10\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\7\13\1\u01ee\16\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\12\13\1\u023b"+
+    "\13\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\1\13\1\u023c\24\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\17\13\1\246\6\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\21\13\1\u01d9\4\13\1\0"+
+    "\3\13\31\0\1\u01f7\105\0\1\u01f8\127\0\1\u023d\105\0"+
+    "\1\u023e\134\0\1\u01f7\105\0\1\u01f8\70\0\1\u023f\20\0"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\24\13\1\244\1\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+    "\1\u0240\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\15\13\1\u0241\10\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\7\13\1\u0242\16\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\u0243\15\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\u0244\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u01ba\21\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u0223\10\13\1\u0245\11\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\2\13"+
+    "\1\223\23\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\17\13\1\225\6\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\3\13\1\u0246\22\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\10\13\1\u0247\15\13"+
+    "\1\0\3\13\65\0\1\u0248\20\0\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\4\13\1\u0120\21\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\13\1\u0125\24\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u01ee"+
+    "\24\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+    "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+    "\10\13\1\u0249\15\13\1\0\3\13\73\0\1\u024a\12\0"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\310\11\13"+
+    "\1\310\10\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\1\13\1\u0125\15\13\1\u0151\6\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\10\13"+
+    "\1\u024b\11\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\17\13\1\u0151\6\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\1\13\1\u024c\24\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\24\13\1\u024d\1\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+    "\1\u024e\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0198\21\13\1\0\3\13\73\0\1\u024f"+
+    "\12\0\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0250"+
+    "\14\13\1\0\3\13\72\0\1\u01ad\13\0\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\24\13\1\u0251\1\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\10\13"+
+    "\1\u0252\11\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+    "\13\0\4\13\1\u0253\12\13\1\u0151\6\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\4\13\1\310\21\13"+
+    "\1\0\3\13\72\0\1\u01e0\13\0\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\12\13\1\u0198\13\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\1\u0254\16\13\1\u0151\6\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\24\13"+
+    "\1\u0255\1\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+    "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+    "\1\u0256\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+    "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+    "\5\13\13\0\1\13\1\204\24\13\1\0\3\13\1\12"+
+    "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+    "\1\12\5\0\5\13\13\0\17\13\1\u0257\6\13\1\0"+
+    "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+    "\1\12\2\0\1\12\5\0\4\13\1\251\13\0\26\13"+
+    "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+    "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+    "\1\u0166\14\13\1\u0258\4\13\1\0\3\13\1\12\5\13"+
+    "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+    "\5\0\5\13\13\0\13\13\1\u0259\12\13\1\0\3\13"+
+    "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+    "\2\0\1\12\5\0\5\13\13\0\14\13\1\u01a2\11\13"+
+    "\1\0\3\13";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[38500];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\11\0\4\1\1\11\1\1\1\11\3\1\2\11\4\1"+
+    "\1\11\15\1\1\11\1\1\1\11\24\1\1\11\2\1"+
+    "\1\11\3\1\1\11\2\1\2\11\1\1\1\11\3\1"+
+    "\1\11\1\1\1\11\5\1\1\11\1\1\1\11\1\1"+
+    "\1\11\2\1\1\11\15\1\1\0\1\1\1\0\1\1"+
+    "\1\11\1\1\3\0\1\1\1\0\2\1\2\0\34\1"+
+    "\10\0\43\1\1\0\1\1\2\0\32\1\3\0\1\1"+
+    "\1\11\2\1\1\0\1\11\1\1\1\0\1\11\2\1"+
+    "\1\0\1\11\1\1\1\0\3\1\1\0\1\11\1\1"+
+    "\1\0\3\1\10\0\1\1\1\0\2\1\1\0\1\1"+
+    "\1\0\1\1\2\0\41\1\15\0\35\1\1\0\23\1"+
+    "\3\0\5\1\1\0\1\1\5\0\1\1\1\0\1\1"+
+    "\11\0\40\1\4\0\1\11\5\0\40\1\1\0\10\1"+
+    "\1\0\2\1\2\11\5\0\21\1\2\11\6\0\33\1"+
+    "\3\0\10\1\7\0\14\1\1\0\4\1\2\11\1\0"+
+    "\10\1\1\0\1\1\1\0\4\1\1\0\12\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[601];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -3;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -4;
+
+	/**
+	 * Token type specific to PerlTokenMaker; this signals we are in a POD
+	 * block.
+	 */
+	public static final int INTERNAL_POD						= -5;
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PerlTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return super.getMarkOccurrencesOfTokenType(type) || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_POD:
+				state = POD;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Returns whether a regular expression token can follow the specified
+	 * token.
+	 *
+	 * @param t The token to check, which may be <code>null</code>.
+	 * @return Whether a regular expression token may follow this one.
+	 */
+	private static final boolean regexCanFollow(Token t) {
+		char ch;
+		// We basically try to mimic Eclipse's JS editor's behavior here.
+		return t==null ||
+				//t.isOperator() ||
+				(t.textCount==1 && (
+					(ch=t.text[t.textOffset])=='=' ||
+					ch=='(' ||
+					ch==',' ||
+					ch=='?' ||
+					ch==':' ||
+					ch=='[' ||
+					ch=='!' ||
+					ch=='&'
+				)) ||
+				/* Operators "==", "===", "!=", "!==", etc. */
+				(t.type==Token.OPERATOR &&
+					((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public PerlTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public PerlTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 174) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 46: break;
+        case 34: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 47: break;
+        case 40: 
+          { if (start==zzStartRead) { addToken(Token.COMMENT_DOCUMENTATION); yybegin(YYINITIAL); }
+          }
+        case 48: break;
+        case 26: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 49: break;
+        case 11: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 50: break;
+        case 38: 
+          { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+          }
+        case 51: break;
+        case 31: 
+          { addToken(Token.FUNCTION);
+          }
+        case 52: break;
+        case 36: 
+          { boolean highlightedAsRegex = false;
+					if (firstToken==null) {
+						addToken(Token.REGEX);
+						highlightedAsRegex = true;
+					}
+					else {
+						// If this is *likely* to be a regex, based on
+						// the previous token, highlight it as such.
+						Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+						if (regexCanFollow(t)) {
+							addToken(Token.REGEX);
+							highlightedAsRegex = true;
+						}
+					}
+					// If it doesn't *appear* to be a regex, highlight it as
+					// individual tokens.
+					if (!highlightedAsRegex) {
+						int temp = zzStartRead + 1;
+						addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+						zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+					}
+          }
+        case 53: break;
+        case 30: 
+          { addToken(Token.VARIABLE);
+          }
+        case 54: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 55: break;
+        case 24: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+          }
+        case 56: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 57: break;
+        case 29: 
+          { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken;
+          }
+        case 58: break;
+        case 41: 
+          { if (start==zzStartRead) { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+          }
+        case 59: break;
+        case 44: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED);
+          }
+        case 60: break;
+        case 45: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED);
+          }
+        case 61: break;
+        case 42: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED);
+          }
+        case 62: break;
+        case 13: 
+          { /* Skip escaped chars. */
+          }
+        case 63: break;
+        case 37: 
+          { addToken(Token.REGEX);
+          }
+        case 64: break;
+        case 18: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 65: break;
+        case 28: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 66: break;
+        case 21: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+          }
+        case 67: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 68: break;
+        case 10: 
+          { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+          }
+        case 69: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 70: break;
+        case 33: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 71: break;
+        case 20: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+          }
+        case 72: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 73: break;
+        case 16: 
+          { /* Skip escaped single quotes only, but this should still work. */
+          }
+        case 74: break;
+        case 23: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+          }
+        case 75: break;
+        case 35: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 76: break;
+        case 39: 
+          { addToken(Token.COMMENT_EOL); start = zzMarkedPos; yybegin(POD);
+          }
+        case 77: break;
+        case 32: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 78: break;
+        case 19: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+          }
+        case 79: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 80: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 81: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 82: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 83: break;
+        case 25: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken;
+          }
+        case 84: break;
+        case 27: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 85: break;
+        case 43: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED);
+          }
+        case 86: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(BACKTICKS);
+          }
+        case 87: break;
+        case 12: 
+          { 
+          }
+        case 88: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 89: break;
+        case 22: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+          }
+        case 90: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case HEREDOC_EOF_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+            }
+            case 602: break;
+            case HEREDOC_EOT_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+            }
+            case 603: break;
+            case HEREDOC_EOT_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+            }
+            case 604: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 605: break;
+            case BACKTICKS: {
+              addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+            }
+            case 606: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 607: break;
+            case HEREDOC_EOF_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+            }
+            case 608: break;
+            case CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 609: break;
+            case POD: {
+              addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken;
+            }
+            case 610: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex	(revision 25584)
@@ -0,0 +1,226 @@
+/*
+ * 11/07/2008
+ *
+ * PlainTextTokenMaker.flex - Scanner for plain text files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for plain text files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>), so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PlainTextTokenMaker.java</code> file will contain
+ *       two definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class PlainTextTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PlainTextTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @param link Whether this token is a hyperlink.
+	 */
+	private void addToken(int tokenType, boolean link) {
+		int so = zzStartRead + offsetShift;
+		super.addToken(zzBuffer, zzStartRead,zzMarkedPos-1, tokenType, so, link);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <code>Token.NULL</code>, as there are no multiline
+	 * tokens in properties files.
+	 *
+	 * @param text The line of tokens to examine.
+	 * @param initialTokenType The token type to start with (i.e., the value
+	 *        of <code>getLastTokenTypeOnLine</code> for the line before
+	 *        <code>text</code>).
+	 * @return <code>Token.NULL</code>.
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+		return Token.NULL;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return <code>null</code>, as there are no comments in plain text.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in plain text files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(YYINITIAL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+LetterOrDigit	= ([a-zA-Z0-9])
+Identifier		= ({LetterOrDigit}+)
+Separator		= ([^a-zA-Z0-9 \t\n])
+WhiteSpace		= ([ \t]+)
+LineTerminator	= ([\n])
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({LetterOrDigit}|[_\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{LetterOrDigit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%%
+
+<YYINITIAL> {
+	{URL}				{ addToken(Token.IDENTIFIER, true); }
+	{Identifier}		{ addToken(Token.IDENTIFIER, false); }
+	{Separator}			{ addToken(Token.IDENTIFIER, false); }
+	{WhiteSpace}		{ addToken(Token.WHITESPACE, false); }
+	{LineTerminator}	{ addNullToken(); return firstToken; }
+	<<EOF>>				{ addNullToken(); return firstToken; }
+	.					{ /* Never happens */ addToken(Token.IDENTIFIER, false); }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java	(revision 25584)
@@ -0,0 +1,643 @@
+/* The following code was generated by JFlex 1.4.1 on 12/9/11 6:40 PM */
+
+/*
+ * 11/07/2008
+ *
+ * PlainTextTokenMaker.flex - Scanner for plain text files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for plain text files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>), so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PlainTextTokenMaker.java</code> file will contain
+ *       two definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class PlainTextTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\1\6\1\4"+
+    "\7\4\1\4\1\21\1\5\12\1\1\17\1\4\1\0\1\4\1\0"+
+    "\2\4\32\1\1\4\1\0\1\4\1\0\1\4\1\0\4\1\1\16"+
+    "\1\13\1\1\1\7\1\14\2\1\1\15\3\1\1\11\2\1\1\12"+
+    "\1\10\2\1\1\20\3\1\3\0\1\4\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\1\0\2\1\1\2\1\3\14\1\1\0\1\4\2\0";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[21];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\22\0\44\0\22\0\66\0\110\0\132\0\154"+
+    "\0\176\0\220\0\242\0\264\0\306\0\330\0\352\0\374"+
+    "\0\u010e\0\u0120\0\u0132\0\u0144\0\u0132";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[21];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\2\1\3\1\4\1\5\3\2\1\6\3\3\1\7"+
+    "\3\3\1\2\1\10\1\2\23\0\1\3\5\0\10\3"+
+    "\1\0\1\3\4\0\1\5\17\0\1\3\5\0\1\3"+
+    "\1\11\6\3\1\0\1\3\2\0\1\3\5\0\1\3"+
+    "\1\12\3\3\1\13\2\3\1\0\1\3\2\0\1\3"+
+    "\5\0\10\3\1\0\1\14\2\0\1\3\5\0\1\3"+
+    "\1\15\6\3\1\0\1\3\2\0\1\3\5\0\2\3"+
+    "\1\16\5\3\1\0\1\3\2\0\1\3\5\0\6\3"+
+    "\1\17\1\3\1\0\1\3\2\0\1\3\5\0\10\3"+
+    "\1\0\1\20\2\0\1\3\5\0\2\3\1\21\5\3"+
+    "\1\0\1\3\2\0\1\3\5\0\10\3\1\22\1\3"+
+    "\2\0\1\3\5\0\7\3\1\16\1\0\1\3\2\0"+
+    "\1\3\5\0\10\3\1\0\1\3\1\23\1\0\1\3"+
+    "\5\0\3\3\1\16\4\3\1\22\1\3\6\0\1\24"+
+    "\15\0\1\23\2\0\1\25\12\23\1\25\1\23\1\25"+
+    "\5\0\1\23\14\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[342];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\1\0\1\11\1\1\1\11\15\1\1\0\1\1\2\0";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[21];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PlainTextTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @param link Whether this token is a hyperlink.
+	 */
+	private void addToken(int tokenType, boolean link) {
+		int so = zzStartRead + offsetShift;
+		super.addToken(zzBuffer, zzStartRead,zzMarkedPos-1, tokenType, so, link);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Always returns <code>Token.NULL</code>, as there are no multiline
+	 * tokens in properties files.
+	 *
+	 * @param text The line of tokens to examine.
+	 * @param initialTokenType The token type to start with (i.e., the value
+	 *        of <code>getLastTokenTypeOnLine</code> for the line before
+	 *        <code>text</code>).
+	 * @return <code>Token.NULL</code>.
+	 */
+	public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+		return Token.NULL;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return <code>null</code>, as there are no comments in plain text.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return null;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in plain text files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(YYINITIAL);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public PlainTextTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public PlainTextTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 94) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 3: 
+          { addToken(Token.WHITESPACE, false);
+          }
+        case 5: break;
+        case 2: 
+          { addNullToken(); return firstToken;
+          }
+        case 6: break;
+        case 4: 
+          { addToken(Token.IDENTIFIER, true);
+          }
+        case 7: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER, false);
+          }
+        case 8: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 22: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex	(revision 25584)
@@ -0,0 +1,236 @@
+/*
+ * 03/21/2005
+ *
+ * PropertiesFileTokenMaker.java - Scanner for properties files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a Java properties file.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
+ *       contain two definitions of both <code>zzRefill</code> and
+ *       <code>yyreset</code>.  You should hand-delete the second of each
+ *       definition (the ones generated by the lexer), as these generated
+ *       methods modify the input buffer, which we'll never have to do.
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class PropertiesFileTokenMaker
+%extends AbstractJFlexTokenMaker
+%implements TokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PropertiesFileTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VALUE;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Equals				= ([=\:])
+Name					= ([^=\: \t\n#!]*)
+Whitespace			= ([ \t]+)
+Comment				= ([#!].*)
+SingleQuote			= (')
+
+%state VALUE
+
+%%
+
+<YYINITIAL> {
+	{Name}			{ addToken(Token.RESERVED_WORD); }
+	{Equals}			{ start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE); }
+	{Whitespace}		{ addToken(Token.WHITESPACE); }
+	{Comment}			{ addToken(Token.COMMENT_EOL); }
+	<<EOF>>			{ addNullToken(); return firstToken; }
+}
+
+<VALUE> {
+	{SingleQuote}[^']*{SingleQuote}?	{ addToken(start, zzMarkedPos-1, Token.LITERAL_STRING_DOUBLE_QUOTE); start = zzMarkedPos; }
+	[^'\{\\]+						{}
+	"{"[^\}]*"}"?					{ int temp=zzStartRead; addToken(start, zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp, zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+	[\\].							{}
+	[\\]							{ addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	<<EOF>>							{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addNullToken(); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java	(revision 25584)
@@ -0,0 +1,661 @@
+/* The following code was generated by JFlex 1.4.1 on 1/28/11 4:16 PM */
+
+/*
+ * 03/21/2005
+ *
+ * PropertiesFileTokenMaker.java - Scanner for properties files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a Java properties file.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
+ *       contain two definitions of both <code>zzRefill</code> and
+ *       <code>yyreset</code>.  You should hand-delete the second of each
+ *       definition (the ones generated by the lexer), as these generated
+ *       methods modify the input buffer, which we'll never have to do.
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class PropertiesFileTokenMaker extends AbstractJFlexTokenMaker implements TokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** initial size of the lookahead buffer */
+  private static final int ZZ_BUFFERSIZE = 16384;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+  public static final int VALUE = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\3\0\1\5"+
+    "\22\0\1\1\2\0\1\1\36\0\1\6\36\0\1\7\1\0\1\10"+
+    "\uff82\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\1\1\1\0\1\1\1\2\1\3\1\4\1\5\1\6"+
+    "\1\7\1\10\1\6\1\5\1\10";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[13];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\11\0\22\0\33\0\44\0\55\0\66\0\77"+
+    "\0\110\0\121\0\33\0\33\0\33";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[13];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\3\1\4\1\0\1\5\1\6\4\3\5\7\1\10"+
+    "\1\11\1\12\1\7\1\3\4\0\4\3\14\0\1\5"+
+    "\5\0\2\6\1\0\6\6\5\7\3\0\1\7\5\10"+
+    "\1\13\3\10\2\14\1\0\6\14\10\12\1\15";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[90];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\1\1\1\0\1\1\1\11\6\1\3\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[13];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PropertiesFileTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = VALUE;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public PropertiesFileTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public PropertiesFileTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 42) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 7: 
+          { addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 9: break;
+        case 2: 
+          { start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE);
+          }
+        case 10: break;
+        case 8: 
+          { int temp=zzStartRead; addToken(start, zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp, zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+          }
+        case 11: break;
+        case 3: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 12: break;
+        case 6: 
+          { addToken(start, zzMarkedPos-1, Token.LITERAL_STRING_DOUBLE_QUOTE); start = zzMarkedPos;
+          }
+        case 13: break;
+        case 1: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 14: break;
+        case 5: 
+          { 
+          }
+        case 15: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL);
+          }
+        case 16: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 14: break;
+            case VALUE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addNullToken(); return firstToken;
+            }
+            case 15: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex	(revision 25584)
@@ -0,0 +1,443 @@
+/*
+ * 12/06/2005
+ *
+ * PythonTokenMaker.java - Token maker for the Python programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+import org.fife.ui.rsyntaxtextarea.DefaultToken;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMaker;
+
+
+/**
+ * Scanner for the Python programming language.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+%%
+
+%public
+%class PythonTokenMaker
+%extends AbstractJFlexTokenMaker
+%implements TokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PythonTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONG_STRING_2;
+				break;
+			case Token.LITERAL_CHAR:
+				state = LONG_STRING_1;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+%}
+
+/* This part is taken from http://www.python.org/doc/2.2.3/ref/grammar.txt */
+identifier		= (({letter}|"_")({letter}|{digit}|"_")*)
+letter			= ({lowercase}|{uppercase})
+lowercase			= ([a-z])
+uppercase			= ([A-Z])
+digit			= ([0-9])
+stringliteral		= ({stringprefix}?{shortstring})
+stringprefix		= ("r"|"u"[rR]?|"R"|"U"[rR]?)
+shortstring1		= ([\']{shortstring1item}*[\']?)
+shortstring2		= ([\"]{shortstring2item}*[\"]?)
+shortstring		= ({shortstring1}|{shortstring2})
+shortstring1item	= ({shortstring1char}|{escapeseq})
+shortstring2item	= ({shortstring2char}|{escapeseq})
+shortstring1char	= ([^\\\n\'])
+shortstring2char	= ([^\\\n\"])
+escapeseq			= ([\\].)
+longinteger		= ({integer}[lL])
+integer			= ({decimalinteger}|{octinteger}|{hexinteger})
+decimalinteger		= ({nonzerodigit}{digit}*|"0")
+octinteger		= ("0"{octdigit}+)
+hexinteger		= ("0"[xX]{hexdigit}+)
+nonzerodigit		= ([1-9])
+octdigit			= ([0-7])
+hexdigit			= ({digit}|[a-f]|[A-F])
+floatnumber		= ({pointfloat}|{exponentfloat})
+pointfloat		= ({intpart}?{fraction}|{intpart}".")
+exponentfloat		= (({intpart}|{pointfloat}){exponent})
+intpart			= ({digit}+)
+fraction			= ("."{digit}+)
+exponent			= ([eE][\+\-]?{digit}+)
+imagnumber		= (({floatnumber}|{intpart})[jJ])
+
+ErrorNumberFormat	= ({digit}{NonSeparator}+)
+NonSeparator		= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+
+LongStringStart1	= ({stringprefix}?\'\'\')
+LongStringStart2	= ({stringprefix}?\"\"\")
+
+LineTerminator		= (\n)
+WhiteSpace		= ([ \t\f])
+
+LineComment		= ("#".*)
+
+
+%state LONG_STRING_1
+%state LONG_STRING_2
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "and"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "as"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "assert"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "break"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "class"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "continue"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "def"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "del"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elif"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "except"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exec"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "finally"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "from"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "global"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "import"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "in"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "is"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lambda"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "not"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "or"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pass"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "print"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "raise"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "try"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while"					{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "yield"					{ addToken(Token.RESERVED_WORD); }
+
+/* Data types. */
+<YYINITIAL> "char"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "double"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "float"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "int"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "long"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "short"					{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "signed"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "unsigned"				{ addToken(Token.DATA_TYPE); }
+<YYINITIAL> "void"					{ addToken(Token.DATA_TYPE); }
+
+/* Standard functions */
+<YYINITIAL> "abs"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "apply"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "bool"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "buffer"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "callable"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "chr"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "classmethod"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "cmp"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "coerce"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "compile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "complex"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "delattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "dict"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "dir"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "divmod"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "enumerate"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "eval"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "execfile"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "file"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "filter"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "float"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "getattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "globals"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "hasattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "hash"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "hex"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "id"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "input"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "int"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "intern"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "isinstance"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "issubclass"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "iter"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "len"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "list"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "locals"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "long"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "map"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "max"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "min"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "object"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "oct"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "open"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "ord"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "pow"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "property"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "range"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "raw_input"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "reduce"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "reload"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "repr"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "round"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "setattr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "slice"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "staticmethod"			{ addToken(Token.FUNCTION); }
+<YYINITIAL> "str"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "sum"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "super"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "tuple"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "type"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "unichr"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "unicode"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "vars"					{ addToken(Token.FUNCTION); }
+<YYINITIAL> "xrange"				{ addToken(Token.FUNCTION); }
+<YYINITIAL> "zip"					{ addToken(Token.FUNCTION); }
+
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character Literals. */
+	{stringliteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{LongStringStart1}				{ yybegin(LONG_STRING_1); addToken(Token.LITERAL_CHAR); }
+	{LongStringStart2}				{ yybegin(LONG_STRING_2); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+
+	/* Comment Literals. */
+	{LineComment}					{ addToken(Token.COMMENT_EOL); }
+
+	/* Separators. */
+	"("							{ addToken(Token.SEPARATOR); }
+	")"							{ addToken(Token.SEPARATOR); }
+	"["							{ addToken(Token.SEPARATOR); }
+	"]"							{ addToken(Token.SEPARATOR); }
+	"{"							{ addToken(Token.SEPARATOR); }
+	"}"							{ addToken(Token.SEPARATOR); }
+
+	/* Operators. */
+	"="							{ addToken(Token.OPERATOR); }
+	"+"							{ addToken(Token.OPERATOR); }
+	"-"							{ addToken(Token.OPERATOR); }
+	"*"							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.OPERATOR); }
+	"%"							{ addToken(Token.OPERATOR); }
+	"**"							{ addToken(Token.OPERATOR); }
+	"~"							{ addToken(Token.OPERATOR); }
+	"<"							{ addToken(Token.OPERATOR); }
+	">"							{ addToken(Token.OPERATOR); }
+	"<<"							{ addToken(Token.OPERATOR); }
+	">>"							{ addToken(Token.OPERATOR); }
+	"=="							{ addToken(Token.OPERATOR); }
+	"+="							{ addToken(Token.OPERATOR); }
+	"-="							{ addToken(Token.OPERATOR); }
+	"*="							{ addToken(Token.OPERATOR); }
+	"/="							{ addToken(Token.OPERATOR); }
+	"%="							{ addToken(Token.OPERATOR); }
+	">>="						{ addToken(Token.OPERATOR); }
+	"<<="						{ addToken(Token.OPERATOR); }
+	"^"							{ addToken(Token.OPERATOR); }
+	"&"							{ addToken(Token.OPERATOR); }
+	"&&"							{ addToken(Token.OPERATOR); }
+	"|"							{ addToken(Token.OPERATOR); }
+	"||"							{ addToken(Token.OPERATOR); }
+	"?"							{ addToken(Token.OPERATOR); }
+	":"							{ addToken(Token.OPERATOR); }
+	","							{ addToken(Token.OPERATOR); }
+	"!"							{ addToken(Token.OPERATOR); }
+	"++"							{ addToken(Token.OPERATOR); }
+	"--"							{ addToken(Token.OPERATOR); }
+	"."							{ addToken(Token.OPERATOR); }
+	","							{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{longinteger}|{integer}			{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{floatnumber}|{imagnumber}		{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	/* Other punctuation, we'll highlight it as "identifiers." */
+	"@"							{ addToken(Token.IDENTIFIER); }
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<LONG_STRING_1> {
+	[^\']+						{ addToken(Token.LITERAL_CHAR); }
+	"'''"						{ yybegin(YYINITIAL); addToken(Token.LITERAL_CHAR); }
+	"'"							{ addToken(Token.LITERAL_CHAR); }
+	<<EOF>>						{
+									if (firstToken==null) {
+										addToken(Token.LITERAL_CHAR); 
+									}
+									return firstToken;
+								}
+}
+
+<LONG_STRING_2> {
+	[^\"]+						{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\"\"\"						{ yybegin(YYINITIAL); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	\"							{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>						{
+									if (firstToken==null) {
+										addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); 
+									}
+									return firstToken;
+								}
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java	(revision 25584)
@@ -0,0 +1,1090 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 12/06/2005
+ *
+ * PythonTokenMaker.java - Token maker for the Python programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+import org.fife.ui.rsyntaxtextarea.DefaultToken;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMaker;
+
+
+/**
+ * Scanner for the Python programming language.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+
+public class PythonTokenMaker extends AbstractJFlexTokenMaker implements TokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+  public static final int LONG_STRING_2 = 2;
+  public static final int LONG_STRING_1 = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\34\1\12\1\0\1\34\1\32\22\0\1\34\1\64\1\11"+
+    "\1\33\1\0\1\63\1\67\1\10\1\57\1\57\1\62\1\61\1\64"+
+    "\1\27\1\24\1\63\1\16\7\21\2\3\1\64\1\72\1\65\1\60"+
+    "\1\66\1\64\1\71\4\23\1\26\1\23\3\2\1\31\1\2\1\15"+
+    "\5\2\1\6\2\2\1\7\2\2\1\20\2\2\1\57\1\13\1\57"+
+    "\1\64\1\1\1\0\1\35\1\42\1\44\1\37\1\25\1\22\1\52"+
+    "\1\54\1\46\1\30\1\43\1\14\1\51\1\36\1\45\1\47\1\2"+
+    "\1\4\1\40\1\41\1\5\1\55\1\53\1\17\1\50\1\56\1\57"+
+    "\1\70\1\57\1\64\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\3\0\1\1\1\2\1\3\4\2\2\4\1\5\1\2"+
+    "\1\3\2\2\1\6\1\2\1\6\1\7\1\10\21\2"+
+    "\1\11\10\6\1\2\2\12\2\4\1\13\1\3\1\14"+
+    "\1\13\1\14\4\2\2\4\1\0\2\4\1\0\4\2"+
+    "\1\13\1\3\1\13\12\2\1\15\27\2\1\15\3\2"+
+    "\2\15\1\16\1\15\15\2\3\0\2\14\1\0\12\2"+
+    "\1\4\1\17\1\20\3\2\1\3\15\2\1\15\22\2"+
+    "\1\21\14\2\1\22\1\23\1\14\6\2\1\21\3\2"+
+    "\1\15\36\2\1\15\17\2\1\15\6\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[265];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\73\0\166\0\261\0\354\0\u0127\0\u0162\0\u019d"+
+    "\0\u01d8\0\u0213\0\u024e\0\u0289\0\261\0\u02c4\0\u02ff\0\u033a"+
+    "\0\u0375\0\u03b0\0\u03eb\0\u0426\0\u0461\0\u049c\0\u04d7\0\u0512"+
+    "\0\u054d\0\u0588\0\u05c3\0\u05fe\0\u0639\0\u0674\0\u06af\0\u06ea"+
+    "\0\u0725\0\u0760\0\u079b\0\u07d6\0\u0811\0\u084c\0\u0887\0\261"+
+    "\0\u08c2\0\u08fd\0\u0938\0\261\0\u0973\0\u09ae\0\u09e9\0\u0a24"+
+    "\0\261\0\u0a5f\0\u0a9a\0\u0ad5\0\u0b10\0\u0b4b\0\u0b4b\0\u0b86"+
+    "\0\u0bc1\0\u0b4b\0\u0bfc\0\u0c37\0\u0c72\0\u0cad\0\u0ce8\0\u0d23"+
+    "\0\u0d5e\0\u0d99\0\u0dd4\0\u0e0f\0\u0e4a\0\u0e85\0\u0ec0\0\u0efb"+
+    "\0\u0f36\0\u0f71\0\u0fac\0\u0fe7\0\u1022\0\u105d\0\u1098\0\u10d3"+
+    "\0\u110e\0\u1149\0\u1184\0\u11bf\0\u11fa\0\u1235\0\u1270\0\u12ab"+
+    "\0\u12e6\0\u1321\0\u135c\0\u1397\0\u13d2\0\u140d\0\u1448\0\u1483"+
+    "\0\u14be\0\u14f9\0\u1534\0\u156f\0\u15aa\0\u15e5\0\u1620\0\u165b"+
+    "\0\u1696\0\u16d1\0\u170c\0\u1747\0\u1782\0\u17bd\0\u17f8\0\u1833"+
+    "\0\u186e\0\354\0\u18a9\0\354\0\u18e4\0\u191f\0\u195a\0\u1995"+
+    "\0\u19d0\0\u1a0b\0\u1a46\0\u1a81\0\u1abc\0\u1af7\0\u1b32\0\u1b6d"+
+    "\0\u1ba8\0\u1be3\0\u1c1e\0\u1c59\0\u1c94\0\261\0\u1ccf\0\u1d0a"+
+    "\0\u1d45\0\u1d80\0\u1dbb\0\u1df6\0\u1e31\0\u1e6c\0\u1ea7\0\u1ee2"+
+    "\0\u1f1d\0\u1f58\0\261\0\261\0\261\0\u1f93\0\u1fce\0\u2009"+
+    "\0\u2044\0\u207f\0\u20ba\0\u20f5\0\u2130\0\u216b\0\u21a6\0\u21e1"+
+    "\0\u221c\0\u2257\0\u2292\0\u22cd\0\u2308\0\u2343\0\u237e\0\u23b9"+
+    "\0\u23f4\0\u242f\0\u237e\0\u246a\0\u24a5\0\u24e0\0\u251b\0\u2556"+
+    "\0\u2591\0\u25cc\0\u2607\0\u2642\0\u267d\0\u26b8\0\u26f3\0\u272e"+
+    "\0\u2769\0\u27a4\0\u27df\0\u281a\0\u2855\0\u2890\0\u28cb\0\u2906"+
+    "\0\u2941\0\u297c\0\u29b7\0\u29f2\0\u2a2d\0\u2a68\0\261\0\261"+
+    "\0\u2aa3\0\u2ade\0\u2b19\0\u2b54\0\u17bd\0\u2b8f\0\u2bca\0\354"+
+    "\0\u2c05\0\u2c40\0\u2c7b\0\u2cb6\0\u2cf1\0\u2d2c\0\u2d67\0\u2da2"+
+    "\0\u2ddd\0\u2e18\0\u2e53\0\u2e8e\0\u2ec9\0\u2f04\0\u2f3f\0\u2f7a"+
+    "\0\u2fb5\0\u2ff0\0\u302b\0\u3066\0\u30a1\0\u30dc\0\u3117\0\u3152"+
+    "\0\u318d\0\u31c8\0\u3203\0\u323e\0\u3279\0\u32b4\0\u32ef\0\u332a"+
+    "\0\u3365\0\u33a0\0\u33db\0\u3416\0\u3451\0\u348c\0\u34c7\0\u3502"+
+    "\0\u353d\0\u3578\0\u35b3\0\u35ee\0\u33db\0\u3629\0\u3664\0\u369f"+
+    "\0\u36da\0\u3715\0\u1270\0\u3750\0\u378b\0\u37c6\0\u3801\0\u383c"+
+    "\0\u3877";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[265];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\4\2\5\1\6\1\7\1\10\1\11\1\12\1\13"+
+    "\1\14\1\15\1\4\1\16\1\5\1\17\1\20\1\5"+
+    "\1\6\1\21\1\5\1\22\1\23\1\5\1\24\2\5"+
+    "\1\4\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+
+    "\1\34\1\5\1\35\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\52"+
+    "\1\53\1\51\1\54\1\55\1\56\1\57\1\60\2\61"+
+    "\10\62\1\63\62\62\11\64\1\65\61\64\74\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\14\0\3\66\1\6\4\66\3\0\1\66\2\67\1\6"+
+    "\2\66\1\6\2\66\1\70\2\71\1\0\2\72\1\0"+
+    "\1\66\1\0\22\66\12\0\1\66\2\0\7\5\1\13"+
+    "\1\14\2\0\10\5\1\0\1\73\1\5\1\0\2\5"+
+    "\3\0\1\74\7\5\1\75\11\5\15\0\3\5\1\11"+
+    "\1\5\1\11\1\5\1\13\1\14\2\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\5\1\76\20\5\15\0"+
+    "\7\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\3\5\1\11\1\5\1\11"+
+    "\1\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\14\0\10\77\1\100\1\77\1\0"+
+    "\1\101\57\77\11\102\1\103\1\0\1\104\57\102\1\0"+
+    "\7\5\4\0\10\5\1\0\1\105\1\5\1\0\2\5"+
+    "\3\0\1\106\7\5\1\107\1\110\10\5\14\0\3\66"+
+    "\1\111\4\66\3\0\1\66\2\67\1\112\2\113\1\112"+
+    "\2\66\1\70\2\71\1\0\2\72\1\0\1\66\1\0"+
+    "\22\66\12\0\1\66\2\0\3\5\1\114\3\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\3\5\1\115\3\5\4\0\1\116\7\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\117\1\120\10\5\17\0"+
+    "\1\70\12\0\1\70\2\0\1\70\52\0\7\5\4\0"+
+    "\1\121\2\5\1\122\4\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\5\1\123\16\5\1\124\1\5\43\0\1\54"+
+    "\30\0\1\54\12\0\12\25\1\0\60\25\34\0\1\26"+
+    "\37\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\5\1\125\1\5\1\126\1\5\1\127\4\5"+
+    "\1\130\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\131\11\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\132\1\5\1\0\2\5\3\0"+
+    "\10\5\1\133\1\134\10\5\15\0\4\5\1\135\2\5"+
+    "\4\0\1\136\7\5\1\0\1\137\1\5\1\0\2\5"+
+    "\3\0\4\5\1\140\4\5\1\141\5\5\1\142\2\5"+
+    "\15\0\3\5\1\143\1\144\2\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\13\5\1\145\6\5\15\0"+
+    "\3\5\1\146\1\147\2\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\150\11\5\15\0\7\5"+
+    "\4\0\1\151\7\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\152\7\5\1\153\3\5\1\154\2\5\1\155\2\5"+
+    "\15\0\3\5\1\156\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\5\5\1\157\1\5\1\160\2\5"+
+    "\1\161\7\5\15\0\7\5\4\0\6\5\1\162\1\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\5\1\163\1\164"+
+    "\1\165\1\166\7\5\1\167\5\5\15\0\3\5\1\170"+
+    "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\171\7\5\1\172\11\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\11\5\1\173\10\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\174\10\5\1\105\10\5\15\0\7\5\4\0"+
+    "\1\175\7\5\1\0\1\137\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\17\5\1\176\2\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\177\1\5\1\0\2\5\3\0\1\200"+
+    "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\201\7\5\1\202\11\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\11\5"+
+    "\1\154\10\5\74\0\1\54\72\0\2\54\71\0\1\54"+
+    "\1\0\1\54\75\0\1\51\73\0\1\51\73\0\1\54"+
+    "\73\0\1\54\2\0\10\62\1\0\62\62\10\0\1\203"+
+    "\62\0\11\64\1\0\61\64\11\0\1\204\61\0\10\66"+
+    "\3\0\11\66\1\0\2\66\1\0\2\66\1\0\1\66"+
+    "\1\0\22\66\12\0\1\66\4\0\1\70\12\0\1\70"+
+    "\2\0\1\70\3\0\2\205\1\0\2\206\41\0\3\66"+
+    "\1\207\4\66\3\0\3\66\1\207\2\66\1\207\2\66"+
+    "\1\0\2\66\1\210\2\66\1\0\1\66\1\0\22\66"+
+    "\2\0\1\210\7\0\1\66\2\0\7\5\4\0\1\211"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\2\5\1\212"+
+    "\1\5\1\213\5\5\1\214\7\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\1\5\1\215"+
+    "\7\5\1\216\4\5\1\217\3\5\15\0\4\5\1\220"+
+    "\2\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\221\5\5\1\222\10\5\14\0"+
+    "\10\77\1\223\1\77\1\0\1\101\57\77\10\0\1\224"+
+    "\62\0\12\77\1\0\60\77\11\102\1\223\1\0\1\104"+
+    "\57\102\11\0\1\225\61\0\12\102\1\0\60\102\1\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\5\1\164\20\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\14\5\1\226\5\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\5\1\227\5\5\1\230\12\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\160"+
+    "\16\5\14\0\3\66\1\111\4\66\3\0\3\66\1\111"+
+    "\2\66\1\111\2\66\1\70\2\71\1\0\2\72\1\0"+
+    "\1\66\1\0\22\66\12\0\1\66\1\0\3\66\1\111"+
+    "\4\66\3\0\1\66\2\67\1\112\2\66\1\112\2\66"+
+    "\1\70\2\71\1\0\2\72\1\0\1\66\1\0\22\66"+
+    "\12\0\1\66\1\0\3\66\1\231\4\66\3\0\3\66"+
+    "\1\231\2\66\3\231\1\0\2\231\1\0\2\66\1\0"+
+    "\1\66\1\0\1\231\1\66\1\231\2\66\1\231\1\66"+
+    "\1\231\12\66\12\0\1\66\2\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\232\21\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\10\5\1\233\11\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\10\5\1\234\11\5\15\0"+
+    "\3\5\1\162\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\1\235\7\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\5\1\236\20\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\3\5\1\237\5\5\1\240\10\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\241\1\5\1\0\2\5\3\0"+
+    "\7\5\1\242\12\5\15\0\4\5\1\243\2\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\244\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\2\5\1\162\17\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5"+
+    "\1\245\16\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\3\5\1\164\16\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\246\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\4\5\1\162\15\5\15\0\7\5"+
+    "\4\0\1\247\5\5\1\162\1\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\4\5\1\250\2\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\3\5\1\164\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\7\5\1\160\10\5\1\251\1\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\12\5\1\166\1\5\1\164\5\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\252"+
+    "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\4\5\1\253\15\5\15\0\3\5\1\164"+
+    "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\254\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\15\5\1\255\4\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\256\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\13\5\1\162\6\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\257\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\12\5\1\260\7\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\261\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\6\5\1\262\1\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\10\5\1\244"+
+    "\11\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\263\21\5\15\0\7\5\4\0\1\264"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\1\265\1\5\1\0\2\5"+
+    "\3\0\1\5\1\266\12\5\1\267\5\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\164\7\5\15\0\3\5\1\164\3\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\270\21\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\2\5\1\164\17\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\1\271\1\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"+
+    "\1\164\15\5\15\0\7\5\4\0\10\5\1\0\1\105"+
+    "\1\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\272"+
+    "\5\5\1\273\7\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\3\5\1\274\5\5\1\275"+
+    "\10\5\15\0\7\5\4\0\10\5\1\0\1\214\1\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\12\5\1\276\7\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\10\5\1\277\1\300\10\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\301"+
+    "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\16\5\1\164\3\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\302\1\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\3\5\1\164\4\5\1\0\2\5"+
+    "\1\0\2\5\3\0\12\5\1\164\7\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\303\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\11\5\1\304\10\5\15\0\7\5"+
+    "\4\0\3\5\1\164\4\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\3\5\1\305\16\5\15\0\3\5"+
+    "\1\127\3\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\11\5\1\306\10\5\24\0\1\307"+
+    "\73\0\1\310\64\0\1\311\12\0\1\311\2\0\1\311"+
+    "\5\0\1\210\31\0\1\210\11\0\3\66\1\207\4\66"+
+    "\3\0\3\66\1\207\2\66\1\207\2\66\1\0\2\66"+
+    "\1\0\2\72\1\0\1\66\1\0\22\66\12\0\1\66"+
+    "\4\0\1\311\12\0\1\311\2\0\1\311\52\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\312\11\5\15\0\4\5\1\252\2\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\4\5"+
+    "\1\313\2\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\3\5\1\164\3\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\15\5"+
+    "\1\260\4\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\3\5\1\237\16\5\15\0\1\314"+
+    "\6\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\5\1\315\20\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\141"+
+    "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\7\5\1\316\12\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\317"+
+    "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\15\5\1\320\4\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\1\321\21\5"+
+    "\14\0\3\66\1\231\4\66\3\0\1\66\2\67\1\231"+
+    "\2\66\3\231\1\0\2\231\1\0\2\66\1\0\1\66"+
+    "\1\0\1\231\1\66\1\231\2\66\1\231\1\66\1\231"+
+    "\12\66\12\0\1\66\2\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\5\1\215\20\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\14\5\1\162\5\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\322\21\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\164\1\5\1\0\2\5\3\0"+
+    "\4\5\1\166\15\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\323\21\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\162\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\6\5\1\162\1\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\324"+
+    "\12\5\15\0\7\5\4\0\10\5\1\0\1\325\1\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\14\5\1\326\5\5"+
+    "\15\0\7\5\4\0\1\164\7\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+    "\1\327\1\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\1\330\7\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\331\21\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\5\5\1\332\14\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\14\5\1\333\5\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\7\5\1\260\12\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\4\5\1\334\15\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\5\1\335\20\5"+
+    "\15\0\3\5\1\322\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\260"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\1\164\1\5\1\0\2\5"+
+    "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\1\336\21\5\15\0\7\5\4\0"+
+    "\6\5\1\166\1\5\1\0\2\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\337\16\5\15\0\7\5\4\0"+
+    "\1\340\7\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\15\0\3\5\1\252\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\4\5\1\341\15\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\12\5\1\342\7\5\15\0\3\5\1\320\3\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\10\5\1\0\1\343\1\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+    "\1\344\1\5\1\0\2\5\3\0\22\5\15\0\4\5"+
+    "\1\160\2\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\22\5\15\0\4\5\1\345\2\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\5"+
+    "\1\346\20\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\10\5\1\327\11\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\347\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\1\5\1\131\20\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5"+
+    "\1\162\16\5\15\0\7\5\4\0\1\125\7\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\350"+
+    "\14\5\15\0\7\5\4\0\1\237\7\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\1\331\16\5\1\164"+
+    "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\2\5\1\320\17\5\17\0\1\311\12\0"+
+    "\1\311\2\0\1\311\6\0\2\206\42\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\1\315\21\5"+
+    "\15\0\3\5\1\351\3\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\11\5\1\352\10\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\10\5\1\353\6\5\1\214\2\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\2\5"+
+    "\1\354\17\5\15\0\7\5\4\0\1\127\7\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\320"+
+    "\15\5\15\0\7\5\4\0\1\355\7\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\6\5"+
+    "\1\356\1\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\12\5\1\131\7\5\15\0\7\5\4\0\10\5"+
+    "\1\0\1\357\1\5\1\0\2\5\3\0\22\5\15\0"+
+    "\3\5\1\131\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\13\5\1\164\6\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\4\5\1\360\15\5\15\0\7\5\4\0\1\361\7\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+    "\1\315\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\11\5\1\362\10\5\15\0\7\5"+
+    "\4\0\10\5\1\0\1\306\1\5\1\0\2\5\3\0"+
+    "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\6\5\1\162\13\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\363"+
+    "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\364\21\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\11\5\1\365\10\5"+
+    "\15\0\7\5\4\0\1\366\7\5\1\0\2\5\1\0"+
+    "\2\5\3\0\11\5\1\257\10\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\160"+
+    "\12\5\15\0\3\5\1\105\3\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\367"+
+    "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\370\16\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\371\1\5\1\0\2\5\3\0\22\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\372\21\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\1\5\1\162\20\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\5\1\373\20\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\2\5\1\260\17\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\162\21\5\15\0\7\5\4\0\1\143\7\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\257"+
+    "\10\5\15\0\3\5\1\374\3\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\214"+
+    "\15\5\15\0\7\5\4\0\10\5\1\0\1\320\1\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\7\5\1\375\12\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\14\5\1\376\5\5\15\0\7\5\4\0\10\5"+
+    "\1\0\2\5\1\0\2\5\3\0\5\5\1\257\14\5"+
+    "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+    "\3\0\1\5\1\377\20\5\15\0\7\5\4\0\10\5"+
+    "\1\0\1\177\1\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\7\5\1\u0100\12\5\15\0\7\5\4\0\10\5\1\0"+
+    "\2\5\1\0\2\5\3\0\4\5\1\u0101\15\5\15\0"+
+    "\3\5\1\u0102\3\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\22\5\15\0\7\5\4\0\1\u0103\7\5"+
+    "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+    "\1\273\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\1\u0104\21\5\15\0\7\5\4\0"+
+    "\10\5\1\0\1\u0105\1\5\1\0\2\5\3\0\22\5"+
+    "\15\0\4\5\1\237\2\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\u0106"+
+    "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+    "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+    "\1\u0107\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\4\5\1\330\15\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"+
+    "\1\260\15\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+    "\1\0\2\5\3\0\4\5\1\u0108\15\5\15\0\7\5"+
+    "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\u0109"+
+    "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\1\5\1\252\20\5\15\0\7\5\4\0"+
+    "\10\5\1\0\2\5\1\0\2\5\3\0\17\5\1\333"+
+    "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+    "\2\5\3\0\3\5\1\127\16\5\14\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[14514];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\3\0\1\11\10\1\1\11\32\1\1\11\3\1\1\11"+
+    "\4\1\1\11\17\1\1\0\2\1\1\0\76\1\3\0"+
+    "\1\11\1\1\1\0\12\1\3\11\61\1\2\11\101\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[265];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public PythonTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = LONG_STRING_2;
+				break;
+			case Token.LITERAL_CHAR:
+				state = LONG_STRING_1;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public PythonTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public PythonTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 168) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 20: break;
+        case 10: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 21: break;
+        case 8: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 22: break;
+        case 12: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 23: break;
+        case 13: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 24: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 25: break;
+        case 15: 
+          { yybegin(LONG_STRING_1); addToken(Token.LITERAL_CHAR);
+          }
+        case 26: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 27: break;
+        case 14: 
+          { addToken(Token.FUNCTION);
+          }
+        case 28: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 29: break;
+        case 17: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 30: break;
+        case 4: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 31: break;
+        case 7: 
+          { addToken(Token.COMMENT_EOL);
+          }
+        case 32: break;
+        case 11: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 33: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 34: break;
+        case 6: 
+          { addToken(Token.OPERATOR);
+          }
+        case 35: break;
+        case 19: 
+          { yybegin(YYINITIAL); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 36: break;
+        case 16: 
+          { yybegin(LONG_STRING_2); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 37: break;
+        case 18: 
+          { yybegin(YYINITIAL); addToken(Token.LITERAL_CHAR);
+          }
+        case 38: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 266: break;
+            case LONG_STRING_2: {
+              if (firstToken==null) {
+										addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); 
+									}
+									return firstToken;
+            }
+            case 267: break;
+            case LONG_STRING_1: {
+              if (firstToken==null) {
+										addToken(Token.LITERAL_CHAR); 
+									}
+									return firstToken;
+            }
+            case 268: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex	(revision 25584)
@@ -0,0 +1,763 @@
+/*
+ * 09/11/2008
+ *
+ * RubyTokenMaker.java - Scanner for Ruby
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Ruby.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated RubyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class RubyTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED		= -3;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -4;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -5;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED		= -6;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q!...! style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_BANG				= -7;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q{...} style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_CURLY_BRACE		= -8;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q&lt;...&gt; style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_LT					= -9;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q(...) style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_PAREN					= -10;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q/.../ style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SLASH				= -11;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q[...] style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SQUARE_BRACKET		= -12;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public RubyTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED:
+				state = HEREDOC_EOF_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED:
+				state = HEREDOC_EOT_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_BANG:
+				state = STRING_Q_BANG;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_CURLY_BRACE:
+				state = STRING_Q_CURLY_BRACE;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_LT:
+				state = STRING_Q_LT;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_PAREN:
+				state = STRING_Q_PAREN;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SLASH:
+				state = STRING_Q_SLASH;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SQUARE_BRACKET:
+				state = STRING_Q_SQUARE_BRACKET;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+BinaryDigit							= ([01])
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
+
+IdentifierStart					= ({Letter}|"_")
+IdentifierPart						= ({IdentifierStart}|{Digit})
+BooleanLiteral				= ("true"|"false")
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+LineCommentBegin			= "#"
+DocCommentBegin				= "=begin"
+DocCommentEnd				= "=end"
+
+DigitOrUnderscore			= ({Digit}|[_])
+BinaryIntLiteral			= ("0b"{BinaryDigit}([01_]*{BinaryDigit})?)
+OctalLiteral				= ("0"([0-7_]*{OctalDigit})?)
+DecimalLiteral1				= ("0d"{Digit}({DigitOrUnderscore}*{Digit})?)
+DecimalLiteral2				= ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?)
+DecimalLiteral				= ({BinaryIntLiteral}|{OctalLiteral}|{DecimalLiteral1}|{DecimalLiteral2})
+HexLiteral					= ("0x"{HexDigit}([0-9a-zA-Z_]*{HexDigit})?)
+FloatLiteral				= ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?[Ee]({Digit}({DigitOrUnderscore}*{Digit})?)?)
+
+Separator					= ([\(\)\{\}])
+Operator1					= ("::"|"."|"["|"]"|"-"|"+"|"!"|"~"|"*"|"/"|"%"|"<<"|">>"|"&"|"|"|"^")
+Operator2					= (">"|">="|"<"|"<="|"<=>"|"=="|"==="|"!="|"=~"|"!~"|"&&"|"||")
+Operator3					= (".."|"..."|"="|"+="|"-="|"*="|"/="|"%=")
+Operator					= ({Operator1}|{Operator2}|{Operator3})
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+Symbol					= ([:]{Identifier})
+ErrorIdentifier			= ({NonSeparator}+)
+
+PreDefinedVariable			= ("$"([!@&`\'+0-9~=/\,;.<>_*$?:\"]|"DEBUG"|"FILENAME"|"LOAD_PATH"|"stderr"|"stdin"|"stdout"|"VERBOSE"|([\-][0adFiIlpwv])))
+Variable					= ({PreDefinedVariable}|([@][@]?|[$]){Identifier})
+
+%state STRING
+%state STRING_Q_BANG
+%state STRING_Q_CURLY_BRACE
+%state STRING_Q_PAREN
+%state STRING_Q_SLASH
+%state STRING_Q_SQUARE_BRACKET
+%state STRING_Q_LT
+%state CHAR_LITERAL
+%state BACKTICKS
+%state HEREDOC_EOF_UNQUOTED
+%state HEREDOC_EOF_SINGLE_QUOTED
+%state HEREDOC_EOF_DOUBLE_QUOTED
+%state HEREDOC_EOT_UNQUOTED
+%state HEREDOC_EOT_SINGLE_QUOTED
+%state HEREDOC_EOT_DOUBLE_QUOTED
+%state DOCCOMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"alias" |
+	"BEGIN" |
+	"begin" |
+	"break" |
+	"case" |
+	"class" |
+	"def" |
+	"defined" |
+	"do" |
+	"else" |
+	"elsif" |
+	"END" |
+	"end" |
+	"ensure" |
+	"for" |
+	"if" |
+	"in" |
+	"module" |
+	"next" |
+	"nil" |
+	"redo" |
+	"rescue" |
+	"retry" |
+	"return" |
+	"self" |
+	"super" |
+	"then" |
+	"undef" |
+	"unless" |
+	"until" |
+	"when" |
+	"while" |
+	"yield"					{ addToken(Token.RESERVED_WORD); }
+
+	"Array" |
+	"Float" |
+	"Integer" |
+	"String" |
+	"at_exit" |
+	"autoload" |
+	"binding" |
+	"caller" |
+	"catch" |
+	"chop" |
+	"chop!" |
+	"chomp" |
+	"chomp!" |
+	"eval" |
+	"exec" |
+	"exit" |
+	"exit!" |
+	"fail" |
+	"fork" |
+	"format" |
+	"gets" |
+	"global_variables" |
+	"gsub" |
+	"gsub!" |
+	"iterator?" |
+	"lambda" |
+	"load" |
+	"local_variables" |
+	"loop" |
+	"open" |
+	"p" |
+	"print" |
+	"printf" |
+	"proc" |
+	"putc" |
+	"puts" |
+	"raise" |
+	"rand" |
+	"readline" |
+	"readlines" |
+	"require" |
+	"select" |
+	"sleep" |
+	"split" |
+	"sprintf" |
+	"srand" |
+	"sub" |
+	"sub!" |
+	"syscall" |
+	"system" |
+	"test" |
+	"trace_var" |
+	"trap" |
+	"untrace_var"					{ addToken(Token.FUNCTION); } 
+
+	"and" |
+	"or" |
+	"not"					{ addToken(Token.OPERATOR); }
+
+	{BooleanLiteral}			{ addToken(Token.LITERAL_BOOLEAN); }
+
+	{Variable}						{ addToken(Token.VARIABLE); }
+	{Symbol}						{ addToken(Token.PREPROCESSOR); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	\"							{ start = zzMarkedPos-1; yybegin(STRING); }
+	\'							{ start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+	[\%][QqWwx]?[\(]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_PAREN); }
+	[\%][QqWwx]?[\{]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_CURLY_BRACE); }
+	[\%][QqWwx]?[\[]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_SQUARE_BRACKET); }
+	[\%][QqWwx]?[\<]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_LT); }
+	[\%][QqWwx]?[\!]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_BANG); }
+	[\%][QqWwx]?[\/]			{ start = zzMarkedPos-yylength(); yybegin(STRING_Q_SLASH); }
+	\`							{ start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+	/* Comment literals. */
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	{DocCommentBegin}				{ start = zzMarkedPos-6; yybegin(DOCCOMMENT); }
+
+	/* "Here-document" syntax.  This is only implemented for the common */
+	/* cases.                                                           */
+	"<<EOF"						{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOF"\"		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOF"\'		{ start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOF"\`		{ start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+	"<<EOT"						{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \""EOT"\"		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+	"<<" {WhiteSpace}* \'"EOT"\'		{ start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
+	"<<" {WhiteSpace}* \`"EOT"\`		{ start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+
+	/* Separators and operators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{DecimalLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<STRING> {
+	[^\n\\\"]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<STRING_Q_BANG> {
+	[^\n\\\!]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\!					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
+}
+
+
+<STRING_Q_CURLY_BRACE> {
+	[^\n\\\}]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
+}
+
+
+<STRING_Q_LT> {
+	[^\n\\\>]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\>					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
+}
+
+
+<STRING_Q_PAREN> {
+	[^\n\\\)]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\)					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
+}
+
+
+<STRING_Q_SLASH> {
+	[^\n\\\/]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\/					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
+}
+
+
+<STRING_Q_SQUARE_BRACKET> {
+	[^\n\\\]]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\]					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+	[^\n\\\']+			{}
+	\\.?					{ /* Skip escaped single quotes only, but this should still work. */ }
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	\'					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+	[^\n\\\`]+		{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	\`					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<HEREDOC_EOF_UNQUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOF, double quoted       */
+	/* <<"EOF" and backticks <<`EOF`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_DOUBLE_QUOTED> {
+	/* NOTE: The closing "EOF" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOF" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	"EOF"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_UNQUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOF and any other chars.                                         */
+	/* NOTE2: This case is used for unquoted <<EOT, double quoted       */
+	/* <<"EOT" and backticks <<`EOT`, since they all follow the same    */
+	/* syntactic rules.                                                 */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+			{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_SINGLE_QUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOT and any other chars.                                         */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_DOUBLE_QUOTED> {
+	/* NOTE: The closing "EOT" is supposed to be on a line by itself -  */
+	/* no surrounding whitespace or other chars.  However, the way      */
+	/* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+	/* work.  Fortunately we don't need the start- and end-line anchors */
+	/* since the production after "EOT" will match any line containing  */
+	/* EOT and any other chars.                                         */
+	"EOT"				{ if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+	[^\n\\]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+	\\.?					{ /* Skip escaped chars. */ }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<DOCCOMMENT> {
+
+	[^\n\=]+				{}
+	{DocCommentEnd}			{ yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_DOCUMENTATION); }
+	=					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+	<<EOF>>					{ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java	(revision 25584)
@@ -0,0 +1,1666 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 09/11/2008
+ *
+ * RubyTokenMaker.java - Scanner for Ruby
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Ruby.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated RubyTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class RubyTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int HEREDOC_EOF_SINGLE_QUOTED = 11;
+  public static final int DOCCOMMENT = 14;
+  public static final int HEREDOC_EOT_SINGLE_QUOTED = 13;
+  public static final int HEREDOC_EOT_UNQUOTED = 12;
+  public static final int STRING_Q_SLASH = 5;
+  public static final int STRING_Q_BANG = 2;
+  public static final int STRING_Q_LT = 7;
+  public static final int STRING = 1;
+  public static final int BACKTICKS = 9;
+  public static final int YYINITIAL = 0;
+  public static final int HEREDOC_EOF_UNQUOTED = 10;
+  public static final int STRING_Q_CURLY_BRACE = 3;
+  public static final int STRING_Q_PAREN = 4;
+  public static final int HEREDOC_EOF_DOUBLE_QUOTED = 11;
+  public static final int CHAR_LITERAL = 8;
+  public static final int HEREDOC_EOT_DOUBLE_QUOTED = 13;
+  public static final int STRING_Q_SQUARE_BRACKET = 6;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\24\1\23\1\0\1\24\1\7\22\0\1\24\1\44\1\105"+
+    "\1\10\1\55\1\47\1\52\1\106\1\110\1\35\1\43\1\43\1\57"+
+    "\1\42\1\37\1\46\1\3\1\4\6\6\2\2\1\36\1\57\1\50"+
+    "\1\25\1\51\1\103\1\56\1\66\1\61\1\5\1\60\1\34\1\63"+
+    "\1\62\1\1\1\64\2\1\1\1\1\1\1\65\1\67\1\1\1\107"+
+    "\1\1\1\72\1\70\1\1\1\1\1\107\3\1\1\40\1\11\1\41"+
+    "\1\54\1\12\1\112\1\20\1\26\1\75\1\32\1\16\1\17\1\27"+
+    "\1\101\1\30\1\1\1\74\1\21\1\76\1\31\1\71\1\100\1\104"+
+    "\1\14\1\22\1\13\1\15\1\73\1\102\1\33\1\77\1\1\1\111"+
+    "\1\53\1\113\1\45\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\17\0\1\1\1\2\2\3\1\2\1\4\10\2\1\5"+
+    "\1\6\1\7\6\2\1\10\1\2\11\7\2\1\11\2"+
+    "\1\11\1\2\1\12\1\13\1\14\1\15\1\16\1\17"+
+    "\1\20\1\15\1\21\1\15\1\22\1\15\1\23\1\15"+
+    "\1\24\1\15\1\25\1\15\1\26\1\15\1\27\1\30"+
+    "\1\31\1\15\1\32\1\33\1\15\1\34\1\15\1\35"+
+    "\1\36\1\15\1\37\1\15\1\40\1\15\1\1\1\41"+
+    "\1\3\4\1\30\2\1\0\7\2\1\42\5\2\1\43"+
+    "\1\7\1\0\1\44\1\45\1\46\1\47\1\50\1\51"+
+    "\2\7\3\52\1\0\1\1\4\2\1\7\12\2\1\16"+
+    "\1\27\2\15\1\0\1\41\2\3\1\53\24\2\1\42"+
+    "\7\2\1\11\6\2\1\0\10\2\1\42\5\0\20\2"+
+    "\1\54\1\0\4\1\1\55\1\2\1\11\16\2\1\11"+
+    "\5\2\1\0\3\2\4\0\11\2\1\56\12\2\1\0"+
+    "\2\2\1\57\1\60\3\0\2\2\1\11\5\2\1\61"+
+    "\1\2\6\0\4\2\1\62\1\63\1\11\7\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[344];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214"+
+    "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u03dc\0\u0428\0\u0474"+
+    "\0\u04c0\0\u050c\0\u0558\0\u05a4\0\u05f0\0\u063c\0\u0688\0\u06d4"+
+    "\0\u0720\0\u076c\0\u07b8\0\u0804\0\u0850\0\u05a4\0\u089c\0\u08e8"+
+    "\0\u0934\0\u0980\0\u09cc\0\u0a18\0\u0a64\0\u0ab0\0\u05a4\0\u0afc"+
+    "\0\u0b48\0\u05a4\0\u0b94\0\u0be0\0\u0c2c\0\u0c78\0\u0cc4\0\u0d10"+
+    "\0\u0d5c\0\u0da8\0\u0df4\0\u0e40\0\u0e8c\0\u0ed8\0\u0f24\0\u0f70"+
+    "\0\u0fbc\0\u1008\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u05a4\0\u05a4"+
+    "\0\u05a4\0\u1184\0\u11d0\0\u05a4\0\u05a4\0\u121c\0\u05a4\0\u1268"+
+    "\0\u05a4\0\u12b4\0\u05a4\0\u1300\0\u05a4\0\u134c\0\u05a4\0\u1398"+
+    "\0\u05a4\0\u13e4\0\u1430\0\u05a4\0\u05a4\0\u147c\0\u05a4\0\u05a4"+
+    "\0\u14c8\0\u05a4\0\u1514\0\u05a4\0\u05a4\0\u1560\0\u05a4\0\u15ac"+
+    "\0\u05a4\0\u15f8\0\u1644\0\u1690\0\u16dc\0\u16dc\0\u1728\0\u1774"+
+    "\0\u17c0\0\u180c\0\u1858\0\u18a4\0\u18f0\0\u193c\0\u1988\0\u19d4"+
+    "\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u1b50\0\u1b9c\0\u1be8\0\u1c34"+
+    "\0\u1c80\0\u1ccc\0\u1d18\0\u1d64\0\u1db0\0\u1dfc\0\u1e48\0\u1e94"+
+    "\0\u1ee0\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4"+
+    "\0\u2140\0\u04c0\0\u218c\0\u21d8\0\u2224\0\u2270\0\u22bc\0\u2308"+
+    "\0\u2354\0\u23a0\0\u05a4\0\u05a4\0\u05a4\0\u05a4\0\u05a4\0\u05a4"+
+    "\0\u23ec\0\u2438\0\u2484\0\u0474\0\u05a4\0\u24d0\0\u251c\0\u2568"+
+    "\0\u25b4\0\u2600\0\u264c\0\u04c0\0\u2698\0\u26e4\0\u2730\0\u277c"+
+    "\0\u27c8\0\u2814\0\u2860\0\u28ac\0\u28f8\0\u2944\0\u05a4\0\u05a4"+
+    "\0\u2990\0\u29dc\0\u2a28\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4"+
+    "\0\u2bf0\0\u2c3c\0\u2c88\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04"+
+    "\0\u2e50\0\u2e9c\0\u2ee8\0\u2f34\0\u2f80\0\u2fcc\0\u3018\0\u3064"+
+    "\0\u30b0\0\u30fc\0\u3148\0\u3194\0\u31e0\0\u322c\0\u3278\0\u32c4"+
+    "\0\u3310\0\u335c\0\u33a8\0\u33f4\0\u3440\0\u348c\0\u34d8\0\u3524"+
+    "\0\u3570\0\u35bc\0\u3608\0\u3654\0\u36a0\0\u36ec\0\u3738\0\u3784"+
+    "\0\u37d0\0\u381c\0\u3868\0\u38b4\0\u3900\0\u394c\0\u3998\0\u39e4"+
+    "\0\u3a30\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60\0\u3bac\0\u3bf8\0\u3c44"+
+    "\0\u3c90\0\u3cdc\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58\0\u3ea4"+
+    "\0\u3ef0\0\u14c8\0\u3f3c\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u04c0"+
+    "\0\u3f88\0\u04c0\0\u3fd4\0\u4020\0\u406c\0\u40b8\0\u4104\0\u4150"+
+    "\0\u419c\0\u41e8\0\u4234\0\u4280\0\u42cc\0\u4318\0\u4364\0\u43b0"+
+    "\0\u05a4\0\u43fc\0\u4448\0\u4494\0\u44e0\0\u452c\0\u4578\0\u45c4"+
+    "\0\u4610\0\u465c\0\u46a8\0\u46f4\0\u4740\0\u478c\0\u47d8\0\u4824"+
+    "\0\u4870\0\u48bc\0\u4908\0\u4954\0\u49a0\0\u49ec\0\u4a38\0\u05a4"+
+    "\0\u4a84\0\u4ad0\0\u4b1c\0\u4b68\0\u4bb4\0\u4c00\0\u4c4c\0\u4c98"+
+    "\0\u4ce4\0\u4d30\0\u4d7c\0\u4dc8\0\u4e14\0\u05a4\0\u05a4\0\u4e60"+
+    "\0\u4eac\0\u4ef8\0\u4f44\0\u4f90\0\u4fdc\0\u5028\0\u5074\0\u50c0"+
+    "\0\u510c\0\u4fdc\0\u05a4\0\u5158\0\u51a4\0\u51f0\0\u523c\0\u5288"+
+    "\0\u52d4\0\u5320\0\u536c\0\u53b8\0\u5404\0\u5450\0\u05a4\0\u05a4"+
+    "\0\u3738\0\u549c\0\u54e8\0\u5534\0\u5580\0\u55cc\0\u5618\0\u5664";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[344];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\20\1\21\1\22\1\23\1\22\1\21\1\22\1\24"+
+    "\1\25\1\20\1\21\1\26\1\27\1\30\1\31\1\32"+
+    "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\45\1\21\1\46\1\47\1\50\1\51"+
+    "\2\52\2\53\1\54\1\52\1\53\1\55\1\56\1\57"+
+    "\1\60\1\61\1\52\1\62\1\63\1\24\1\21\1\64"+
+    "\1\21\1\65\1\66\1\21\1\67\2\21\1\70\1\71"+
+    "\2\21\1\72\1\73\1\74\1\75\1\21\1\76\1\24"+
+    "\1\21\1\77\1\100\1\21\2\47\1\101\1\47\11\102"+
+    "\1\103\11\102\1\104\61\102\1\105\6\102\11\106\1\103"+
+    "\11\106\1\107\20\106\1\105\47\106\11\110\1\103\11\110"+
+    "\1\111\67\110\1\105\11\112\1\103\11\112\1\113\11\112"+
+    "\1\105\56\112\11\114\1\103\11\114\1\115\22\114\1\105"+
+    "\45\114\11\116\1\103\11\116\1\117\15\116\1\105\52\116"+
+    "\11\120\1\103\11\120\1\121\25\120\1\105\42\120\11\122"+
+    "\1\123\11\122\1\124\62\122\1\125\5\122\11\126\1\103"+
+    "\11\126\1\127\66\126\1\130\1\126\11\131\1\103\11\131"+
+    "\1\132\10\131\1\133\70\131\1\103\11\131\1\134\10\131"+
+    "\1\133\70\131\1\103\11\131\1\135\10\131\1\136\70\131"+
+    "\1\103\11\131\1\137\10\131\1\136\57\131\23\140\1\141"+
+    "\1\140\1\142\66\140\7\20\1\0\13\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\2\20\3\22\1\20\1\22\1\0\2\20\1\143"+
+    "\3\20\1\144\4\20\3\0\6\20\1\144\20\0\2\20"+
+    "\1\0\23\20\1\0\1\20\2\0\1\20\4\0\3\20"+
+    "\2\145\1\20\1\145\1\0\2\20\1\146\10\20\3\0"+
+    "\1\147\3\20\1\150\1\151\1\20\20\0\2\20\1\0"+
+    "\23\20\1\0\1\20\2\0\1\20\120\0\23\25\1\0"+
+    "\70\25\1\20\6\21\1\0\2\20\2\21\1\152\1\21"+
+    "\1\153\4\21\3\0\7\21\20\0\2\20\1\0\21\21"+
+    "\1\154\1\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\4\21\1\155\1\21\1\156\2\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\3\21\1\157\3\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\7\21\1\160\1\21\3\0\3\21\1\161\1\21"+
+    "\1\162\1\21\20\0\2\20\1\0\13\21\1\163\7\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\6\21\1\164\2\21\3\0\7\21\20\0\2\20"+
+    "\1\0\11\21\1\165\11\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\1\21\1\166\1\21"+
+    "\1\167\3\21\1\170\1\21\3\0\3\21\1\171\3\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\6\21\1\172\2\21"+
+    "\3\0\7\21\20\0\2\20\1\0\11\21\1\173\11\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\2\21\1\174\1\175\1\176\2\21\1\177\1\21"+
+    "\3\0\7\21\20\0\2\20\1\0\17\21\1\200\1\201"+
+    "\2\21\1\0\1\21\2\0\1\21\30\0\1\37\114\0"+
+    "\1\53\1\202\16\0\1\52\46\0\1\20\6\21\1\0"+
+    "\2\20\2\21\1\203\1\21\1\204\4\21\3\0\2\21"+
+    "\1\205\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\206\2\21\1\207\1\210\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\1\21\1\211\3\21\1\212\3\21"+
+    "\3\0\3\21\1\212\3\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\4\21\1\213\4\21\3\0\2\21\1\214\4\21"+
+    "\20\0\2\20\1\0\11\21\1\215\11\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\216\4\21\3\0\7\21\20\0\2\20\1\0\11\21"+
+    "\1\212\11\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\5\21\1\217\15\21\1\0\1\21\2\0\1\21"+
+    "\5\0\1\220\3\0\1\220\4\0\11\220\3\0\7\220"+
+    "\1\0\1\52\21\0\23\220\1\0\1\220\2\0\1\220"+
+    "\43\0\1\221\101\0\1\52\113\0\1\52\17\0\1\52"+
+    "\73\0\1\52\5\0\1\222\4\0\1\223\3\0\1\224"+
+    "\1\0\1\225\1\0\1\226\31\0\1\222\1\0\1\222"+
+    "\2\0\1\222\1\227\1\230\27\0\1\231\22\0\1\232"+
+    "\70\0\1\52\23\0\1\52\114\0\1\52\114\0\1\52"+
+    "\40\0\1\20\1\233\3\234\1\233\1\234\1\0\2\20"+
+    "\11\233\2\0\1\235\7\233\1\0\2\235\2\0\1\236"+
+    "\4\235\1\0\3\235\2\0\2\234\1\235\23\233\1\235"+
+    "\1\233\2\235\1\233\2\0\1\235\1\0\1\20\1\233"+
+    "\3\20\1\233\1\20\1\0\2\20\11\233\3\0\7\233"+
+    "\20\0\1\20\1\237\1\0\23\233\1\0\1\233\2\0"+
+    "\1\233\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\6\21\1\240\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+    "\1\241\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\3\21\1\242\3\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\2\21\1\243\6\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\2\21\1\244\6\21"+
+    "\3\0\7\21\20\0\2\20\1\0\20\21\1\245\2\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\1\21\1\246\7\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\6\21\1\247\1\250\1\21\3\0"+
+    "\7\21\20\0\2\20\1\0\21\21\1\251\1\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\252"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\2\21\1\253\4\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\2\21\1\254\1\255\5\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\7\21\20\0\2\20\1\0\21\21\1\256\1\21"+
+    "\1\0\1\21\2\0\1\21\4\0\11\102\1\0\11\102"+
+    "\1\0\61\102\1\0\6\102\23\257\1\0\70\257\11\106"+
+    "\1\0\11\106\1\0\20\106\1\0\47\106\11\110\1\0"+
+    "\11\110\1\0\67\110\1\0\11\112\1\0\11\112\1\0"+
+    "\11\112\1\0\56\112\11\114\1\0\11\114\1\0\22\114"+
+    "\1\0\45\114\11\116\1\0\11\116\1\0\15\116\1\0"+
+    "\52\116\11\120\1\0\11\120\1\0\25\120\1\0\42\120"+
+    "\11\122\1\0\11\122\1\0\62\122\1\0\5\122\23\260"+
+    "\1\0\70\260\11\126\1\0\11\126\1\0\66\126\1\0"+
+    "\1\126\11\131\1\0\11\131\1\0\101\131\1\0\11\131"+
+    "\1\0\43\131\1\261\35\131\1\0\11\131\1\0\43\131"+
+    "\1\262\24\131\23\140\1\0\1\140\1\0\66\140\16\0"+
+    "\1\263\75\0\2\20\3\22\1\20\1\22\1\0\2\20"+
+    "\1\143\10\20\3\0\7\20\20\0\2\20\1\0\23\20"+
+    "\1\0\1\20\2\0\1\20\4\0\2\20\3\264\1\20"+
+    "\1\264\1\0\13\20\3\0\7\20\20\0\2\20\1\0"+
+    "\23\20\1\0\1\20\2\0\1\20\4\0\3\20\2\145"+
+    "\1\20\1\145\1\0\2\20\1\146\10\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\3\20\2\265\2\20\1\0\13\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\2\20\3\266\1\20\1\266\1\0\13\20\3\0"+
+    "\7\20\20\0\2\20\1\0\23\20\1\0\1\20\2\0"+
+    "\1\20\4\0\2\20\5\267\1\0\6\20\3\267\2\20"+
+    "\3\0\1\267\3\20\1\267\1\20\1\267\20\0\2\20"+
+    "\1\0\2\267\1\20\1\267\2\20\1\267\6\20\1\267"+
+    "\5\20\1\0\1\20\2\0\1\20\4\0\1\20\6\21"+
+    "\1\0\2\20\3\21\1\270\2\21\1\271\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\10\21\1\272"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\273\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\1\21\1\274\4\21\1\275\1\21\1\276\3\0"+
+    "\4\21\1\277\2\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\300\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\2\21\1\301\1\302\3\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\1\21\1\303\5\21\1\304\1\21"+
+    "\3\0\4\21\1\305\2\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\10\21\1\306\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\10\21\1\307\3\0\4\21\1\212\2\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\310\4\21"+
+    "\3\0\2\21\1\311\4\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\6\21\1\312\2\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\7\21\1\313\1\21\3\0\2\21"+
+    "\1\312\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\2\21"+
+    "\1\314\6\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\1\315\10\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\316\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\2\21\1\317"+
+    "\4\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\4\21\1\244\2\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\320"+
+    "\4\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\6\21\1\302\2\21\3\0\7\21\20\0"+
+    "\2\20\1\0\11\21\1\321\3\21\1\322\5\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\323\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\1\324\6\21\20\0\2\20"+
+    "\1\0\20\21\1\325\2\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\7\21\1\326\1\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\327\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\10\21\1\330\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\2\21\1\331\4\21\1\332\1\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\22\0\1\333\75\0\1\20\6\21\1\0\2\20"+
+    "\4\21\1\334\4\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\1\21\1\335\5\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\3\21\1\336"+
+    "\3\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\1\21\1\337"+
+    "\7\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\340"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\3\21\1\341\5\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\342\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\5\21\1\343\1\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\7\21\1\212\1\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\244\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\5\21\1\344\3\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\1\212\22\21\1\0\1\21"+
+    "\2\0\1\21\5\0\6\220\3\0\11\220\3\0\7\220"+
+    "\23\0\23\220\1\0\1\220\2\0\1\220\43\0\1\52"+
+    "\114\0\1\223\3\0\1\224\1\0\1\225\1\0\1\226"+
+    "\37\0\1\227\1\230\53\0\1\52\66\0\1\345\7\0"+
+    "\1\346\50\0\1\347\1\350\3\0\1\351\1\0\1\20"+
+    "\6\233\1\0\2\20\11\233\3\0\7\233\20\0\2\20"+
+    "\1\0\23\233\1\0\1\233\2\0\1\233\7\0\1\235"+
+    "\14\0\2\235\6\0\1\235\1\0\1\235\30\0\2\235"+
+    "\6\0\1\235\4\0\1\235\1\0\1\235\11\0\1\20"+
+    "\1\233\3\20\1\233\1\20\1\0\2\20\11\233\3\0"+
+    "\7\233\20\0\2\20\1\0\23\233\1\0\1\233\2\0"+
+    "\1\233\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\2\21\1\352\20\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\353"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\354\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\2\21\1\355\6\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\356"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\2\21\1\357\6\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\360\5\21\1\361\1\362\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\6\21\1\363"+
+    "\2\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\364"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\4\21\1\365\2\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\366\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\2\21\1\367\4\21\20\0\2\20\1\0\11\21\1\310"+
+    "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\370\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\273\4\21\3\0"+
+    "\2\21\1\371\4\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\11\131\1\0\11\131\1\0"+
+    "\37\131\1\372\41\131\1\0\11\131\1\0\44\131\1\372"+
+    "\23\131\31\0\1\373\62\0\2\20\3\264\1\20\1\264"+
+    "\1\0\2\20\1\374\10\20\3\0\7\20\20\0\2\20"+
+    "\1\0\23\20\1\0\1\20\2\0\1\20\4\0\3\20"+
+    "\2\265\2\20\1\0\2\20\1\375\10\20\3\0\7\20"+
+    "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+    "\4\0\2\20\3\266\1\20\1\266\1\0\2\20\1\376"+
+    "\10\20\3\0\7\20\20\0\2\20\1\0\23\20\1\0"+
+    "\1\20\2\0\1\20\4\0\1\20\1\377\5\267\1\0"+
+    "\2\20\4\377\3\267\2\377\3\0\1\267\3\377\1\267"+
+    "\1\377\1\267\20\0\2\20\1\0\2\267\1\377\1\267"+
+    "\2\377\1\267\6\377\1\267\5\377\1\0\1\377\2\0"+
+    "\1\377\4\0\1\20\6\21\1\0\2\20\4\21\1\u0100"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\15\21\1\u0101"+
+    "\2\21\1\u0102\2\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\1\21\1\u0102\7\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\3\21\1\212\3\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\2\21\1\u0103\1\u0104\5\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\4\21\1\u0105\2\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+    "\20\0\2\20\1\0\15\21\1\u0106\5\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\7\21\20\0\2\20\1\0\11\21\1\212\11\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\3\21\1\u0107\5\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\10\21\1\u0108\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\4\21\1\u0102"+
+    "\2\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\2\21\1\u0109"+
+    "\6\21\3\0\2\21\1\214\4\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\4\21\1\363\4\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\u010a\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\212"+
+    "\4\21\3\0\2\21\1\u010a\4\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\3\21\1\u010b\5\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\20\0"+
+    "\2\20\1\0\15\21\1\u0102\5\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\1\21\1\324"+
+    "\7\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\7\21\1\u0102\1\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\10\21\1\270\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\14\21\1\u0102\1\21\1\353\4\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+    "\1\u010c\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\11\21"+
+    "\1\u010d\11\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\6\21\1\u010e\2\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\1\u010f"+
+    "\6\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\20\21\1\u0102\2\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\u0110\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\3\21\1\302\3\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\7\0"+
+    "\1\u0111\10\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\u0112"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\4\21\1\u0113\1\212\3\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\4\21\1\321\4\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\1\21\1\u0114\7\21"+
+    "\3\0\7\21\20\0\2\20\1\0\15\21\1\u0115\5\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\2\21\1\u0116\4\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\2\21\1\272\4\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\33\0\1\u0117\64\0\1\20\6\21\1\0\2\20\6\21"+
+    "\1\u0118\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\2\21\1\273\4\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\4\21\1\357\2\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\10\21\1\u0102\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\1\322\6\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\1\324\6\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\2\21\1\u0119\6\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\212\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\2\21\1\u011a"+
+    "\4\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\30\0\1\345\60\0\1\347\1\350\3\0\1\351"+
+    "\70\0\1\u011b\60\0\1\u011c\113\0\1\u011d\113\0\1\u011e"+
+    "\57\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+    "\20\0\2\20\1\0\4\21\1\u011f\16\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\6\21"+
+    "\1\272\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\4\21\1\u0120\4\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\6\21\1\u0121\2\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\3\21"+
+    "\1\u0102\3\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+    "\3\0\2\21\1\u0122\4\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\15\21"+
+    "\1\u0123\5\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\7\21\1\u0124\1\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\212\4\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\10\21"+
+    "\1\u010e\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\u0125"+
+    "\1\21\1\324\2\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\3\21\1\371\5\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\7\21\1\u0126"+
+    "\1\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\3\21\1\u0127\3\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\10\21\1\u0102\3\0\7\21\20\0\2\20"+
+    "\1\0\15\21\1\u0102\5\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\7\21\1\362\1\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\36\0\1\u0128\61\0\1\20\6\21\1\0"+
+    "\2\20\4\21\1\u0129\4\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\17\21\1\212\3\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\2\21\1\273\6\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+    "\1\u012a\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\3\21\1\362\5\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\2\21\1\u012b\4\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\u0102\4\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\6\21"+
+    "\1\u012c\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\5\21\1\212\3\21\3\0\7\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\2\21\1\362\6\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\5\21"+
+    "\1\332\1\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+    "\1\u012d\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\10\21\1\212\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\4\21\1\u012e\2\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\7\21\1\u012f\1\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\2\21\1\212"+
+    "\6\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\15\21\1\272"+
+    "\5\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\4\21\1\u0130\4\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\6\21\1\u0131\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\3\21\1\u0132\3\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\34\0\1\u0133\63\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+    "\14\21\1\212\6\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\6\21\1\u0134\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\3\21\1\u0135\3\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\67\0\1\u0136\4\0\1\u0137\112\0"+
+    "\1\u0138\113\0\1\u0139\113\0\1\u013a\24\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+    "\5\21\1\212\15\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\1\21\1\u0124"+
+    "\5\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\17\21\1\u0102\3\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\3\21\1\u013b\3\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+    "\21\21\1\u0102\1\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\4\21\1\u013c\4\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\20\21\1\324\2\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\4\21\1\212\2\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\1\21\1\u013d\7\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\1\u013e\10\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\2\21"+
+    "\1\u013f\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\2\21"+
+    "\1\u0108\6\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+    "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+    "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\15\21"+
+    "\1\u0101\5\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+    "\1\0\11\21\1\u0140\11\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\6\21\1\u0102\2\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\1\u0141"+
+    "\10\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\u0102"+
+    "\4\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\7\21\1\312\1\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\1\21\1\u0142\7\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\35\0\1\u0143\62\0\1\20\6\21\1\0\2\20"+
+    "\1\21\1\u0144\7\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\4\21\1\u0126\4\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\67\0"+
+    "\1\u0145\4\0\1\u0146\106\0\1\u0147\4\0\1\u0148\106\0"+
+    "\1\u0149\4\0\1\u014a\23\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\1\21\1\u0102\5\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\2\21\1\u0102\6\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\5\21\1\u0102\3\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\13\21\1\u014b\7\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\11\21\3\0\3\21\1\u014c\3\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\6\21\1\302\2\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\20\0"+
+    "\2\20\1\0\13\21\1\u014d\7\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\11\21\1\u014e\11\21\1\0"+
+    "\1\21\2\0\1\21\111\0\1\u0136\113\0\1\u0137\114\0"+
+    "\1\u014f\113\0\1\u0150\117\0\1\u0136\113\0\1\u0137\1\0"+
+    "\1\20\6\21\1\0\2\20\6\21\1\u013c\2\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\u0151"+
+    "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\u0152\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\2\21\1\u0153\6\21\3\0\7\21\20\0"+
+    "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+    "\1\20\6\21\1\0\2\20\2\21\1\u0154\6\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\7\21\20\0\2\20\1\0\23\21\1\u0111\1\21\2\0"+
+    "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+    "\2\21\1\u0155\4\21\20\0\2\20\1\0\23\21\1\0"+
+    "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+    "\6\21\1\u0156\2\21\3\0\7\21\20\0\2\20\1\0"+
+    "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+    "\1\0\2\20\11\21\3\0\1\u0157\6\21\20\0\2\20"+
+    "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+    "\6\21\1\0\2\20\7\21\1\u0158\1\21\3\0\7\21"+
+    "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+    "\4\0\1\20\6\21\1\0\2\20\4\21\1\337\4\21"+
+    "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+    "\2\0\1\21\4\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[22192];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\17\0\4\1\1\11\11\1\1\11\10\1\1\11\2\1"+
+    "\1\11\24\1\3\11\2\1\2\11\1\1\1\11\1\1"+
+    "\1\11\1\1\1\11\1\1\1\11\1\1\1\11\1\1"+
+    "\1\11\2\1\2\11\1\1\2\11\1\1\1\11\1\1"+
+    "\2\11\1\1\1\11\1\1\1\11\40\1\1\0\17\1"+
+    "\1\0\6\11\4\1\1\11\1\0\20\1\2\11\2\1"+
+    "\1\0\47\1\1\0\11\1\5\0\21\1\1\0\25\1"+
+    "\1\11\5\1\1\0\3\1\4\0\11\1\1\11\12\1"+
+    "\1\0\2\1\2\11\3\0\10\1\1\11\1\1\6\0"+
+    "\4\1\2\11\10\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[344];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_UNQUOTED			= -1;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED		= -2;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOF heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED		= -3;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an unquoted/double quoted/backtick EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_UNQUOTED			= -4;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an single quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED		= -5;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * an double quoted EOT heredoc.
+	 */
+	public static final int INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED		= -6;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q!...! style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_BANG				= -7;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q{...} style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_CURLY_BRACE		= -8;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q&lt;...&gt; style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_LT					= -9;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q(...) style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_PAREN					= -10;
+
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q/.../ style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SLASH				= -11;
+
+	/**
+	 * Token type specific to RubyTokenMaker; this signals that we are inside
+	 * a %Q[...] style double quoted string.
+	 */
+	public static final int INTERNAL_STRING_Q_SQUARE_BRACKET		= -12;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public RubyTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_DOCUMENTATION:
+				state = DOCCOMMENT;
+				start = text.offset;
+				break;
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR_LITERAL;
+				start = text.offset;
+				break;
+			case Token.LITERAL_BACKQUOTE:
+				state = BACKTICKS;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_UNQUOTED:
+				state = HEREDOC_EOF_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+				state = HEREDOC_EOF_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED:
+				state = HEREDOC_EOF_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_UNQUOTED:
+				state = HEREDOC_EOT_UNQUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+				state = HEREDOC_EOT_SINGLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED:
+				state = HEREDOC_EOT_DOUBLE_QUOTED;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_BANG:
+				state = STRING_Q_BANG;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_CURLY_BRACE:
+				state = STRING_Q_CURLY_BRACE;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_LT:
+				state = STRING_Q_LT;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_PAREN:
+				state = STRING_Q_PAREN;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SLASH:
+				state = STRING_Q_SLASH;
+				start = text.offset;
+				break;
+			case INTERNAL_STRING_Q_SQUARE_BRACKET:
+				state = STRING_Q_SQUARE_BRACKET;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public RubyTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public RubyTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 188) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 39: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_LT);
+          }
+        case 52: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 53: break;
+        case 45: 
+          { addToken(Token.LITERAL_BOOLEAN);
+          }
+        case 54: break;
+        case 32: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+          }
+        case 55: break;
+        case 19: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken;
+          }
+        case 56: break;
+        case 18: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken;
+          }
+        case 57: break;
+        case 20: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken;
+          }
+        case 58: break;
+        case 46: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_DOCUMENTATION);
+          }
+        case 59: break;
+        case 10: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 60: break;
+        case 44: 
+          { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+          }
+        case 61: break;
+        case 9: 
+          { addToken(Token.FUNCTION);
+          }
+        case 62: break;
+        case 22: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken;
+          }
+        case 63: break;
+        case 42: 
+          { addToken(Token.VARIABLE);
+          }
+        case 64: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 65: break;
+        case 31: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+          }
+        case 66: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 67: break;
+        case 41: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_CURLY_BRACE);
+          }
+        case 68: break;
+        case 50: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED);
+          }
+        case 69: break;
+        case 51: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED);
+          }
+        case 70: break;
+        case 47: 
+          { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED);
+          }
+        case 71: break;
+        case 14: 
+          { /* Skip escaped chars. */
+          }
+        case 72: break;
+        case 25: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 73: break;
+        case 43: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 74: break;
+        case 28: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+          }
+        case 75: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 76: break;
+        case 17: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken;
+          }
+        case 77: break;
+        case 35: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 78: break;
+        case 11: 
+          { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+          }
+        case 79: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 80: break;
+        case 38: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SLASH);
+          }
+        case 81: break;
+        case 27: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+          }
+        case 82: break;
+        case 16: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 83: break;
+        case 37: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_BANG);
+          }
+        case 84: break;
+        case 23: 
+          { /* Skip escaped single quotes only, but this should still work. */
+          }
+        case 85: break;
+        case 30: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+          }
+        case 86: break;
+        case 49: 
+          { start = zzMarkedPos-6; yybegin(DOCCOMMENT);
+          }
+        case 87: break;
+        case 34: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 88: break;
+        case 26: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+          }
+        case 89: break;
+        case 36: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SQUARE_BRACKET);
+          }
+        case 90: break;
+        case 8: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 91: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 92: break;
+        case 21: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken;
+          }
+        case 93: break;
+        case 40: 
+          { start = zzMarkedPos-yylength(); yybegin(STRING_Q_PAREN);
+          }
+        case 94: break;
+        case 7: 
+          { addToken(Token.OPERATOR);
+          }
+        case 95: break;
+        case 24: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 96: break;
+        case 33: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 97: break;
+        case 48: 
+          { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED);
+          }
+        case 98: break;
+        case 12: 
+          { start = zzMarkedPos-1; yybegin(BACKTICKS);
+          }
+        case 99: break;
+        case 13: 
+          { 
+          }
+        case 100: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 101: break;
+        case 29: 
+          { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+          }
+        case 102: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case HEREDOC_EOF_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+            }
+            case 345: break;
+            case DOCCOMMENT: {
+              yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+            }
+            case 346: break;
+            case HEREDOC_EOT_SINGLE_QUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+            }
+            case 347: break;
+            case HEREDOC_EOT_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+            }
+            case 348: break;
+            case STRING_Q_SLASH: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken;
+            }
+            case 349: break;
+            case STRING_Q_BANG: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken;
+            }
+            case 350: break;
+            case STRING_Q_LT: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken;
+            }
+            case 351: break;
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 352: break;
+            case BACKTICKS: {
+              addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+            }
+            case 353: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 354: break;
+            case HEREDOC_EOF_UNQUOTED: {
+              addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+            }
+            case 355: break;
+            case STRING_Q_CURLY_BRACE: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken;
+            }
+            case 356: break;
+            case STRING_Q_PAREN: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken;
+            }
+            case 357: break;
+            case CHAR_LITERAL: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 358: break;
+            case STRING_Q_SQUARE_BRACKET: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken;
+            }
+            case 359: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex	(revision 25584)
@@ -0,0 +1,675 @@
+/*
+ * 02/25/2005
+ *
+ * SASTokenMaker.java - Scanner for SAS files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SAS.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SASTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class SASTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public SASTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "*", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+LineTerminator		= ([\n])
+Letter			= ([A-Za-z_])
+Digit			= ([0-9])
+Whitespace		= ([ \t]+)
+Semicolon			= ([;])
+
+Identifier		= (({Letter}|{Digit})+)
+MacroVariable		= (&{Identifier})
+
+Operators1		= ("+"|"-"|"*"|"/"|"^"|"|")
+Operators2		= (([\^\~]?=)|(">"[=]?)|("<"[=]?))
+Operators3		= ("eq"|"ne"|"gt"|"lt"|"ge"|"le"|"in")
+Operator			= ({Operators1}|{Operators2}|{Operators3})
+Separator			= ([\(\)])
+
+StringBoundary		= (\")
+CharBoundary		= (\')
+
+LineCommentBegin	= ("*")
+MLCBegin			= ("/*")
+MLCEnd			= ("*/")
+
+%state STRING
+%state CHAR
+%state MLC
+
+%%
+
+<YYINITIAL>  {
+
+	/* Keywords */
+	"_all_" |
+	"_character_" |
+	"_data_" |
+	"_infile_" |
+	"_last_" |
+	"_null_" |
+	"_numeric_" |
+	"_page_" |
+	"_temporary_" |
+	"abend" |
+	"abort" |
+	"all" |
+	"alter" |
+	"and" |
+	"array" |
+	"as" |
+	"ascending" |
+	"attrib" |
+	"axis" |
+	"bell" |
+	"blank" |
+	"border" |
+	"bounds" |
+	"by" |
+	"call" |
+	"cancel" |
+	"cards" |
+	"cards4" |
+	"choro" |
+	"class" |
+	"classes" |
+	"clear" |
+	"close" |
+	"compute" |
+	"contrast" |
+	"coord" |
+	"coordinates" |
+	"cov" |
+	"create" |
+	"data" |
+	"datalines" |
+	"datalines4" |
+	"delete" |
+	"descending" |
+	"describe" |
+	"discrete" |
+	"disk" |
+	"display" |
+	"dm" |
+	"do" |
+	"drop" |
+	"dummy" |
+	"else" |
+	"end" |
+	"endrsubmit" |
+	"endsas" |
+	"error" |
+	"except" |
+	"expandtabs" |
+	"factors" |
+	"file" |
+	"filename" |
+	"flowover" |
+	"footnote" |
+	"frame" |
+	"freq" |
+	"from" |
+	"go" |
+	"goption" |
+	"goptions" |
+	"goto" |
+	"grid" |
+	"group" |
+	"groupby" |
+	"groupformat" |
+	"having" |
+	"haxis" |
+	"hbar" |
+	"heading" |
+	"high" |
+	"html" |
+	"id" |
+	"if" |
+	"infile" |
+	"informat" |
+	"inner" |
+	"input" |
+	"insert" |
+	"intersect" |
+	"keep" |
+	"keylabel" |
+	"label" |
+	"lable" |
+	"legend" |
+	"length" |
+	"libname" |
+	"lineqs" |
+	"link" |
+	"list" |
+	"listing" |
+	"log" |
+	"lostcard" |
+	"low" |
+	"mark" |
+	"matings" |
+	"mean" |
+	"merge" |
+	"missing" |
+	"missover" |
+	"mod" |
+	"model" |
+	"modify" |
+	"n" |
+	"nocell" |
+	"nocharacters" |
+	"nodupkey" |
+	"noexpandtabs" |
+	"noframe" |
+	"noheading" |
+	"noinput" |
+	"nolegend" |
+	"nopad" |
+	"noprint" |
+	"nosharebuffers" |
+	"not" |
+	"note" |
+	"notitle" |
+	"notitles" |
+	"notsorted" |
+	"ods" |
+	"old" |
+	"option" |
+	"or" |
+	"order" |
+	"orderby" |
+	"other" |
+	"otherwise" |
+	"outer" |
+	"output" |
+	"over" |
+	"overlay" |
+	"overprint" |
+	"pad" |
+	"pageby" |
+	"pagesize" |
+	"parmcards" |
+	"parmcards4" |
+	"parms" |
+	"pattern" |
+	"pct" |
+	"pctn" |
+	"pctsum" |
+	"picture" |
+	"pie" |
+	"pie3d" |
+	"plotter" |
+	"predict" |
+	"prefix" |
+	"printer" |
+	"proc" |
+	"ps" |
+	"put" |
+	"quit" |
+	"random" |
+	"range" |
+	"remove" |
+	"rename" |
+	"response" |
+	"replace" |
+	"reset" |
+	"retain" |
+	"return" |
+	"rsubmit" |
+	"run" |
+	"s2" |
+	"select" |
+	"set" |
+	"sharebuffers" |
+	"signoff" |
+	"signon" |
+	"sim" |
+	"skip" |
+	"source2" |
+	"startsas" |
+	"std" |
+	"stop" |
+	"stopover" |
+	"strata" |
+	"sum" |
+	"sumby" |
+	"supvar" |
+	"symbol" |
+	"table" |
+	"tables" |
+	"tape" |
+	"terminal" |
+	"test" |
+	"then" |
+	"time" |
+	"title" |
+	"to" |
+	"transform" |
+	"treatments" |
+	"truncover" |
+	"unbuf" |
+	"unbuffered" |
+	"union" |
+	"until" |
+	"update" |
+	"validate" |
+	"value" |
+	"var" |
+	"variables" |
+	"vaxis" |
+	"vbar" |
+	"weight" |
+	"when" |
+	"where" |
+	"while" |
+	"with" |
+	"window" |
+	"x"				{ addToken(Token.RESERVED_WORD); }
+
+	/* Base SAS procs. */
+	"append" |
+	"calendar" |
+	"catalog" |
+	"chart" |
+	"cimport" |
+	"compare" |
+	"contents" |
+	"copy" |
+	"cpm" |
+	"cport" |
+	"datasets" |
+	"display" |
+	"explode" |
+	"export" |
+	"fontreg" |
+	"format" |
+	"forms" |
+	"fslist" |
+	"import" |
+	"means" |
+	"migrate" |
+	"options" |
+	"optload" |
+	"optsave" |
+	"plot" |
+	"pmenu" |
+	"print" |
+	"printto" |
+	"proto" |
+	"prtdef" |
+	"prtexp" |
+	"pwencode" |
+	"rank" |
+	"registry" |
+	"report" |
+	"sort" |
+	"sql" |
+	"standard" |
+	"summary" |
+	"tabulate" |
+	"template" |
+	"timeplot" |
+	"transpose"			{ addToken(Token.DATA_TYPE); }
+
+	/* SAS/STAT procs. */
+	"corr" |
+	"freq" |
+	"univariate"			{ addToken(Token.DATA_TYPE); }
+
+	/* Macros. */
+	"%abort" |
+	"%bquote" |
+	"%by" |
+	"%cms" |
+	"%copy" |
+	"%display" |
+	"%do" |
+	"%else" |
+	"%end" |
+	"%eval" |
+	"%global" |
+	"%go" |
+	"%goto" |
+	"%if" |
+	"%inc" |
+	"%include" |
+	"%index" |
+	"%input" |
+	"%keydef" |
+	"%length" |
+	"%let" |
+	"%local" |
+	"%macro" |
+	"%mend" |
+	"%nrbquote" |
+	"%nrquote" |
+	"%nrstr" |
+	"%put" |
+	"%qscan" |
+	"%qsubstr" |
+	"%qsysfunc" |
+	"%quote" |
+	"%qupcase" |
+	"%scan" |
+	"%str" |
+	"%substr" |
+	"%superq" |
+	"%syscall" |
+	"%sysevalf" |
+	"%sysexec" |
+	"%sysfunc" |
+	"%sysget" |
+	"%sysprod" |
+	"%sysrput" |
+	"%then" |
+	"%to" |
+	"%tso" |
+	"%unquote" |
+	"%until" |
+	"%upcase" |
+	"%while" |
+	"%window"				{ addToken(Token.FUNCTION); }
+
+}
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	/* Comments. */
+	/* Do comments before operators as "*" can signify a line comment as */
+	/* well as an operator. */
+	^[ \t]*{LineCommentBegin}		{
+									// We must do this because of how we
+									// abuse JFlex; since we return an entire
+									// list of tokens at once instead of a
+									// single token at a time, the "^" regex
+									// character doesn't really work, so we must
+									// check that we're at the beginning of a
+									// line ourselves.
+									start = zzStartRead;
+									// Might not be any whitespace.
+									if (yylength()>1) {
+										addToken(zzStartRead,zzMarkedPos-2, Token.WHITESPACE);
+										zzStartRead = zzMarkedPos-1;
+									}
+									// Remember:  zzStartRead may now be updated,
+									// so we must check against 'start'.
+									if (start==s.offset) {
+										addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+										addNullToken();
+										return firstToken;
+									}
+									else {
+										addToken(zzStartRead,zzStartRead, Token.OPERATOR);
+									}
+								}
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+
+	/* Do operators before identifiers since some of them are words. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+	{Separator}					{ addToken(Token.SEPARATOR); }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{MacroVariable}				{ addToken(Token.VARIABLE); }
+	{Semicolon}					{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	{StringBoundary}				{ start = zzMarkedPos-1; yybegin(STRING); }
+	{CharBoundary}					{ start = zzMarkedPos-1; yybegin(CHAR); }
+
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as OK;    */
+	/* This will include "." from statements like "from lib.dataset". */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<STRING> {
+
+	[^\n\"]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+/*	{StringBoundary}{StringBoundary}	{} */
+	{StringBoundary}				{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<CHAR> {
+
+	[^\n\']+						{}
+	{LineTerminator}				{ yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+/*	{CharBoundary}{CharBoundary}		{} */
+	{CharBoundary}					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+
+}
+
+<MLC> {
+
+	[^\n\*]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}						{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java	(revision 25584)
@@ -0,0 +1,1488 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 02/25/2005
+ *
+ * SASTokenMaker.java - Scanner for SAS files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SAS.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SASTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class SASTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int STRING = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 6;
+  public static final int CHAR = 4;
+
+  /**
+   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
+   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
+   *                  at the beginning of a line
+   * l is of the form l = 2*k, k a non negative integer
+   */
+  private static final int ZZ_LEXSTATE[] = { 
+     0,  1,  2,  2,  3,  3,  4, 4
+  };
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\3\1\1\25\0\1\3\1\0\1\23\2\0\1\53\1\4"+
+    "\1\24\2\22\1\6\1\5\1\0\1\5\1\0\1\7\2\2\1\52"+
+    "\1\51\1\45\5\2\1\0\1\0\1\10\1\12\1\10\2\0\1\26"+
+    "\1\42\1\27\1\32\1\13\1\33\1\16\1\30\1\21\1\2\1\44"+
+    "\1\20\1\36\1\15\1\40\1\37\1\14\1\31\1\34\1\17\1\35"+
+    "\1\46\1\47\1\43\1\41\1\50\3\0\1\10\1\25\1\0\1\26"+
+    "\1\42\1\27\1\32\1\13\1\33\1\16\1\30\1\21\1\2\1\44"+
+    "\1\20\1\36\1\15\1\40\1\37\1\14\1\31\1\34\1\17\1\35"+
+    "\1\46\1\47\1\43\1\41\1\50\1\0\1\5\1\0\1\11\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\5\0\1\1\1\2\1\1\1\3\1\1\3\4\3\1"+
+    "\1\5\4\1\1\6\1\7\1\10\15\1\1\5\4\1"+
+    "\1\3\1\11\1\12\1\13\1\14\1\12\1\15\1\16"+
+    "\1\12\1\17\1\12\1\20\1\21\1\4\7\1\1\5"+
+    "\5\1\1\4\3\1\1\4\15\1\1\5\66\1\1\5"+
+    "\14\1\21\0\1\22\1\5\5\1\1\5\66\1\1\23"+
+    "\50\1\1\5\15\1\1\5\1\1\1\5\4\1\1\5"+
+    "\20\1\1\5\3\1\7\0\1\24\2\0\1\24\24\0"+
+    "\21\1\1\5\6\1\1\5\44\1\1\5\1\1\1\5"+
+    "\11\1\1\5\7\1\1\5\4\1\1\23\22\1\1\5"+
+    "\5\1\12\0\1\24\16\0\10\1\1\5\3\1\1\5"+
+    "\13\1\1\5\2\1\1\5\3\1\1\5\23\1\1\5"+
+    "\10\1\1\23\2\5\6\1\16\0\42\1\13\0\17\1"+
+    "\2\0\12\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[639];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\54\0\130\0\204\0\260\0\334\0\334\0\u0108"+
+    "\0\u0134\0\u0160\0\334\0\u018c\0\u01b8\0\u01b8\0\u01e4\0\u0210"+
+    "\0\u023c\0\u0268\0\u0294\0\u02c0\0\u02ec\0\334\0\334\0\334"+
+    "\0\u0318\0\u0344\0\u0370\0\u039c\0\u03c8\0\u03f4\0\u0420\0\u044c"+
+    "\0\u0478\0\u04a4\0\u04d0\0\u04fc\0\u0528\0\u0108\0\u0554\0\u0580"+
+    "\0\u05ac\0\u05d8\0\u0604\0\334\0\u0630\0\334\0\334\0\u065c"+
+    "\0\334\0\334\0\u0688\0\334\0\u06b4\0\u0160\0\334\0\u0108"+
+    "\0\u06e0\0\u070c\0\u0738\0\u0764\0\u0790\0\u07bc\0\u07e8\0\u0814"+
+    "\0\u0840\0\u086c\0\u0898\0\u08c4\0\u08f0\0\u091c\0\u0948\0\u0974"+
+    "\0\u09a0\0\u09cc\0\u09f8\0\u0a24\0\u0a50\0\u0a7c\0\u0aa8\0\u0ad4"+
+    "\0\u0b00\0\u0b2c\0\u0b58\0\u0b84\0\u0bb0\0\u0bdc\0\u0c08\0\u0c34"+
+    "\0\u0c60\0\u0c8c\0\u0cb8\0\u0ce4\0\u0d10\0\u0d3c\0\u0d68\0\u0d94"+
+    "\0\u0dc0\0\u0dec\0\u0e18\0\u0e44\0\u0e70\0\u0e9c\0\u0ec8\0\u0ef4"+
+    "\0\u0f20\0\u0f4c\0\u0f78\0\u0fa4\0\u0fd0\0\u0ffc\0\u1028\0\u1054"+
+    "\0\u1080\0\u10ac\0\u10d8\0\u1104\0\u1130\0\u115c\0\u1188\0\u11b4"+
+    "\0\u11e0\0\u120c\0\u1238\0\u1264\0\u1290\0\u12bc\0\u12e8\0\u1314"+
+    "\0\u1340\0\u136c\0\u1398\0\u13c4\0\u13f0\0\u141c\0\u1448\0\u1474"+
+    "\0\u14a0\0\u14cc\0\u14f8\0\u1524\0\u1550\0\u157c\0\u15a8\0\u15d4"+
+    "\0\u1600\0\u162c\0\u1658\0\u1684\0\u16b0\0\u16dc\0\u1708\0\u1734"+
+    "\0\u1760\0\u178c\0\u17b8\0\u17e4\0\u1810\0\u183c\0\u1868\0\u1894"+
+    "\0\u18c0\0\u18ec\0\u1918\0\u1944\0\u1970\0\u199c\0\u19c8\0\u19f4"+
+    "\0\u1a20\0\u1a4c\0\u1a78\0\u1aa4\0\334\0\u1ad0\0\u1afc\0\u1b28"+
+    "\0\u1b54\0\u1b80\0\u1bac\0\u1bd8\0\u1c04\0\u1c30\0\u1c5c\0\u1c88"+
+    "\0\u1cb4\0\u1ce0\0\u1d0c\0\u1d38\0\u1d64\0\u1d90\0\u1dbc\0\u1de8"+
+    "\0\u1e14\0\u1e40\0\u1e6c\0\u1e98\0\u1ec4\0\u1ef0\0\u1f1c\0\u1f48"+
+    "\0\u1f74\0\u1fa0\0\u1fcc\0\u1ff8\0\u2024\0\u2050\0\u207c\0\u20a8"+
+    "\0\u20d4\0\u2100\0\u212c\0\u2158\0\u2184\0\u21b0\0\u21dc\0\u2208"+
+    "\0\u2234\0\u2260\0\u228c\0\u22b8\0\u22e4\0\u2310\0\u233c\0\u2368"+
+    "\0\u2394\0\u23c0\0\u23ec\0\u2418\0\u2444\0\u2470\0\u249c\0\u24c8"+
+    "\0\u24f4\0\u2520\0\u0108\0\u254c\0\u2578\0\u25a4\0\u25d0\0\u25fc"+
+    "\0\u2628\0\u2654\0\u2680\0\u26ac\0\u26d8\0\u2704\0\u2730\0\u275c"+
+    "\0\u2788\0\u27b4\0\u27e0\0\u280c\0\u2838\0\u2864\0\u2890\0\u28bc"+
+    "\0\u28e8\0\u2914\0\u2940\0\u296c\0\u2998\0\u29c4\0\u29f0\0\u2a1c"+
+    "\0\u2a48\0\u2a74\0\u2aa0\0\u2acc\0\u2af8\0\u2b24\0\u2b50\0\u2b7c"+
+    "\0\u2ba8\0\u2bd4\0\u2c00\0\u2c2c\0\u2c58\0\u2c84\0\u2cb0\0\u2cdc"+
+    "\0\u2d08\0\u2d34\0\u2d60\0\u2d8c\0\u2db8\0\u2de4\0\u2e10\0\u2e3c"+
+    "\0\u2e68\0\u2e94\0\u2ec0\0\u2eec\0\u2f18\0\u2f44\0\u2f70\0\u2f9c"+
+    "\0\u2fc8\0\u2ff4\0\u3020\0\u304c\0\u3078\0\u30a4\0\u30d0\0\u30fc"+
+    "\0\u3128\0\u3154\0\u3180\0\u31ac\0\u31d8\0\u3204\0\u3230\0\u325c"+
+    "\0\u3288\0\u32b4\0\u32e0\0\u330c\0\u3338\0\u3364\0\u3390\0\u33bc"+
+    "\0\u33e8\0\u3414\0\u3440\0\u346c\0\u3498\0\u34c4\0\u34f0\0\334"+
+    "\0\u351c\0\u3548\0\u3574\0\u35a0\0\u35cc\0\u35f8\0\u3624\0\u3650"+
+    "\0\u367c\0\u36a8\0\u36d4\0\u3700\0\u372c\0\u3758\0\u3784\0\u37b0"+
+    "\0\u37dc\0\u3808\0\u3834\0\u3860\0\u388c\0\u38b8\0\u38e4\0\u3910"+
+    "\0\u393c\0\u3968\0\u3994\0\u39c0\0\u39ec\0\u3a18\0\u3a44\0\u3a70"+
+    "\0\u3a9c\0\u3ac8\0\u3af4\0\u3b20\0\u3b4c\0\u3b78\0\u3ba4\0\u3bd0"+
+    "\0\u3bfc\0\u3c28\0\u3c54\0\u3c80\0\u26ac\0\u3cac\0\u3cd8\0\u3d04"+
+    "\0\u3d30\0\u3d5c\0\u3d88\0\u3db4\0\u3de0\0\u3e0c\0\u3e38\0\u3e64"+
+    "\0\u3e90\0\u3ebc\0\u3ee8\0\u3f14\0\u3f40\0\u3f6c\0\u3f98\0\u3fc4"+
+    "\0\u3ff0\0\u401c\0\u4048\0\u4074\0\u40a0\0\u40cc\0\u40f8\0\u4124"+
+    "\0\u4150\0\u417c\0\u41a8\0\u41d4\0\u4200\0\u422c\0\u4258\0\u4284"+
+    "\0\u42b0\0\u42dc\0\u4308\0\u1ff8\0\u4334\0\u4360\0\u438c\0\u43b8"+
+    "\0\u43e4\0\u4410\0\u443c\0\u4468\0\u4494\0\u4308\0\u44c0\0\u44ec"+
+    "\0\u4518\0\u4544\0\u4570\0\u459c\0\u45c8\0\u45f4\0\u4620\0\u464c"+
+    "\0\u4678\0\u46a4\0\u46d0\0\u46fc\0\u4728\0\u4754\0\u4780\0\u47ac"+
+    "\0\u47d8\0\u4804\0\u4830\0\u485c\0\u4888\0\u48b4\0\u48e0\0\u490c"+
+    "\0\u4938\0\u4964\0\u4990\0\u49bc\0\u49e8\0\u4a14\0\u4a40\0\u4a6c"+
+    "\0\u4a98\0\u4ac4\0\u4af0\0\u4b1c\0\u4b48\0\u4b74\0\u4ba0\0\u4bcc"+
+    "\0\u4bf8\0\u4c24\0\u4c50\0\u4c7c\0\u4ca8\0\u4cd4\0\u4d00\0\u4d2c"+
+    "\0\u4d58\0\u4d84\0\u4db0\0\u4ddc\0\u4e08\0\u4e34\0\u4e60\0\u4e8c"+
+    "\0\u4eb8\0\u4ee4\0\u4f10\0\u4f3c\0\u4f68\0\u4f94\0\u4fc0\0\u4fec"+
+    "\0\u5018\0\u5044\0\u5070\0\u509c\0\u50c8\0\u50f4\0\u5120\0\u514c"+
+    "\0\u15d4\0\u5178\0\u51a4\0\u51d0\0\u51fc\0\u5228\0\u5254\0\u5280"+
+    "\0\u52ac\0\u52d8\0\u5304\0\u5330\0\u535c\0\u5388\0\u53b4\0\u53e0"+
+    "\0\u540c\0\u5438\0\u5464\0\u5490\0\u54bc\0\u54e8\0\u5514\0\u5540"+
+    "\0\u556c\0\u5598\0\u55c4\0\u55f0\0\u561c\0\u5648\0\u5674\0\u56a0"+
+    "\0\u56cc\0\u56f8\0\u5724\0\u5750\0\u577c\0\u57a8\0\u57d4\0\u5800"+
+    "\0\u582c\0\u5858\0\u5884\0\u58b0\0\u58dc\0\u5908\0\u5934\0\u5960"+
+    "\0\u598c\0\u59b8\0\u59e4\0\u5a10\0\u5a3c\0\u5a68\0\u5a94\0\u5ac0"+
+    "\0\u5aec\0\u5b18\0\u5b44\0\u5b70\0\u5b9c\0\u5bc8\0\u5bf4\0\u5c20"+
+    "\0\u5c4c\0\u5c78\0\u5ca4\0\u5cd0\0\u5cfc\0\u5d28\0\u5d54\0\u5d80"+
+    "\0\u5dac\0\u5dd8\0\u5e04\0\u5e30\0\u5e5c\0\u5e88\0\u5eb4\0\u5ee0"+
+    "\0\u5f0c\0\u5f38\0\u5f64\0\u5f90\0\u5fbc\0\u5fe8\0\u6014\0\u6040"+
+    "\0\u606c\0\u6098\0\u60c4\0\u60f0\0\u611c\0\u6148\0\u6174\0\u61a0"+
+    "\0\u61cc\0\u61f8\0\u6224\0\u6250\0\u627c\0\u62a8\0\u62d4\0\u6300"+
+    "\0\u632c\0\u6358\0\u6384\0\u63b0\0\u63dc\0\u6408\0\u6434\0\u6460"+
+    "\0\u648c\0\u64b8\0\u64e4\0\u6510\0\u653c\0\u6568\0\u6594\0\u65c0"+
+    "\0\u65ec\0\u6618\0\u6644\0\u6670\0\u669c\0\u45f4\0\u66c8\0\u66f4"+
+    "\0\u6720\0\u674c\0\u535c\0\u6778\0\u67a4\0\u67d0\0\u67fc\0\u6828"+
+    "\0\u6854\0\u6880\0\u68ac\0\u68d8\0\u6904\0\u6930\0\u695c";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[639];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\6\1\7\1\10\1\11\1\12\2\13\1\14\1\15"+
+    "\1\16\1\13\1\17\1\20\1\21\1\22\1\23\1\24"+
+    "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
+    "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+
+    "\1\10\1\45\1\46\1\47\1\10\1\50\1\51\3\10"+
+    "\1\52\1\6\1\7\1\10\1\53\1\12\1\13\1\54"+
+    "\1\14\1\15\1\16\1\13\1\17\1\20\1\21\1\22"+
+    "\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32"+
+    "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
+    "\1\43\1\44\1\10\1\45\1\46\1\47\1\10\1\50"+
+    "\1\51\3\10\1\52\1\55\1\56\21\55\1\57\30\55"+
+    "\1\60\1\61\22\60\1\62\27\60\1\63\1\64\4\63"+
+    "\1\65\45\63\56\0\1\10\10\0\7\10\3\0\26\10"+
+    "\4\0\1\11\52\0\1\66\10\0\7\66\3\0\26\66"+
+    "\7\0\1\67\57\0\1\13\43\0\1\10\10\0\1\10"+
+    "\1\70\1\71\2\10\1\72\1\10\3\0\4\10\1\73"+
+    "\11\10\1\74\7\10\3\0\1\10\10\0\7\10\3\0"+
+    "\10\10\1\75\15\10\3\0\1\10\10\0\1\70\6\10"+
+    "\3\0\13\10\1\76\12\10\3\0\1\10\10\0\1\70"+
+    "\3\10\1\70\2\10\3\0\4\10\1\77\6\10\1\100"+
+    "\12\10\3\0\1\10\10\0\1\101\5\10\1\102\3\0"+
+    "\1\10\1\103\1\10\1\104\1\105\6\10\1\46\12\10"+
+    "\3\0\1\10\10\0\1\106\3\10\1\70\1\10\1\107"+
+    "\3\0\1\10\1\110\11\10\1\111\12\10\3\0\1\10"+
+    "\10\0\2\10\1\112\4\10\3\0\5\10\2\46\2\10"+
+    "\1\113\14\10\3\0\1\10\10\0\2\10\1\114\1\10"+
+    "\1\115\1\116\1\117\3\0\1\10\1\120\1\121\2\10"+
+    "\1\122\4\10\1\123\13\10\3\0\1\10\10\0\2\10"+
+    "\1\124\1\10\1\125\1\126\1\10\3\0\4\10\1\127"+
+    "\2\10\1\130\2\10\1\131\2\10\1\132\1\133\7\10"+
+    "\3\0\1\10\10\0\5\10\1\134\1\135\3\0\1\10"+
+    "\1\136\1\10\1\137\1\140\5\10\1\141\1\142\12\10"+
+    "\3\0\1\10\10\0\1\143\3\10\1\144\1\10\1\145"+
+    "\3\0\1\10\1\146\13\10\1\147\10\10\3\0\1\10"+
+    "\10\0\1\150\6\10\3\0\1\10\1\151\5\10\1\152"+
+    "\1\153\15\10\3\0\1\10\10\0\1\154\5\10\1\155"+
+    "\3\0\1\10\1\156\2\10\1\157\3\10\1\160\1\46"+
+    "\1\10\1\46\12\10\3\0\1\10\10\0\5\10\1\161"+
+    "\1\162\3\0\1\10\1\163\2\10\1\164\2\10\1\165"+
+    "\3\10\1\166\12\10\3\0\1\10\10\0\1\167\1\170"+
+    "\2\10\1\171\1\10\1\172\3\0\3\10\1\173\4\10"+
+    "\1\174\2\10\1\175\1\176\2\10\1\177\5\10\1\46"+
+    "\3\0\1\10\10\0\2\10\1\200\4\10\3\0\12\10"+
+    "\1\201\13\10\3\0\1\10\10\0\1\202\5\10\1\203"+
+    "\3\0\1\10\1\204\11\10\1\205\12\10\3\0\1\10"+
+    "\10\0\5\10\1\206\1\207\3\0\1\10\1\210\1\211"+
+    "\1\10\1\212\2\10\1\46\1\213\1\214\10\10\1\215"+
+    "\3\10\3\0\1\10\10\0\4\10\1\216\1\124\1\10"+
+    "\3\0\4\10\1\217\1\220\2\10\1\221\1\10\1\222"+
+    "\6\10\1\223\4\10\3\0\1\10\10\0\1\224\4\10"+
+    "\1\225\1\10\3\0\13\10\1\226\1\46\11\10\3\0"+
+    "\1\10\10\0\1\227\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\230\13\10\1\147\10\10"+
+    "\3\0\1\10\10\0\1\231\5\10\1\232\3\0\3\10"+
+    "\1\233\22\10\14\0\1\234\1\235\1\236\1\237\1\240"+
+    "\1\241\1\242\4\0\1\243\1\244\2\0\1\245\1\0"+
+    "\1\246\1\247\1\250\1\251\2\0\1\252\1\0\1\253"+
+    "\2\0\1\254\7\0\1\53\2\0\1\54\45\0\1\55"+
+    "\1\0\21\55\1\0\30\55\1\60\1\0\22\60\1\0"+
+    "\27\60\1\63\1\0\4\63\1\0\45\63\7\0\1\255"+
+    "\46\0\1\10\10\0\7\10\3\0\5\10\1\256\20\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\257\16\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\260\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\261\7\10"+
+    "\1\262\13\10\3\0\1\10\10\0\6\10\1\213\3\0"+
+    "\26\10\3\0\1\10\10\0\1\263\3\10\1\264\1\265"+
+    "\1\266\3\0\2\10\1\267\1\270\1\10\1\271\1\272"+
+    "\1\273\2\10\1\274\13\10\3\0\1\10\10\0\6\10"+
+    "\1\124\3\0\13\10\1\275\12\10\3\0\1\10\10\0"+
+    "\4\10\1\276\2\10\3\0\12\10\1\277\13\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\300\2\10\1\213"+
+    "\1\10\1\301\14\10\3\0\1\10\10\0\4\10\1\302"+
+    "\2\10\3\0\11\10\1\303\14\10\3\0\1\10\10\0"+
+    "\7\10\3\0\12\10\1\257\2\10\1\304\10\10\3\0"+
+    "\1\10\10\0\1\153\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\1\305\6\10\3\0\1\10\1\306\6\10\1\307"+
+    "\15\10\3\0\1\10\10\0\2\10\1\310\1\311\3\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\312\4\10"+
+    "\3\0\7\10\1\313\5\10\1\314\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\315\10\10\3\0\1\10"+
+    "\10\0\3\10\1\46\3\10\3\0\7\10\1\316\12\10"+
+    "\1\46\3\10\3\0\1\10\10\0\2\10\1\317\1\10"+
+    "\1\320\2\10\3\0\6\10\1\321\1\322\2\10\1\323"+
+    "\13\10\3\0\1\10\10\0\7\10\3\0\12\10\1\324"+
+    "\13\10\3\0\1\10\10\0\7\10\3\0\10\10\1\325"+
+    "\15\10\3\0\1\10\10\0\1\326\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\327\24\10"+
+    "\3\0\1\10\10\0\2\10\1\330\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\5\10\1\331\1\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\3\10\1\332\22\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\333\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\334\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\5\10\1\46\20\10"+
+    "\3\0\1\10\10\0\4\10\1\335\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\317\1\46\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\336"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\2\10\1\337"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\12\10\1\340"+
+    "\13\10\3\0\1\10\10\0\1\341\6\10\3\0\13\10"+
+    "\1\342\12\10\3\0\1\10\10\0\6\10\1\220\3\0"+
+    "\26\10\3\0\1\10\10\0\1\147\6\10\3\0\1\10"+
+    "\1\343\11\10\1\72\12\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\113\14\10\3\0\1\10\10\0\2\10"+
+    "\1\344\1\10\1\345\1\346\1\10\3\0\4\10\1\347"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\350"+
+    "\11\10\1\351\12\10\3\0\1\10\10\0\1\352\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\11\10"+
+    "\1\353\1\10\1\350\12\10\3\0\1\10\10\0\2\10"+
+    "\1\354\4\10\3\0\4\10\1\355\4\10\1\356\1\357"+
+    "\1\360\5\10\1\46\4\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\361\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\362\14\10\3\0\1\10\10\0\3\10"+
+    "\1\363\3\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\16\10\1\133\2\10\1\364\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\365\24\10\3\0\1\10"+
+    "\10\0\2\10\1\366\1\367\1\370\2\10\3\0\7\10"+
+    "\1\371\1\10\1\372\1\373\13\10\3\0\1\10\10\0"+
+    "\2\10\1\374\4\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\10\10\1\375\15\10\3\0\1\10\10\0"+
+    "\2\10\1\46\4\10\3\0\26\10\3\0\1\10\10\0"+
+    "\5\10\1\376\1\10\3\0\7\10\1\377\16\10\3\0"+
+    "\1\10\10\0\7\10\3\0\7\10\1\u0100\16\10\3\0"+
+    "\1\10\10\0\4\10\1\u0101\2\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u0102\12\10\3\0"+
+    "\1\10\10\0\7\10\3\0\11\10\1\u0103\14\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u0104\12\10\3\0"+
+    "\1\10\10\0\5\10\1\u0105\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\2\10\1\u0106\23\10\3\0"+
+    "\1\10\10\0\1\u0107\6\10\3\0\1\10\1\u0108\11\10"+
+    "\1\u0109\12\10\3\0\1\10\10\0\5\10\1\u010a\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u010b\4\10"+
+    "\3\0\4\10\1\u010c\6\10\1\u010d\12\10\3\0\1\10"+
+    "\10\0\4\10\1\46\1\u010e\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\5\10\1\353\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u010f\2\10\1\u0110"+
+    "\1\46\5\10\1\u0111\12\10\3\0\1\10\10\0\3\10"+
+    "\1\u0112\3\10\3\0\11\10\1\46\14\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\u0113\24\10\3\0\1\10"+
+    "\10\0\7\10\3\0\11\10\1\u0114\1\u0115\13\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u0116\3\10\1\u0117"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u0118"+
+    "\14\10\3\0\1\10\10\0\6\10\1\u0102\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u0119\1\10\1\u011a\3\0"+
+    "\15\10\1\u011b\10\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\352\20\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u011c\2\10\1\u011d\21\10\3\0\1\10\10\0"+
+    "\3\10\1\u011e\3\10\3\0\7\10\1\u011f\16\10\3\0"+
+    "\1\10\10\0\4\10\1\u0120\2\10\3\0\4\10\1\u0121"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\5\10\1\u0122"+
+    "\20\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0123"+
+    "\12\10\3\0\1\10\10\0\1\u0124\6\10\3\0\2\10"+
+    "\1\u0125\23\10\3\0\1\10\10\0\3\10\1\u0126\1\u0127"+
+    "\2\10\3\0\4\10\1\u0128\1\46\20\10\3\0\1\10"+
+    "\10\0\4\10\1\u0129\2\10\3\0\26\10\3\0\1\10"+
+    "\10\0\1\u012a\3\10\1\u012b\1\10\1\u012c\3\0\13\10"+
+    "\1\u012d\12\10\3\0\1\10\10\0\4\10\1\46\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u012e\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u012f\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\3\10\1\u0130\22\10"+
+    "\3\0\1\10\10\0\7\10\3\0\5\10\1\u0131\20\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\46\16\10"+
+    "\3\0\1\10\10\0\4\10\1\u0132\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u0133\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\1\u0134\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\5\10\1\362\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u0135\24\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u0136\3\10\1\u0137"+
+    "\15\10\3\0\1\10\10\0\1\u0102\6\10\3\0\14\10"+
+    "\1\u0138\11\10\3\0\1\10\10\0\5\10\1\u0139\1\10"+
+    "\3\0\4\10\1\u013a\11\10\1\133\7\10\3\0\1\10"+
+    "\10\0\6\10\1\u013b\3\0\26\10\3\0\1\10\10\0"+
+    "\2\10\1\u013c\1\10\1\363\2\10\3\0\26\10\3\0"+
+    "\1\10\10\0\1\u013d\5\10\1\302\3\0\26\10\16\0"+
+    "\1\u013e\2\0\1\u013f\25\0\1\u0140\41\0\1\u0141\1\u0142"+
+    "\47\0\1\u0143\42\0\1\u0144\17\0\1\u0145\43\0\1\u0146"+
+    "\3\0\1\u0147\3\0\1\u0148\26\0\1\u0149\24\0\1\u014a"+
+    "\30\0\1\u014b\15\0\1\u0148\62\0\1\u014c\47\0\1\u014d"+
+    "\1\0\1\u014e\34\0\1\u014f\16\0\1\u0148\32\0\1\u0150"+
+    "\7\0\1\u0151\5\0\1\u0152\3\0\1\u0153\27\0\1\u0154"+
+    "\21\0\1\u0155\27\0\1\u0156\12\0\1\u0157\62\0\1\u0158"+
+    "\32\0\1\u0159\24\0\1\u0148\25\0\1\u015a\61\0\1\u015b"+
+    "\6\0\1\u015c\25\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u015d\2\10\1\u015e\16\10\3\0\1\10\10\0\1\46"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\365\12\10\3\0\1\10\10\0\1\u015f\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\5\10\1\u0160\1\10"+
+    "\3\0\1\10\1\u0161\11\10\1\350\12\10\3\0\1\10"+
+    "\10\0\7\10\3\0\16\10\1\u0162\7\10\3\0\1\10"+
+    "\10\0\1\46\5\10\1\u0163\3\0\7\10\1\u0164\16\10"+
+    "\3\0\1\10\10\0\1\u0165\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\2\10\1\u0166\4\10\3\0\26\10\3\0"+
+    "\1\10\10\0\1\224\6\10\3\0\3\10\1\u0167\22\10"+
+    "\3\0\1\10\10\0\1\143\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\10\10\1\u0168\15\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\366\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\3\10\1\173\22\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\124\2\10\1\u0169"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\10\10\1\u016a"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\13\10\1\46"+
+    "\12\10\3\0\1\10\10\0\4\10\1\u016b\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u016c"+
+    "\14\10\3\0\1\10\10\0\7\10\3\0\12\10\1\u016d"+
+    "\13\10\3\0\1\10\10\0\5\10\1\257\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u016e\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\5\10\1\u016f\1\10\3\0\10\10"+
+    "\1\u016d\15\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u0170\24\10\3\0\1\10\10\0\2\10\1\u0171\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u0172\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\3\10\1\u0173\3\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\341\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u0174\6\10\3\0\17\10"+
+    "\1\46\6\10\3\0\1\10\10\0\4\10\1\u0175\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\366\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\362\4\10\1\257"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0176"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\1\365\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u0177\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\6\10\1\302\3\0\13\10"+
+    "\1\u0178\12\10\3\0\1\10\10\0\1\342\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\10\10\1\213"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\13\10\1\350"+
+    "\12\10\3\0\1\10\10\0\5\10\1\331\1\10\3\0"+
+    "\11\10\1\u0179\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\u017a\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\7\10\1\u017b\16\10\3\0\1\10\10\0\7\10\3\0"+
+    "\6\10\1\u017c\17\10\3\0\1\10\10\0\5\10\1\u017d"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u017e\24\10\3\0\1\10\10\0\4\10\1\u017f"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\3\10\1\u0180"+
+    "\3\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u0181\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0182\24\10\3\0\1\10\10\0\1\u0183\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u0184\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\2\10\1\124\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\213"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u0185"+
+    "\16\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0186"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0187"+
+    "\24\10\3\0\1\10\10\0\1\u0188\4\10\1\46\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+    "\1\u0189\20\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u0116\21\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\276\21\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u018a\24\10\3\0\1\10\10\0\4\10\1\u018b\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\353\21\10\3\0\1\10\10\0\7\10\3\0\12\10"+
+    "\1\u018c\13\10\3\0\1\10\10\0\7\10\3\0\14\10"+
+    "\1\353\11\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u018d\21\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+    "\1\364\20\10\3\0\1\10\10\0\5\10\1\46\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\3\10"+
+    "\1\46\22\10\3\0\1\10\10\0\6\10\1\u018e\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\46"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0108"+
+    "\24\10\3\0\1\10\10\0\6\10\1\u018f\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0190\6\10"+
+    "\1\u0191\15\10\3\0\1\10\10\0\1\213\6\10\3\0"+
+    "\12\10\1\u0192\13\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\u0193\12\10\3\0\1\10\10\0\5\10\1\u0194"+
+    "\1\10\3\0\13\10\1\350\12\10\3\0\1\10\10\0"+
+    "\3\10\1\257\3\10\3\0\5\10\1\u0195\11\10\1\353"+
+    "\6\10\3\0\1\10\10\0\7\10\3\0\15\10\1\u0196"+
+    "\10\10\3\0\1\10\10\0\1\u018a\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0197\23\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0198\7\10"+
+    "\1\u0199\4\10\1\46\6\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\u019a\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\46\13\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\u0182\14\10\3\0\1\10\10\0\7\10"+
+    "\3\0\22\10\1\u019b\3\10\3\0\1\10\10\0\1\u019c"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u019d"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\1\10\1\46"+
+    "\5\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\257\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\46\14\10\3\0\1\10\10\0\6\10\1\u019e"+
+    "\3\0\26\10\3\0\1\10\10\0\4\10\1\u019f\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\11\10"+
+    "\1\u01a0\14\10\3\0\1\10\10\0\4\10\1\u01a1\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u01a2\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\2\10\1\u01a3\4\10\3\0"+
+    "\4\10\1\u01a4\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u01a5\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\12\10\1\u01a6\13\10\3\0\1\10\10\0\2\10\1\u01a7"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u01a8\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\u01a9\3\10\1\u0182\10\10\3\0\1\10\10\0"+
+    "\7\10\3\0\21\10\1\147\4\10\3\0\1\10\10\0"+
+    "\4\10\1\353\2\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\u01aa\21\10\3\0\1\10\10\0"+
+    "\7\10\3\0\15\10\1\u01ab\10\10\3\0\1\10\10\0"+
+    "\6\10\1\362\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\153\5\10\1\u01ac\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\10\10\1\u01ad\15\10\3\0\1\10"+
+    "\10\0\2\10\1\u01ae\4\10\3\0\26\10\3\0\1\10"+
+    "\10\0\3\10\1\257\3\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\u01af\21\10\3\0\1\10"+
+    "\10\0\7\10\3\0\7\10\1\u01b0\16\10\3\0\1\10"+
+    "\10\0\6\10\1\u01b1\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\17\10\1\46\6\10\3\0\1\10\10\0"+
+    "\1\362\5\10\1\u01b2\3\0\26\10\3\0\1\10\10\0"+
+    "\4\10\1\u01b3\2\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\24\10\1\124\1\10\3\0\1\10\10\0"+
+    "\4\10\1\u01b4\2\10\3\0\26\10\3\0\1\10\10\0"+
+    "\1\u01b5\6\10\3\0\26\10\3\0\1\10\10\0\4\10"+
+    "\1\u01b6\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\u01b7\14\10\3\0\1\10\10\0\2\10"+
+    "\1\46\4\10\3\0\7\10\1\u01b8\16\10\3\0\1\10"+
+    "\10\0\7\10\3\0\5\10\1\u01b9\1\u01ba\17\10\3\0"+
+    "\1\10\10\0\1\u01bb\6\10\3\0\5\10\1\u01bc\20\10"+
+    "\3\0\1\10\10\0\2\10\1\u01bd\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u01be\2\10\3\0\2\10"+
+    "\1\46\23\10\3\0\1\10\10\0\2\10\1\u01bf\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u01c0\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u01c1\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\1\u01c2\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\1\365\6\10\3\0\12\10\1\323"+
+    "\13\10\3\0\1\10\10\0\5\10\1\u01c3\1\u01c4\3\0"+
+    "\7\10\1\u01c5\16\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u01c6\21\10\3\0\1\10\10\0\2\10\1\u0121"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\317\20\10\3\0\1\10\10\0\2\10\1\u01c7"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\5\10\1\u01c8"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\6\10\1\201"+
+    "\3\0\10\10\1\257\15\10\3\0\1\10\10\0\6\10"+
+    "\1\u01c9\3\0\26\10\3\0\1\10\10\0\3\10\1\u01ca"+
+    "\3\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\u01cb\20\10\3\0\1\10\10\0\2\10\1\46"+
+    "\4\10\3\0\4\10\1\257\21\10\33\0\1\u0148\55\0"+
+    "\1\u01cc\45\0\1\u01cd\54\0\1\u0151\5\0\1\u01ce\3\0"+
+    "\1\u01cf\51\0\1\u0155\1\u01d0\27\0\1\u0159\17\0\1\u01d1"+
+    "\5\0\1\u01d2\51\0\1\u01d3\32\0\1\u0147\47\0\1\u01d4"+
+    "\100\0\1\u0148\30\0\1\u01d5\1\0\1\u0148\63\0\1\u0140"+
+    "\53\0\1\u01d6\2\0\1\u01d7\4\0\1\251\54\0\1\u01d8"+
+    "\47\0\1\u0148\56\0\1\u01d9\50\0\1\u01da\50\0\1\u0148"+
+    "\50\0\1\u01d4\64\0\1\u01db\2\0\1\u01dc\45\0\1\u01dd"+
+    "\33\0\1\u0159\2\0\1\u01de\63\0\1\u01df\41\0\1\u013e"+
+    "\65\0\1\u01e0\43\0\1\u0148\71\0\1\u01e1\57\0\1\u01e2"+
+    "\27\0\1\u01e3\57\0\1\u01e4\34\0\1\10\10\0\7\10"+
+    "\3\0\7\10\1\152\16\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\220\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\213\13\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u01e5\12\10\3\0\1\10\10\0\2\10"+
+    "\1\u01e6\4\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\u01e7\13\10\3\0\1\10\10\0\4\10"+
+    "\1\u01e8\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u01e9\12\10\3\0\1\10\10\0\3\10"+
+    "\1\311\3\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\323\13\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\u01ea\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\12\10\1\u01eb\13\10\3\0\1\10\10\0\6\10"+
+    "\1\u01ec\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\12\10\1\u01ed\13\10\3\0\1\10\10\0\6\10\1\u01ee"+
+    "\3\0\26\10\3\0\1\10\10\0\6\10\1\u01ef\3\0"+
+    "\26\10\3\0\1\10\10\0\5\10\1\u01af\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\12\10\1\u01f0"+
+    "\13\10\3\0\1\10\10\0\1\u01f1\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\4\10\1\u01f2\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\u01f3\16\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u019b\23\10"+
+    "\3\0\1\10\10\0\4\10\1\363\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\1\10\1\220\5\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u01f4\23\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01f5\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01f6\21\10"+
+    "\3\0\1\10\10\0\1\u01f7\6\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\12\10\1\u01f8\13\10\3\0"+
+    "\1\10\10\0\4\10\1\u017d\2\10\3\0\26\10\3\0"+
+    "\1\10\10\0\6\10\1\u01f9\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\46\25\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\u01fa\21\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\u017d\24\10\3\0\1\10\10\0"+
+    "\1\u017d\6\10\3\0\26\10\3\0\1\10\10\0\6\10"+
+    "\1\u01fb\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\14\10\1\46\11\10\3\0\1\10\10\0\2\10\1\361"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\2\10\1\u01fc"+
+    "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\7\10\1\u01fd\16\10\3\0\1\10\10\0\1\362\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\5\10\1\u01fe\1\10"+
+    "\3\0\26\10\3\0\1\10\10\0\2\10\1\u01ff\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\7\10"+
+    "\1\u0200\16\10\3\0\1\10\10\0\4\10\1\257\2\10"+
+    "\3\0\26\10\3\0\1\10\10\0\1\u0201\6\10\3\0"+
+    "\4\10\1\u0202\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0203\6\10\1\u018a\15\10\3\0\1\10\10\0"+
+    "\7\10\3\0\5\10\1\u0204\20\10\3\0\1\10\10\0"+
+    "\2\10\1\u0205\4\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\7\10\1\u0206\16\10\3\0\1\10\10\0"+
+    "\6\10\1\153\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\4\10\1\153\21\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u0207\12\10\3\0\1\10\10\0\7\10"+
+    "\3\0\21\10\1\257\4\10\3\0\1\10\10\0\7\10"+
+    "\3\0\1\10\1\u0208\24\10\3\0\1\10\10\0\7\10"+
+    "\3\0\13\10\1\u0109\12\10\3\0\1\10\10\0\7\10"+
+    "\3\0\11\10\1\75\14\10\3\0\1\10\10\0\1\u0183"+
+    "\6\10\3\0\4\10\1\u0209\21\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\376\21\10\3\0\1\10\10\0"+
+    "\5\10\1\336\1\10\3\0\26\10\3\0\1\10\10\0"+
+    "\5\10\1\u020a\1\10\3\0\7\10\1\u020b\16\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u020c\12\10\3\0"+
+    "\1\10\10\0\7\10\3\0\13\10\1\u020d\12\10\3\0"+
+    "\1\10\10\0\7\10\3\0\7\10\1\u0116\16\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u020e\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u0116\5\10\1\353"+
+    "\16\10\3\0\1\10\10\0\2\10\1\u020f\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\213"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\5\10\1\u0210"+
+    "\20\10\3\0\1\10\10\0\4\10\1\u0211\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\4\10\1\u0212\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0213"+
+    "\12\10\3\0\1\10\10\0\1\u0214\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0215\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0216\23\10"+
+    "\3\0\1\10\10\0\7\10\3\0\13\10\1\362\12\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0217\24\10"+
+    "\3\0\1\10\10\0\7\10\3\0\6\10\1\u0218\17\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\353\16\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0219\24\10"+
+    "\3\0\1\10\10\0\6\10\1\u018e\3\0\13\10\1\u020c"+
+    "\12\10\3\0\1\10\10\0\2\10\1\u021a\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\6\10\1\u0182"+
+    "\17\10\3\0\1\10\10\0\4\10\1\317\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\10\10\1\u021b"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u021c"+
+    "\5\10\1\u0182\10\10\3\0\1\10\10\0\1\u0191\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\2\10"+
+    "\1\u021d\4\10\1\46\16\10\3\0\1\10\10\0\7\10"+
+    "\3\0\10\10\1\u0109\15\10\3\0\1\10\10\0\6\10"+
+    "\1\u01a2\3\0\26\10\3\0\1\10\10\0\6\10\1\u021e"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\16\10"+
+    "\1\u021f\7\10\3\0\1\10\10\0\1\u0220\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\4\10\1\u0221\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\353"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\10\10\1\353"+
+    "\15\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0160"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0222"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0223"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0224"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u011c"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0225"+
+    "\24\10\3\0\1\10\10\0\5\10\1\336\1\10\3\0"+
+    "\12\10\1\u0226\13\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\220\20\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0227\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0228\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\3\10\1\213\22\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\u0229\12\10\14\0\1\u0148\60\0\1\u0148\75\0"+
+    "\1\u01dc\45\0\1\u022a\36\0\1\u01cc\53\0\1\u0150\50\0"+
+    "\1\u0159\101\0\1\u0140\26\0\1\u0148\54\0\1\u022b\55\0"+
+    "\1\u022c\46\0\1\u022d\71\0\1\u0158\63\0\1\u0148\51\0"+
+    "\1\u022e\27\0\1\u022f\74\0\1\u01d1\32\0\1\u0230\2\0"+
+    "\1\u0231\10\0\1\u0232\1\0\1\u0233\1\0\1\u0234\3\0"+
+    "\1\u0235\35\0\1\u01cd\60\0\1\u013f\56\0\1\u0147\62\0"+
+    "\1\u01d0\45\0\1\u0236\53\0\1\u0237\41\0\1\u01cc\35\0"+
+    "\1\10\10\0\7\10\3\0\5\10\1\u0238\20\10\3\0"+
+    "\1\10\10\0\7\10\3\0\5\10\1\u0239\20\10\3\0"+
+    "\1\10\10\0\7\10\3\0\1\10\1\u0161\24\10\3\0"+
+    "\1\10\10\0\5\10\1\u016f\1\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u023a\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\u023b\21\10\3\0"+
+    "\1\10\10\0\7\10\3\0\17\10\1\u023c\6\10\3\0"+
+    "\1\10\10\0\2\10\1\213\4\10\3\0\26\10\3\0"+
+    "\1\10\10\0\7\10\3\0\6\10\1\u023d\6\10\1\u0182"+
+    "\10\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u023e"+
+    "\12\10\3\0\1\10\10\0\2\10\1\u023f\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\5\10\1\u0240\1\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u0241"+
+    "\14\10\3\0\1\10\10\0\7\10\3\0\6\10\1\u0242"+
+    "\3\10\1\u0243\13\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0244\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\7\10\1\u010e\16\10\3\0\1\10\10\0\7\10\3\0"+
+    "\11\10\1\u0245\14\10\3\0\1\10\10\0\7\10\3\0"+
+    "\4\10\1\u0246\21\10\3\0\1\10\10\0\7\10\3\0"+
+    "\13\10\1\u0247\12\10\3\0\1\10\10\0\5\10\1\u0180"+
+    "\1\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0248\24\10\3\0\1\10\10\0\7\10\3\0"+
+    "\15\10\1\46\10\10\3\0\1\10\10\0\7\10\3\0"+
+    "\5\10\1\353\20\10\3\0\1\10\10\0\1\220\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+    "\1\u0249\12\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+    "\1\u024a\20\10\3\0\1\10\10\0\7\10\3\0\20\10"+
+    "\1\46\5\10\3\0\1\10\10\0\2\10\1\u024b\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u024c\24\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u0238\21\10\3\0\1\10\10\0\6\10\1\u024d\3\0"+
+    "\26\10\3\0\1\10\10\0\3\10\1\46\3\10\3\0"+
+    "\26\10\3\0\1\10\10\0\4\10\1\u0215\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\2\10\1\72\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\257"+
+    "\23\10\3\0\1\10\10\0\6\10\1\u024e\3\0\26\10"+
+    "\3\0\1\10\10\0\6\10\1\u024f\3\0\26\10\3\0"+
+    "\1\10\10\0\1\u024b\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\21\10\1\317\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\220\21\10\3\0\1\10"+
+    "\10\0\1\u0249\6\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\13\10\1\u018a\12\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\u0250\24\10\3\0\1\10\10\0"+
+    "\7\10\3\0\7\10\1\u015e\16\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\46\24\10\3\0\1\10\10\0"+
+    "\2\10\1\46\4\10\3\0\6\10\1\u0251\17\10\3\0"+
+    "\1\10\10\0\7\10\3\0\15\10\1\u0252\10\10\3\0"+
+    "\1\10\10\0\7\10\3\0\4\10\1\357\21\10\3\0"+
+    "\1\10\10\0\1\u0253\6\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\u0254\21\10\3\0\1\10"+
+    "\10\0\7\10\3\0\6\10\1\u0255\17\10\3\0\1\10"+
+    "\10\0\4\10\1\u0238\2\10\3\0\26\10\3\0\1\10"+
+    "\10\0\3\10\1\220\3\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\257\21\10\3\0\1\10"+
+    "\10\0\6\10\1\u0256\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\1\10\1\u0257\24\10\3\0\1\10\10\0"+
+    "\7\10\3\0\16\10\1\46\7\10\3\0\1\10\10\0"+
+    "\7\10\3\0\12\10\1\353\13\10\3\0\1\10\10\0"+
+    "\7\10\3\0\6\10\1\353\17\10\3\0\1\10\10\0"+
+    "\1\365\3\10\1\u01be\2\10\3\0\26\10\3\0\1\10"+
+    "\10\0\7\10\3\0\22\10\1\u0258\3\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\u0182\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\1\10\1\u01fc\24\10\3\0\1\10"+
+    "\10\0\7\10\3\0\21\10\1\u0238\4\10\3\0\1\10"+
+    "\10\0\7\10\3\0\4\10\1\u0169\21\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\u0186\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\15\10\1\u0259\10\10\3\0\1\10"+
+    "\10\0\7\10\3\0\22\10\1\46\3\10\34\0\1\u0234"+
+    "\37\0\1\u025a\71\0\1\u025b\61\0\1\u0148\30\0\1\u025c"+
+    "\64\0\1\u025d\65\0\1\u025e\2\0\1\u025f\20\0\1\u0158"+
+    "\66\0\1\u0260\64\0\1\251\51\0\1\u0261\47\0\1\u0262"+
+    "\35\0\1\u0263\100\0\1\u0264\15\0\1\10\10\0\1\353"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0265"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0266"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\1\10\1\u0267\24\10\3\0\1\10\10\0\1\u0182\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+    "\1\u0178\12\10\3\0\1\10\10\0\2\10\1\u01f1\4\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\362\24\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+    "\1\u0116\12\10\3\0\1\10\10\0\1\u0268\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0269"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u026a"+
+    "\12\10\3\0\1\10\10\0\7\10\3\0\4\10\1\124"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\213"+
+    "\24\10\3\0\1\10\10\0\6\10\1\u026b\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u026c\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\2\10\1\u026d\23\10"+
+    "\3\0\1\10\10\0\3\10\1\353\3\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\1\10\1\355\24\10"+
+    "\3\0\1\10\10\0\4\10\1\u026e\2\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\7\10\1\213\16\10"+
+    "\3\0\1\10\10\0\2\10\1\u026f\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\15\10\1\257\10\10"+
+    "\3\0\1\10\10\0\2\10\1\u0270\4\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01fc\21\10"+
+    "\3\0\1\10\10\0\7\10\3\0\6\10\1\46\17\10"+
+    "\3\0\1\10\10\0\7\10\3\0\10\10\1\u0271\15\10"+
+    "\3\0\1\10\10\0\7\10\3\0\25\10\1\46\3\0"+
+    "\1\10\10\0\6\10\1\u01af\3\0\26\10\3\0\1\10"+
+    "\10\0\1\u0272\6\10\3\0\26\10\3\0\1\10\10\0"+
+    "\7\10\3\0\23\10\1\257\2\10\3\0\1\10\10\0"+
+    "\7\10\3\0\4\10\1\347\21\10\3\0\1\10\10\0"+
+    "\6\10\1\72\3\0\26\10\3\0\1\10\10\0\5\10"+
+    "\1\u0273\1\10\3\0\26\10\31\0\1\u0148\55\0\1\u01cc"+
+    "\47\0\1\u01d9\41\0\1\u0148\52\0\1\u0274\66\0\1\u0275"+
+    "\45\0\1\u01cd\50\0\1\u0274\76\0\1\u013e\46\0\1\u0148"+
+    "\67\0\1\u0148\6\0\1\10\10\0\7\10\3\0\1\10"+
+    "\1\u0276\24\10\3\0\1\10\10\0\1\124\6\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0277"+
+    "\23\10\3\0\1\10\10\0\2\10\1\u0278\4\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0109"+
+    "\21\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u0238"+
+    "\16\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u017d"+
+    "\23\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0279"+
+    "\24\10\3\0\1\10\10\0\4\10\1\u027a\2\10\3\0"+
+    "\26\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u027b"+
+    "\24\10\3\0\1\10\10\0\1\u0189\6\10\3\0\26\10"+
+    "\3\0\1\10\10\0\7\10\3\0\6\10\1\u027c\17\10"+
+    "\3\0\1\10\10\0\7\10\3\0\4\10\1\u0266\21\10"+
+    "\30\0\1\u0148\44\0\1\u0263\35\0\1\10\10\0\7\10"+
+    "\3\0\15\10\1\220\10\10\3\0\1\10\10\0\4\10"+
+    "\1\u027d\2\10\3\0\26\10\3\0\1\10\10\0\4\10"+
+    "\1\220\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+    "\3\0\4\10\1\u027e\21\10\3\0\1\10\10\0\1\u027f"+
+    "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0273"+
+    "\2\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+    "\6\10\1\u027d\17\10\3\0\1\10\10\0\1\u020d\6\10"+
+    "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\14\10"+
+    "\1\u017d\11\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+    "\1\u017d\21\10\1\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[27016];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\5\0\2\11\3\1\1\11\12\1\3\11\23\1\1\11"+
+    "\1\1\2\11\1\1\2\11\1\1\1\11\2\1\1\11"+
+    "\144\1\21\0\1\11\220\1\7\0\1\1\2\0\1\11"+
+    "\24\0\157\1\12\0\1\1\16\0\105\1\16\0\42\1"+
+    "\13\0\17\1\2\0\12\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[639];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** 
+   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+   */
+  private boolean zzAtBOL = true;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public SASTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "*", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public SASTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public SASTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 180) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      if (zzMarkedPosL > zzStartRead) {
+        switch (zzBufferL[zzMarkedPosL-1]) {
+        case '\n':
+        case '\u000B':
+        case '\u000C':
+        case '\u0085':
+        case '\u2028':
+        case '\u2029':
+          zzAtBOL = true;
+          break;
+        case '\r': 
+          if (zzMarkedPosL < zzEndReadL)
+            zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          else if (zzAtEOF)
+            zzAtBOL = false;
+          else {
+            boolean eof = zzRefill();
+            zzMarkedPosL = zzMarkedPos;
+            zzEndReadL = zzEndRead;
+            zzBufferL = zzBuffer;
+            if (eof) 
+              zzAtBOL = false;
+            else 
+              zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+          }
+          break;
+        default:
+          zzAtBOL = false;
+        }
+      }
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      if (zzAtBOL)
+        zzState = ZZ_LEXSTATE[zzLexicalState+1];
+      else
+        zzState = ZZ_LEXSTATE[zzLexicalState];
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 21: break;
+        case 2: 
+          { addNullToken(); return firstToken;
+          }
+        case 22: break;
+        case 18: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 23: break;
+        case 17: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 24: break;
+        case 3: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 25: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(CHAR);
+          }
+        case 26: break;
+        case 5: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 27: break;
+        case 6: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 28: break;
+        case 16: 
+          { addToken(Token.VARIABLE);
+          }
+        case 29: break;
+        case 14: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 30: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 31: break;
+        case 20: 
+          { addToken(Token.FUNCTION);
+          }
+        case 32: break;
+        case 19: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 33: break;
+        case 11: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 34: break;
+        case 9: 
+          { // We must do this because of how we
+									// abuse JFlex; since we return an entire
+									// list of tokens at once instead of a
+									// single token at a time, the "^" regex
+									// character doesn't really work, so we must
+									// check that we're at the beginning of a
+									// line ourselves.
+									start = zzStartRead;
+									// Might not be any whitespace.
+									if (yylength()>1) {
+										addToken(zzStartRead,zzMarkedPos-2, Token.WHITESPACE);
+										zzStartRead = zzMarkedPos-1;
+									}
+									// Remember:  zzStartRead may now be updated,
+									// so we must check against 'start'.
+									if (start==s.offset) {
+										addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+										addNullToken();
+										return firstToken;
+									}
+									else {
+										addToken(zzStartRead,zzStartRead, Token.OPERATOR);
+									}
+          }
+        case 35: break;
+        case 7: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 36: break;
+        case 4: 
+          { addToken(Token.OPERATOR);
+          }
+        case 37: break;
+        case 12: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 38: break;
+        case 10: 
+          { 
+          }
+        case 39: break;
+        case 15: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 40: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 640: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 641: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 642: break;
+            case CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 643: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex	(revision 25584)
@@ -0,0 +1,463 @@
+/*
+ * 02/15/2005
+ *
+ * SQLTokenMaker.java - Scanner for SQL.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SQL.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SQLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class SQLTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public SQLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "--", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+LineTerminator		= ([\n])
+Letter			= ([A-Za-z])
+Digit			= ([0-9])
+Whitespace		= ([ \t]+)
+
+IdentifierStart	= ({Letter})
+IdentifierPart		= ({IdentifierStart}|{Digit}|[_])
+Identifier		= ({IdentifierStart}{IdentifierPart}*)
+
+Operator			= (">="|"<="|"<>"|">"|"<"|"="|"+"|"-"|"*"|"/")
+Separator			= ([\(\)])
+
+Parameter			= ([:]{Identifier})
+
+Integer			= ({Digit}+)
+Float			= (({Digit}+[.]{Digit}*)|([.]{Digit}*))
+ApproxNum			= (({Digit}+[eE][+-]?{Digit}+)|({Digit}+[.]{Digit}*[eE][+-]?[0-9]+)|([.][0-9]*[eE][+-]?[0-9]+))
+
+CommentBegin		= ("--")
+Comment			= ({CommentBegin}.*)
+MLCBegin			= "/*"
+MLCEnd			= "*/"
+
+%state STRING
+%state CHAR
+%state MLC
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"ADD" |
+	"ALL" |
+	"ALTER" |
+	"AND" |
+	"ANY" |
+	"AS" |
+	"ASC" |
+	"AUTOINCREMENT" |
+	"AVA" |
+	"BETWEEN" |
+	"BINARY" |
+	"BIT" |
+	"BOOLEAN" |
+	"BY" |
+	"BYTE" |
+	"CHAR" |
+	"CHARACTER" |
+	"COLUMN" |
+	"CONSTRAINT" |
+	"COUNT" |
+	"COUNTER" |
+	"CREATE" |
+	"CURRENCY" |
+	"DATABASE" |
+	"DATE" |
+	"DATETIME" |
+	"DELETE" |
+	"DESC" |
+	"DISALLOW" |
+	"DISTINCT" |
+	"DISTINCTROW" |
+	"DOUBLE" |
+	"DROP" |
+	"EXISTS" |
+	"FLOAT" |
+	"FLOAT4" |
+	"FLOAT8" |
+	"FOREIGN" |
+	"FROM" |
+	"GENERAL" |
+	"GROUP" |
+	"GUID" |
+	"HAVING" |
+	"INNER" |
+	"INSERT" |
+	"IGNORE" |
+	"IMP" |
+	"IN" |
+	"INDEX" |
+	"INT" |
+	"INTEGER" |
+	"INTEGER1" |
+	"INTEGER2" |
+	"INTEGER4" |
+	"INTO" |
+	"IS" |
+	"JOIN" |
+	"KEY" |
+	"LEFT" |
+	"LEVEL" |
+	"LIKE" |
+	"LOGICAL" |
+	"LONG" |
+	"LONGBINARY" |
+	"LONGTEXT" |
+	"MAX" |
+	"MEMO" |
+	"MIN" |
+	"MOD" |
+	"MONEY" |
+	"NOT" |
+	"NULL" |
+	"NUMBER" |
+	"NUMERIC" |
+	"OLEOBJECT" |
+	"ON" |
+	"OPTION" |
+	"OR" |
+	"ORDER" |
+	"OUTER" |
+	"OWNERACCESS" |
+	"PARAMETERS" |
+	"PASSWORD" |
+	"PERCENT" |
+	"PIVOT" |
+	"PRIMARY" |
+	"REAL" |
+	"REFERENCES" |
+	"RIGHT" |
+	"SELECT" |
+	"SET" |
+	"SHORT" |
+	"SINGLE" |
+	"SMALLINT" |
+	"SOME" |
+	"STDEV" |
+	"STDEVP" |
+	"STRING" |
+	"SUM" |
+	"TABLE" |
+	"TABLEID" |
+	"TEXT" |
+	"TIME" |
+	"TIMESTAMP" |
+	"TOP" |
+	"TRANSFORM" |
+	"TYPE" |
+	"UNION" |
+	"UNIQUE" |
+	"UPDATE" |
+	"USER" |
+	"VALUE" |
+	"VALUES" |
+	"VAR" |
+	"VARBINARY" |
+	"VARCHAR" |
+	"VARP" |
+	"WHERE" |
+	"WITH" |
+	"YESNO"					{ addToken(Token.RESERVED_WORD); }
+
+	/* SQL99 aggregate functions */
+	"AVG" |
+	"COUNT" |
+	"MIN" |
+	"MAX" |
+	"SUM"					{ addToken(Token.FUNCTION); }
+
+	/* SQL99 built-in scalar functions */
+	"CURRENT_DATE" |
+	"CURRENT_TIME" |
+	"CURRENT_TIMESTAMP" |
+	"CURRENT_USER" |
+	"SESSION_USER" |
+	"SYSTEM_USER"			{ addToken(Token.FUNCTION); }
+
+	/* SQL99 numeric scalar functions */
+	"BIT_LENGTH" |
+	"CHAR_LENGTH" |
+	"EXTRACT" |
+	"OCTET_LENGTH" |
+	"POSITION"				{ addToken(Token.FUNCTION); }
+
+	/* SQL99 string functions */
+	"CONCATENATE" |
+	"CONVERT" |
+	"LOWER" |
+	"SUBSTRING" |
+	"TRANSLATE" |
+	"TRIM" |
+	"UPPER"					{ addToken(Token.FUNCTION); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	";"							{ addToken(Token.IDENTIFIER); }
+
+	{Parameter}					{ addToken(Token.IDENTIFIER); }
+
+	{Comment}						{ addToken(Token.COMMENT_EOL); }
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	{Operator}					{ addToken(Token.OPERATOR); }
+	{Separator}					{ addToken(Token.SEPARATOR); }
+
+	{Integer}						{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{Float}						{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ApproxNum}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	"\""							{ start = zzMarkedPos-1; yybegin(STRING); }
+	"\'"							{ start = zzMarkedPos-1; yybegin(CHAR); }
+
+	"["[^\]]*"]"					{ addToken(Token.PREPROCESSOR); }
+	"["[^\]]*						{ addToken(Token.ERROR_IDENTIFIER); addNullToken(); return firstToken; }
+
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as OK; */
+	/* I don't know enough about SQL to know what's really invalid. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+<STRING> {
+
+	[^\n\"]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+	"\"\""				{}
+	"\""					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<CHAR> {
+
+	[^\n\']+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+	"\'\'"				{}
+	"\'"					{ yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+
+}
+
+<MLC> {
+
+	[^\n\*]+				{}
+	\n					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}				{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*					{}
+	<<EOF>>				{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java	(revision 25584)
@@ -0,0 +1,1126 @@
+/* The following code was generated by JFlex 1.4.1 on 2/7/09 11:02 AM */
+
+/*
+ * 02/15/2005
+ *
+ * SQLTokenMaker.java - Scanner for SQL.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SQL.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated SQLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class SQLTokenMaker extends AbstractJFlexTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int STRING = 1;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 3;
+  public static final int CHAR = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\4\1\1\25\0\1\4\1\0\1\54\4\0\1\55\2\15"+
+    "\1\13\1\11\1\0\1\12\1\17\1\14\1\3\1\50\1\50\1\3"+
+    "\1\45\3\3\1\46\1\3\1\16\1\0\1\10\1\7\1\6\2\0"+
+    "\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41\1\34\1\51"+
+    "\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25\1\30\1\24"+
+    "\1\32\1\36\1\40\1\43\1\27\1\2\1\56\1\0\1\57\1\0"+
+    "\1\5\1\0\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41"+
+    "\1\34\1\51\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25"+
+    "\1\30\1\24\1\32\1\36\1\40\1\43\1\27\1\2\uff85\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\4\0\1\1\1\2\1\1\1\3\1\4\5\5\1\6"+
+    "\1\1\1\7\27\1\1\10\1\11\1\12\1\13\1\14"+
+    "\1\15\1\13\1\16\1\17\1\13\1\20\1\13\1\0"+
+    "\1\21\1\22\4\1\1\23\45\1\2\23\4\1\1\23"+
+    "\7\1\1\23\22\1\1\24\1\13\1\25\1\7\1\0"+
+    "\3\1\1\26\51\1\1\23\4\1\1\23\2\1\1\23"+
+    "\22\1\1\23\4\1\1\23\4\1\1\23\17\1\1\23"+
+    "\35\1\1\23\5\1\1\23\10\1\1\23\5\1\1\23"+
+    "\11\1\1\23\42\1\1\23\4\1\1\23\16\1\1\26"+
+    "\4\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[354];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\60\0\140\0\220\0\300\0\300\0\360\0\u0120"+
+    "\0\u0150\0\u0180\0\300\0\u01b0\0\u01e0\0\u0210\0\300\0\u0240"+
+    "\0\u0270\0\u02a0\0\u02d0\0\u0300\0\u0330\0\u0360\0\u0390\0\u03c0"+
+    "\0\u03f0\0\u0420\0\u0450\0\u0480\0\u04b0\0\u04e0\0\u0510\0\u0540"+
+    "\0\u0570\0\u05a0\0\u05d0\0\u0600\0\u0630\0\u0660\0\u0690\0\u06c0"+
+    "\0\300\0\300\0\u06f0\0\u0720\0\300\0\u0750\0\u0780\0\300"+
+    "\0\u07b0\0\u07e0\0\300\0\u0810\0\u0840\0\u0870\0\300\0\u08a0"+
+    "\0\u08d0\0\u0900\0\u0930\0\u0960\0\u0990\0\u09c0\0\u09f0\0\u0a20"+
+    "\0\u0a50\0\u0a80\0\u0ab0\0\u0ae0\0\u0b10\0\u0b40\0\u0b70\0\u0ba0"+
+    "\0\u0bd0\0\u0c00\0\u0c30\0\u0c60\0\u0c90\0\u0cc0\0\u0cf0\0\u0d20"+
+    "\0\u0d50\0\u0d80\0\u0db0\0\u0de0\0\u0e10\0\u0e40\0\u0e70\0\u0ea0"+
+    "\0\u0ed0\0\u0f00\0\u0f30\0\u0f60\0\u0f90\0\u0fc0\0\u0ff0\0\u1020"+
+    "\0\u1050\0\u1080\0\360\0\u10b0\0\u10e0\0\u1110\0\u1140\0\u1170"+
+    "\0\u11a0\0\u11d0\0\u1200\0\u1230\0\u1260\0\u1290\0\u12c0\0\u12f0"+
+    "\0\u1320\0\u1350\0\u1380\0\u13b0\0\u13e0\0\u1410\0\u1440\0\u1470"+
+    "\0\u14a0\0\u14d0\0\u1500\0\u1530\0\u1560\0\u1590\0\u15c0\0\u15f0"+
+    "\0\u1620\0\u1650\0\300\0\300\0\300\0\u1680\0\u1680\0\u16b0"+
+    "\0\u16e0\0\u1710\0\360\0\u1740\0\u0960\0\u1770\0\u17a0\0\u17d0"+
+    "\0\u1800\0\u1830\0\u1860\0\u1890\0\u18c0\0\u18f0\0\u1920\0\u1950"+
+    "\0\u1980\0\u19b0\0\u19e0\0\u1a10\0\u1a40\0\u1a70\0\u1aa0\0\u1ad0"+
+    "\0\u1b00\0\u1b30\0\u1b60\0\u1b90\0\u1bc0\0\u1bf0\0\u1c20\0\u1c50"+
+    "\0\u1c80\0\u1cb0\0\u1ce0\0\u1d10\0\u1d40\0\u1d70\0\u1da0\0\u1dd0"+
+    "\0\u1e00\0\u1e30\0\u1e60\0\u1e90\0\u1ec0\0\u1ef0\0\u1f20\0\u1f50"+
+    "\0\u1f80\0\u1fb0\0\u1fe0\0\u2010\0\u2040\0\u2070\0\u20a0\0\u20d0"+
+    "\0\u2100\0\u2130\0\u2160\0\u2190\0\u21c0\0\u21f0\0\u2220\0\u2250"+
+    "\0\u2280\0\u22b0\0\u22e0\0\u2310\0\u2340\0\u2370\0\u12f0\0\u23a0"+
+    "\0\u23d0\0\u2400\0\u2430\0\u2460\0\u2490\0\u24c0\0\u24f0\0\u2520"+
+    "\0\u2550\0\u2580\0\u25b0\0\u25e0\0\u2610\0\u2640\0\u2670\0\u26a0"+
+    "\0\u26d0\0\u2700\0\u2730\0\u2760\0\u2790\0\u27c0\0\u27f0\0\u2820"+
+    "\0\u2850\0\u2880\0\u28b0\0\u28e0\0\u2910\0\u2940\0\u2970\0\u29a0"+
+    "\0\u29d0\0\u2a00\0\u2a30\0\u2a60\0\u2a90\0\u2ac0\0\u2af0\0\u2b20"+
+    "\0\u2b50\0\u2b80\0\u2bb0\0\u2be0\0\u2c10\0\u2c40\0\u2c70\0\u2ca0"+
+    "\0\u2cd0\0\u2d00\0\u2d30\0\u2d60\0\u2d90\0\u2dc0\0\u2df0\0\u15f0"+
+    "\0\u2e20\0\u2e50\0\u2e80\0\u2eb0\0\u2ee0\0\u0c30\0\u2f10\0\u2f40"+
+    "\0\u2f70\0\u2fa0\0\u2fd0\0\u3000\0\u3030\0\u3060\0\u0ff0\0\u3090"+
+    "\0\u30c0\0\u2040\0\u30f0\0\u3120\0\u2ca0\0\u3150\0\u3180\0\u31b0"+
+    "\0\u31e0\0\u3210\0\u3240\0\u3270\0\u32a0\0\u32d0\0\u3300\0\u3330"+
+    "\0\u3360\0\u3390\0\u33c0\0\u33f0\0\u3420\0\u3450\0\u3480\0\u34b0"+
+    "\0\u34e0\0\u3510\0\u3540\0\u3570\0\u35a0\0\u35d0\0\u3600\0\u3630"+
+    "\0\u3660\0\u3690\0\u36c0\0\u36f0\0\u3720\0\u3750\0\u3780\0\u37b0"+
+    "\0\u37e0\0\u3810\0\u3840\0\u3870\0\u38a0\0\u38d0\0\u3900\0\u3930"+
+    "\0\u3960\0\u3990\0\u39c0\0\u39f0\0\u3a20\0\u3a50\0\u3a80\0\u3ab0"+
+    "\0\u3ae0\0\u3b10\0\u3b40\0\u3b70\0\u3ba0\0\u3bd0\0\u3c00\0\u3c30"+
+    "\0\u3c60\0\u3c90\0\u3cc0\0\u3cf0\0\u3d20\0\u3d50\0\u3d80\0\u3db0"+
+    "\0\u3de0\0\u3e10";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[354];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\5\1\6\1\7\1\10\1\11\1\5\1\12\1\13"+
+    "\1\14\1\13\1\15\1\13\1\16\1\17\1\20\1\21"+
+    "\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31"+
+    "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
+    "\1\42\1\43\1\44\1\7\1\45\2\10\1\46\1\10"+
+    "\1\47\1\50\1\7\1\51\1\52\1\53\1\5\1\54"+
+    "\1\55\52\54\1\56\3\54\1\57\1\60\53\57\1\61"+
+    "\2\57\1\62\1\63\11\62\1\64\44\62\62\0\2\7"+
+    "\1\0\1\7\12\0\34\7\7\0\1\10\13\0\1\21"+
+    "\1\65\24\0\2\10\1\0\1\10\13\0\1\11\62\0"+
+    "\1\13\56\0\2\13\62\0\1\66\60\0\1\67\46\0"+
+    "\1\7\15\0\25\7\2\0\1\7\1\0\3\7\7\0"+
+    "\1\21\14\0\1\65\24\0\2\21\1\0\1\21\11\0"+
+    "\2\7\1\0\1\7\12\0\23\7\1\70\10\7\6\0"+
+    "\2\7\1\0\1\7\12\0\2\7\1\71\1\72\2\7"+
+    "\1\73\1\7\1\74\1\7\1\75\3\7\1\76\15\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\77\1\100\3\7"+
+    "\1\101\5\7\1\102\1\103\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\104\12\7\1\105\1\106\17\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\107\1\110\3\7\1\111"+
+    "\1\7\1\112\3\7\1\113\1\114\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\115\13\7\1\116\17\7\6\0"+
+    "\2\7\1\0\1\7\12\0\12\7\1\117\1\120\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\121\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\122\3\7\1\123\2\7"+
+    "\1\124\2\7\1\125\1\126\1\127\1\130\3\7\1\131"+
+    "\12\7\6\0\2\7\1\0\1\7\12\0\5\7\1\132"+
+    "\4\7\1\133\1\134\5\7\1\135\12\7\6\0\2\7"+
+    "\1\0\1\7\12\0\6\7\1\136\1\7\1\137\11\7"+
+    "\1\140\11\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\141\1\7\1\142\1\143\2\7\1\144\1\145\5\7"+
+    "\1\146\1\7\1\147\11\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\150\1\7\1\143\4\7\1\113\11\7"+
+    "\1\151\4\7\6\0\2\7\1\0\1\7\12\0\1\152"+
+    "\1\153\11\7\1\154\1\155\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\156\32\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\157\6\7\1\160\3\7\1\161\1\162"+
+    "\17\7\6\0\2\7\1\0\1\7\12\0\14\7\1\163"+
+    "\4\7\1\164\12\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\165\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\166\1\167\3\7\1\170\5\7\1\171\1\172\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\3\7\1\173\1\7"+
+    "\1\174\5\7\1\175\20\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\176\4\7\1\177\4\7\1\200\21\7\6\0"+
+    "\2\7\1\0\1\7\12\0\13\7\1\201\20\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\202\33\7\4\0\57\53"+
+    "\1\203\1\54\1\0\52\54\1\0\3\54\54\0\1\204"+
+    "\3\0\1\57\1\0\53\57\1\0\2\57\55\0\1\204"+
+    "\2\0\1\62\1\0\11\62\1\0\44\62\14\0\1\205"+
+    "\46\0\1\206\5\0\2\207\32\0\2\206\1\0\1\206"+
+    "\7\0\1\66\1\0\56\66\2\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\210\7\7\1\211\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\2\7\1\143\31\7\6\0\2\7"+
+    "\1\0\1\7\12\0\3\7\1\143\1\137\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\2\7\1\143\4\7\1\143"+
+    "\24\7\6\0\2\7\1\0\1\7\12\0\11\7\1\143"+
+    "\22\7\6\0\2\7\1\0\1\7\12\0\4\7\1\212"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\143"+
+    "\25\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\214\4\7\1\215\23\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\216\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\13\7\1\113\20\7\6\0\2\7\1\0"+
+    "\1\7\12\0\12\7\1\217\21\7\6\0\2\7\1\0"+
+    "\1\7\12\0\10\7\1\220\23\7\6\0\2\7\1\0"+
+    "\1\7\12\0\16\7\1\221\5\7\1\120\7\7\6\0"+
+    "\2\7\1\0\1\7\12\0\6\7\1\222\11\7\1\223"+
+    "\6\7\1\224\4\7\6\0\2\7\1\0\1\7\12\0"+
+    "\32\7\1\225\1\7\6\0\2\7\1\0\1\7\12\0"+
+    "\23\7\1\120\10\7\6\0\2\7\1\0\1\7\12\0"+
+    "\17\7\1\226\14\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\227\12\7\1\230\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\22\7\1\225\11\7\6\0\2\7\1\0"+
+    "\1\7\12\0\22\7\1\143\11\7\6\0\2\7\1\0"+
+    "\1\7\12\0\15\7\1\231\16\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\232\22\7\1\233\7\7\6\0"+
+    "\2\7\1\0\1\7\12\0\27\7\1\234\4\7\6\0"+
+    "\2\7\1\0\1\7\12\0\3\7\1\232\11\7\1\235"+
+    "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\143"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\236"+
+    "\23\7\6\0\2\7\1\0\1\7\12\0\3\7\1\237"+
+    "\1\143\3\7\1\240\23\7\6\0\2\7\1\0\1\7"+
+    "\12\0\2\7\1\241\2\7\1\242\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\10\7\1\243\23\7\6\0\2\7"+
+    "\1\0\1\7\12\0\15\7\1\143\1\7\1\244\14\7"+
+    "\6\0\2\7\1\0\1\7\12\0\15\7\1\225\16\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\245\25\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\246\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\247\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\250\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\251\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\3\7\1\252\2\7\1\253"+
+    "\3\7\1\254\21\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\255\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\14\7\1\256\17\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\257\33\7\6\0\2\7\1\0\1\7\12\0\2\7"+
+    "\1\250\17\7\1\223\11\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\260\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\2\7\1\137\31\7\6\0\2\7\1\0\1\7\12\0"+
+    "\4\7\1\261\27\7\6\0\2\7\1\0\1\7\12\0"+
+    "\4\7\1\137\27\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\262\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\4\7\1\263\27\7\6\0\2\7\1\0\1\7\12\0"+
+    "\2\7\1\264\1\7\1\265\1\7\1\137\1\7\1\266"+
+    "\23\7\6\0\2\7\1\0\1\7\12\0\6\7\1\267"+
+    "\25\7\6\0\2\7\1\0\1\7\12\0\15\7\1\270"+
+    "\16\7\6\0\2\7\1\0\1\7\12\0\23\7\1\143"+
+    "\10\7\6\0\2\7\1\0\1\7\12\0\2\7\1\143"+
+    "\3\7\1\50\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\143\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\271\1\7\1\272\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\273\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\225\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\13\7\1\274\20\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\275\1\7\1\276\25\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\277\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\300\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\16\7\1\242\15\7\6\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\301\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\302\2\7\1\303\23\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\304\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\10\7\1\305\23\7"+
+    "\6\0\2\7\1\0\1\7\12\0\16\7\1\306\15\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\307\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\310\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\5\7\1\311\26\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\312\25\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\313\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\71\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\155\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\7\7\1\143\24\7"+
+    "\7\0\1\206\41\0\2\206\1\0\1\206\11\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\314\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\10\7\1\315\23\7\6\0\2\7"+
+    "\1\0\1\7\12\0\13\7\1\316\20\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\317\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\320\1\321\32\7\6\0\2\7\1\0"+
+    "\1\7\12\0\17\7\1\322\14\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\323\2\7\1\324\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\232\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\27\7\1\325\4\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\326\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\14\7\1\327\17\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\143\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\3\7\1\330\30\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\331\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\213\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\332\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\143\30\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\333\33\7\6\0\2\7\1\0\1\7\12\0\21\7"+
+    "\1\120\12\7\6\0\2\7\1\0\1\7\12\0\1\334"+
+    "\16\7\1\137\14\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\270\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\335\33\7\6\0\2\7\1\0\1\7\12\0\10\7"+
+    "\1\336\23\7\6\0\2\7\1\0\1\7\12\0\1\337"+
+    "\33\7\6\0\2\7\1\0\1\7\12\0\14\7\1\340"+
+    "\17\7\6\0\2\7\1\0\1\7\12\0\4\7\1\341"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\342"+
+    "\23\7\6\0\2\7\1\0\1\7\12\0\27\7\1\322"+
+    "\4\7\6\0\2\7\1\0\1\7\12\0\3\7\1\343"+
+    "\30\7\6\0\2\7\1\0\1\7\12\0\5\7\1\120"+
+    "\26\7\6\0\2\7\1\0\1\7\12\0\1\7\1\317"+
+    "\32\7\6\0\2\7\1\0\1\7\12\0\5\7\1\344"+
+    "\26\7\6\0\2\7\1\0\1\7\12\0\12\7\1\345"+
+    "\21\7\6\0\2\7\1\0\1\7\12\0\10\7\1\346"+
+    "\1\347\4\7\1\350\15\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\351\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\352\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\13\7\1\155\17\7\1\353\6\0\2\7\1\0"+
+    "\1\7\12\0\5\7\1\143\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\13\7\1\354\20\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\355\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\356\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\14\7\1\357\17\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\153\33\7\6\0\2\7\1\0\1\7\12\0\1\360"+
+    "\12\7\1\143\20\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\247\33\7\6\0\2\7\1\0\1\7\12\0\13\7"+
+    "\1\300\20\7\6\0\2\7\1\0\1\7\12\0\13\7"+
+    "\1\143\20\7\6\0\2\7\1\0\1\7\12\0\12\7"+
+    "\1\361\21\7\6\0\2\7\1\0\1\7\12\0\11\7"+
+    "\1\362\5\7\1\363\2\7\1\143\11\7\6\0\2\7"+
+    "\1\0\1\7\12\0\20\7\1\364\13\7\6\0\2\7"+
+    "\1\0\1\7\12\0\3\7\1\365\30\7\6\0\2\7"+
+    "\1\0\1\366\12\0\34\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\367\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\21\7\1\143\12\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\225\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\370\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\371\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\10\7\1\372\23\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\276\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\373\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\13\7\1\120\20\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\374\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\143\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\375\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\376\33\7\6\0\2\7\1\0\1\7\12\0\12\7"+
+    "\1\113\21\7\6\0\2\7\1\0\1\7\12\0\1\7"+
+    "\1\377\32\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0100\27\7\6\0\2\7\1\0\1\7\12\0\14\7"+
+    "\1\u0101\17\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0102\27\7\6\0\2\7\1\0\1\7\12\0\17\7"+
+    "\1\u0103\14\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\225\30\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\u0104\30\7\6\0\2\7\1\0\1\7\12\0\14\7"+
+    "\1\u0105\17\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0106\12\7\1\363\14\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\213\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\u0107\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\u0108\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\10\7\1\u0109\23\7\6\0\2\7\1\0\1\7\12\0"+
+    "\10\7\1\u010a\23\7\6\0\2\7\1\0\1\7\12\0"+
+    "\5\7\1\u010b\26\7\6\0\2\7\1\0\1\7\12\0"+
+    "\5\7\1\u010c\26\7\6\0\2\7\1\0\1\7\12\0"+
+    "\11\7\1\120\22\7\6\0\2\7\1\0\1\7\12\0"+
+    "\14\7\1\u010d\17\7\6\0\2\7\1\0\1\7\12\0"+
+    "\16\7\1\u010e\15\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\u010f\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\u0110\33\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+    "\1\u0111\27\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+    "\1\u0112\30\7\6\0\2\7\1\0\1\7\12\0\1\u0113"+
+    "\33\7\6\0\2\7\1\0\1\7\12\0\15\7\1\155"+
+    "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\u0114"+
+    "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\u0115"+
+    "\32\7\6\0\2\7\1\0\1\7\12\0\1\u0116\33\7"+
+    "\6\0\2\7\1\0\1\7\12\0\4\7\1\u0117\27\7"+
+    "\6\0\2\7\1\0\1\366\12\0\1\7\1\u0118\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\12\7\1\225\21\7"+
+    "\6\0\2\7\1\0\1\7\12\0\17\7\1\u0119\14\7"+
+    "\6\0\2\7\1\0\1\7\12\0\4\7\1\u011a\27\7"+
+    "\6\0\2\7\1\0\1\7\12\0\5\7\1\u011b\26\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\155\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\27\7\1\u011c\4\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\u011d\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\21\7\1\u011e\12\7\6\0"+
+    "\2\7\1\0\1\7\12\0\14\7\1\u011f\17\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\u0120\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\u0121\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\3\7\1\u0122\30\7\6\0\2\7\1\0"+
+    "\1\7\12\0\5\7\1\202\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\u0123\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\u0124\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\20\7\1\u0125\13\7\6\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\u0126\27\7\6\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\u0127\27\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\u0128\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0107\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\u0129\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\10\7\1\143\23\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\u012a\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\126\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\u012b\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\3\7\1\u012c\30\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\u012d\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\107\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\232\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\3\7\1\u012e\20\7\1\u012f\7\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\u0130\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\u0131\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\215\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\13\7\1\u0132\20\7\6\0\2\7\1\0\1\7"+
+    "\12\0\27\7\1\143\4\7\6\0\2\7\1\0\1\7"+
+    "\12\0\15\7\1\u0133\16\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0134\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\14\7\1\u0123\17\7\6\0\2\7\1\0\1\7"+
+    "\12\0\6\7\1\u0135\25\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0136\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\4\7\1\u0137\27\7\6\0\2\7\1\0\1\7"+
+    "\12\0\5\7\1\u0129\26\7\6\0\2\7\1\0\1\7"+
+    "\12\0\11\7\1\145\22\7\6\0\2\7\1\0\1\7"+
+    "\12\0\31\7\1\237\2\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\7\1\u0138\32\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\u0139\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\7\1\257\32\7\6\0\2\7\1\0\1\7\12\0"+
+    "\6\7\1\276\25\7\6\0\2\7\1\0\1\7\12\0"+
+    "\1\155\33\7\6\0\2\7\1\0\1\7\12\0\1\7"+
+    "\1\155\32\7\6\0\2\7\1\0\1\7\12\0\1\u013a"+
+    "\33\7\6\0\2\7\1\0\1\7\12\0\6\7\1\120"+
+    "\25\7\6\0\2\7\1\0\1\7\12\0\1\u013b\33\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013c\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\14\7\1\u013d\17\7"+
+    "\6\0\2\7\1\0\1\7\12\0\25\7\2\143\5\7"+
+    "\6\0\2\7\1\0\1\7\12\0\27\7\1\155\4\7"+
+    "\6\0\2\7\1\0\1\7\12\0\4\7\1\213\27\7"+
+    "\6\0\2\7\1\0\1\7\12\0\11\7\1\u013e\22\7"+
+    "\6\0\2\7\1\0\1\7\12\0\10\7\1\225\23\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013f\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\11\7\1\u0140\22\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0141\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\13\7\1\u0142\20\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0143\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0144\25\7"+
+    "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0133\25\7"+
+    "\6\0\2\7\1\0\1\u0145\12\0\34\7\6\0\2\7"+
+    "\1\0\1\7\12\0\14\7\1\u0146\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\4\7\1\u0147\4\7\1\202\22\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0112\32\7"+
+    "\6\0\2\7\1\0\1\7\12\0\1\u0148\33\7\6\0"+
+    "\2\7\1\0\1\7\12\0\11\7\1\u0149\22\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\u014a\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\6\7\1\u014b\25\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\u014c\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\71\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\13\7\1\u014d\20\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\u014e\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\20\7\1\143\13\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\u014f\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\4\7\1\u0150\27\7\6\0"+
+    "\2\7\1\0\1\7\12\0\5\7\1\310\26\7\6\0"+
+    "\2\7\1\0\1\7\12\0\15\7\1\113\16\7\6\0"+
+    "\2\7\1\0\1\7\12\0\11\7\1\u0151\22\7\6\0"+
+    "\2\7\1\0\1\7\12\0\12\7\1\u0152\21\7\6\0"+
+    "\2\7\1\0\1\7\12\0\6\7\1\u0153\25\7\6\0"+
+    "\2\7\1\0\1\u0154\12\0\34\7\6\0\2\7\1\0"+
+    "\1\7\12\0\6\7\1\u012e\25\7\6\0\2\7\1\0"+
+    "\1\7\12\0\11\7\1\u0155\22\7\6\0\2\7\1\0"+
+    "\1\7\12\0\25\7\1\143\2\7\1\143\3\7\6\0"+
+    "\2\7\1\0\1\7\12\0\27\7\1\u0156\4\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\u0157\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\6\7\1\213\25\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\u0158\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\5\7\1\u012c\26\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\213\33\7\6\0\2\7\1\0\1\7"+
+    "\12\0\1\u0100\33\7\6\0\2\7\1\0\1\7\12\0"+
+    "\10\7\1\223\23\7\6\0\2\7\1\0\1\7\12\0"+
+    "\27\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"+
+    "\2\7\1\u012e\1\7\1\u0159\5\7\1\u0152\21\7\6\0"+
+    "\2\7\1\0\1\7\12\0\1\u015a\33\7\6\0\2\7"+
+    "\1\0\1\7\12\0\4\7\1\u015b\27\7\6\0\2\7"+
+    "\1\0\1\7\12\0\5\7\1\u0100\26\7\6\0\2\7"+
+    "\1\0\1\7\12\0\15\7\1\370\16\7\6\0\2\7"+
+    "\1\0\1\7\12\0\14\7\1\u015c\17\7\6\0\2\7"+
+    "\1\0\1\7\12\0\10\7\1\u0100\23\7\6\0\2\7"+
+    "\1\0\1\7\12\0\21\7\1\213\12\7\6\0\2\7"+
+    "\1\0\1\7\12\0\15\7\1\u015d\16\7\6\0\2\7"+
+    "\1\0\1\7\12\0\1\u015e\33\7\6\0\2\7\1\0"+
+    "\1\7\12\0\10\7\1\u015f\23\7\6\0\2\7\1\0"+
+    "\1\7\12\0\4\7\1\u0160\27\7\6\0\2\7\1\0"+
+    "\1\7\12\0\1\7\1\u0161\32\7\6\0\2\7\1\0"+
+    "\1\7\12\0\15\7\1\u0162\16\7\6\0\2\7\1\0"+
+    "\1\7\12\0\22\7\1\213\11\7\4\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[15936];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\4\0\2\11\4\1\1\11\3\1\1\11\31\1\2\11"+
+    "\2\1\1\11\2\1\1\11\2\1\1\11\1\1\1\0"+
+    "\1\1\1\11\113\1\3\11\1\1\1\0\333\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[354];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public SQLTokenMaker() {
+		super();
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "--", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				state = STRING;
+				start = text.offset;
+				break;
+			case Token.LITERAL_CHAR:
+				state = CHAR;
+				start = text.offset;
+				break;
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public SQLTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public SQLTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 178) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 20: 
+          { addToken(Token.PREPROCESSOR);
+          }
+        case 23: break;
+        case 2: 
+          { addNullToken(); return firstToken;
+          }
+        case 24: break;
+        case 21: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 25: break;
+        case 18: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 26: break;
+        case 4: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 27: break;
+        case 14: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+          }
+        case 28: break;
+        case 9: 
+          { start = zzMarkedPos-1; yybegin(CHAR);
+          }
+        case 29: break;
+        case 7: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 30: break;
+        case 19: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 31: break;
+        case 6: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 32: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+          }
+        case 33: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 34: break;
+        case 22: 
+          { addToken(Token.FUNCTION);
+          }
+        case 35: break;
+        case 12: 
+          { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+          }
+        case 36: break;
+        case 17: 
+          { addToken(Token.COMMENT_EOL);
+          }
+        case 37: break;
+        case 8: 
+          { start = zzMarkedPos-1; yybegin(STRING);
+          }
+        case 38: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 39: break;
+        case 5: 
+          { addToken(Token.OPERATOR);
+          }
+        case 40: break;
+        case 13: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 41: break;
+        case 10: 
+          { addToken(Token.ERROR_IDENTIFIER); addNullToken(); return firstToken;
+          }
+        case 42: break;
+        case 11: 
+          { 
+          }
+        case 43: break;
+        case 16: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 44: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case STRING: {
+              addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+            }
+            case 355: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 356: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 357: break;
+            case CHAR: {
+              addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+            }
+            case 358: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex	(revision 25584)
@@ -0,0 +1,377 @@
+/*
+ * 8/19/2009
+ *
+ * ScalaTokenMaker.java - Scanner for the Scala programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Scala programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ScalaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class ScalaTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ScalaTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+
+/***** BEGIN SCALA-SPECIFIC CHANGES *********/
+Upper						= ([A-Z\$\_]) /* Plus Unicode category Lu */
+Lower						= ([a-z])     /* Plus Unicode category Ll */
+Letter						= ({Upper}|{Lower}) /*Plus Unicode categories Lo, Lt, Nl */
+Digit						= ([0-9])
+OpChar						= ([^A-Z\$\_a-z0-9\(\[\]\)\. \t\f])
+Op							= ({OpChar}+)
+IdRest						= (({Letter}|{Digit})*([\_]{Op})?)
+VarId						= ({Lower}{IdRest})
+PlainId						= ({Upper}{IdRest}|{VarId}) /*|{Op})*/
+Id							= ({PlainId}) /*({PlainId}|[\']{StringLit}[\'])*/
+
+IntegerLiteral				= ({Digit}+[Ll]?)
+HexDigit					= ({Digit}|[A-Fa-f])
+HexLiteral					= ("0x"{HexDigit}+)
+
+ExponentPart				= ([Ee][+\-]?{Digit}+)
+FloatType					= ([FfDd])
+FloatingPointLiteral		= ({Digit}+[\.]{Digit}*{ExponentPart}?{FloatType}? |
+							  [\.]{Digit}+{ExponentPart}?{FloatType}? |
+							  {Digit}+{ExponentPart}{FloatType}? |
+							  {Digit}+{ExponentPart}?{FloatType})
+
+UnclosedCharLiteral			= ([\']([\\].|[^\\\'])*[^\']?)
+CharLiteral					= ({UnclosedCharLiteral}[\'])
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+StringLiteral				= ({UnclosedStringLiteral}[\"])
+UnclosedBacktickLiteral		= ([\`][^\`]+)
+BacktickLiteral				= ({UnclosedBacktickLiteral}[\`])
+/* TODO: Multiline strings */
+
+MLCBegin					= ("/*")
+MLCEnd						= ("*/")
+LineCommentBegin			= ("//")
+
+/***** END SCALA-SPECIFIC CHANGES *********/
+
+Whitespace				= ([ \t\f]+)
+LineTerminator			= ([\n])
+Separator				= ([\(\)\{\}\[\]])
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ({Letter}|[\_]|{Digit}|[\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$]|{Letter}|{Digit})
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+	/* Keywords */
+	"abstract" |
+	"case" |
+	"catch" |
+	"class" |
+	"def" |
+	"do" |
+	"else" |
+	"extends" |
+	"false" |
+	"final" |
+	"finally" |
+	"for" |
+	"forSome" |
+	"if" |
+	"implicit" |
+	"import" |
+	"lazy" |
+	"match" |
+	"new" |
+	"null" |
+	"object" |
+	"override" |
+	"package" |
+	"private" |
+	"protected" |
+	"requires" |
+	"return" |
+	"sealed" |
+	"super" |
+	"this" |
+	"throw" |
+	"trait" |
+	"try" |
+	"true" |
+	"type" |
+	"val" |
+	"var" |
+	"while" |
+	"with" |
+	"yield" 			{ addToken(Token.RESERVED_WORD); }
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Id}						{ addToken(Token.IDENTIFIER); }
+
+	{Whitespace}					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{UnclosedCharLiteral}			{ addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+	{CharLiteral}				{ addToken(Token.LITERAL_CHAR); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedBacktickLiteral}		{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+	{BacktickLiteral}				{ addToken(Token.LITERAL_BACKQUOTE); }
+
+	/* Comment literals. */
+	{MLCBegin}					{ start = zzMarkedPos-2; yybegin(MLC); }
+	{LineCommentBegin}				{ start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+	{Separator}					{ addToken(Token.SEPARATOR); }
+
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatingPointLiteral}			{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters. */
+	.							{ addToken(Token.IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+	[^hwf\n\*]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]					{}
+
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+	{MLCEnd}					{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+	\*						{}
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+	[^hwf\n]+				{}
+	{URL}					{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+	[hwf]					{}
+	\n						{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+	<<EOF>>					{ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java	(revision 25584)
@@ -0,0 +1,965 @@
+/* The following code was generated by JFlex 1.4.1 on 8/21/09 3:31 PM */
+
+/*
+ * 8/19/2009
+ *
+ * ScalaTokenMaker.java - Scanner for the Scala programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Scala programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated ScalaTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class ScalaTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int EOL_COMMENT = 2;
+  public static final int YYINITIAL = 0;
+  public static final int MLC = 1;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\31\1\24\1\0\1\31\23\0\1\31\1\33\1\25\1\33"+
+    "\1\1\1\33\1\33\1\22\2\4\1\30\1\16\1\33\1\16\1\21"+
+    "\1\27\1\12\11\3\1\42\1\33\1\0\1\33\1\0\2\33\3\10"+
+    "\1\17\1\14\1\17\5\1\1\6\6\1\1\52\7\1\1\4\1\23"+
+    "\1\4\1\0\1\5\1\26\1\44\1\45\1\11\1\20\1\15\1\40"+
+    "\1\61\1\34\1\41\1\56\1\60\1\7\1\53\1\50\1\47\1\36"+
+    "\1\2\1\46\1\37\1\35\1\55\1\57\1\43\1\13\1\51\1\54"+
+    "\1\32\1\0\1\32\1\33\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\3\0\2\1\1\2\1\3\2\1\1\2\3\1\1\4"+
+    "\1\5\1\6\2\1\1\7\15\1\1\10\1\11\5\10"+
+    "\1\12\3\10\1\1\1\2\1\0\2\13\3\1\1\0"+
+    "\3\1\1\14\1\15\1\4\1\6\1\16\1\6\1\17"+
+    "\1\20\26\1\1\21\10\0\1\1\1\13\1\0\4\1"+
+    "\1\22\1\1\1\23\11\1\1\14\12\1\10\0\21\1"+
+    "\2\0\1\24\2\0\1\25\4\1\1\14\6\1\4\0"+
+    "\3\1";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[173];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\62\0\144\0\226\0\310\0\372\0\226\0\u012c"+
+    "\0\u015e\0\u0190\0\u01c2\0\u01f4\0\u0226\0\u0258\0\226\0\u028a"+
+    "\0\u02bc\0\u02ee\0\u0320\0\u0352\0\u0384\0\u03b6\0\u03e8\0\u041a"+
+    "\0\u044c\0\u047e\0\u04b0\0\u04e2\0\u0514\0\u0546\0\u0578\0\u05aa"+
+    "\0\u05dc\0\226\0\u060e\0\u0640\0\u0672\0\u06a4\0\u06d6\0\226"+
+    "\0\u0708\0\u073a\0\u076c\0\u079e\0\226\0\u07d0\0\226\0\u0802"+
+    "\0\u0834\0\u0866\0\u0898\0\u08ca\0\u08fc\0\u092e\0\u0960\0\310"+
+    "\0\226\0\u0992\0\u09c4\0\226\0\u09f6\0\226\0\226\0\u0a28"+
+    "\0\u0a5a\0\u0a8c\0\u0abe\0\u0af0\0\u0b22\0\u0b54\0\u0b86\0\u0bb8"+
+    "\0\u0bea\0\u0c1c\0\u0c4e\0\u0c80\0\u0cb2\0\u0ce4\0\u0d16\0\u0d48"+
+    "\0\u0d7a\0\u0dac\0\u0dde\0\u0e10\0\u0e42\0\226\0\u0e74\0\u0ea6"+
+    "\0\u0ed8\0\u0f0a\0\u0f3c\0\u0f6e\0\u0fa0\0\u0fd2\0\u1004\0\u1036"+
+    "\0\u1068\0\u109a\0\u10cc\0\u10fe\0\u1130\0\u08ca\0\u1162\0\226"+
+    "\0\u1194\0\u11c6\0\u11f8\0\u122a\0\u125c\0\u128e\0\u12c0\0\u12f2"+
+    "\0\u1324\0\u1356\0\u1388\0\u13ba\0\u13ec\0\u141e\0\u1450\0\u1482"+
+    "\0\u14b4\0\u14e6\0\u1518\0\u154a\0\u157c\0\u15ae\0\u15e0\0\u1612"+
+    "\0\u1644\0\u1676\0\u16a8\0\u16da\0\u170c\0\u173e\0\u1770\0\u17a2"+
+    "\0\u17d4\0\u1806\0\u1838\0\u186a\0\u189c\0\u18ce\0\u1900\0\u1932"+
+    "\0\u1964\0\u1996\0\u19c8\0\u19fa\0\u1a2c\0\u1a5e\0\u1a90\0\u1ac2"+
+    "\0\u1af4\0\u1b26\0\u1b58\0\u1b8a\0\u1bbc\0\u1bee\0\u1c20\0\u1c52"+
+    "\0\u1c84\0\u1cb6\0\u1ce8\0\u1d1a\0\u1d4c\0\u1d7e\0\u1db0\0\u1ac2"+
+    "\0\u1de2\0\u1b58\0\u1e14\0\u1e46\0\u1e78";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[173];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\4\2\5\1\6\1\7\2\5\1\10\1\5\1\11"+
+    "\1\12\2\5\1\13\1\4\1\5\1\14\1\15\1\16"+
+    "\1\4\1\17\1\20\1\21\1\22\1\4\1\23\1\7"+
+    "\1\4\1\5\1\24\1\25\1\26\1\27\1\30\1\4"+
+    "\1\31\1\32\1\5\1\33\1\34\1\35\1\36\1\5"+
+    "\1\37\3\5\1\40\2\5\24\41\1\42\3\41\1\43"+
+    "\3\41\1\44\3\41\1\45\2\41\1\46\16\41\24\47"+
+    "\1\50\7\47\1\51\3\47\1\52\2\47\1\53\16\47"+
+    "\63\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\6\5\1\0\17\5\3\0\1\6\2\0\2\55\2\0"+
+    "\1\6\1\0\2\56\1\0\2\57\1\60\16\0\1\57"+
+    "\22\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\6\5\1\0\1\5\1\61\15\5\1\0\3\5\1\0"+
+    "\1\54\1\5\1\62\6\5\1\0\2\5\13\0\6\5"+
+    "\1\0\1\5\1\63\15\5\3\0\1\6\2\0\2\55"+
+    "\2\0\1\6\1\64\2\56\1\0\2\57\1\60\16\0"+
+    "\1\57\22\0\3\5\1\0\1\54\1\5\1\65\3\5"+
+    "\1\66\2\5\1\0\2\5\13\0\6\5\1\0\17\5"+
+    "\1\0\3\5\1\0\1\54\7\5\1\67\1\0\2\5"+
+    "\13\0\6\5\1\0\4\5\1\70\12\5\3\0\1\60"+
+    "\6\0\1\60\47\0\22\16\1\71\1\72\36\16\23\20"+
+    "\1\73\1\20\1\74\34\20\26\75\1\0\33\75\27\0"+
+    "\1\76\1\77\62\0\1\23\31\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\1\100\5\5\1\0\3\5"+
+    "\1\101\2\5\1\102\10\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\6\5\1\0\1\5\1\103"+
+    "\1\5\1\104\13\5\1\0\3\5\1\0\1\54\7\5"+
+    "\1\105\1\0\2\5\13\0\6\5\1\0\12\5\1\106"+
+    "\4\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\5\5\1\107\1\0\1\5\1\110\2\5\1\111"+
+    "\12\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\4\5\1\70\1\5\1\0\10\5\1\112\6\5"+
+    "\1\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\1\113\4\5\1\114\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\6\5\1\0\2\5"+
+    "\1\115\14\5\1\0\3\5\1\0\1\54\7\5\1\116"+
+    "\1\0\2\5\13\0\6\5\1\0\17\5\1\0\3\5"+
+    "\1\0\1\54\10\5\1\0\2\5\13\0\6\5\1\0"+
+    "\2\5\1\117\11\5\1\120\2\5\1\0\3\5\1\0"+
+    "\1\54\7\5\1\121\1\0\2\5\13\0\6\5\1\0"+
+    "\12\5\1\122\4\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\5\5\1\123\1\0\17\5\1\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\6\5"+
+    "\1\0\1\5\1\124\15\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\6\5\1\0\1\5\1\125"+
+    "\15\5\24\41\1\0\3\41\1\0\3\41\1\0\3\41"+
+    "\1\0\2\41\1\0\16\41\27\0\1\126\67\0\1\127"+
+    "\61\0\1\130\3\0\1\131\63\0\1\132\16\0\24\47"+
+    "\1\0\7\47\1\0\3\47\1\0\2\47\1\0\16\47"+
+    "\35\0\1\133\61\0\1\134\3\0\1\135\63\0\1\136"+
+    "\16\0\1\137\3\5\1\0\1\54\10\5\1\137\2\5"+
+    "\1\0\7\137\1\0\2\137\6\5\1\137\17\5\3\0"+
+    "\1\140\6\0\1\140\3\0\1\141\46\0\1\60\6\0"+
+    "\1\60\1\0\2\56\1\0\2\57\17\0\1\57\22\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\6\5"+
+    "\1\0\11\5\1\142\5\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\6\5\1\0\1\5\1\143"+
+    "\15\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\1\5\1\144\1\5\1\145\2\5\1\0\17\5"+
+    "\3\0\1\146\4\0\3\146\1\0\2\146\1\0\2\146"+
+    "\17\0\1\146\3\0\2\146\15\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\3\5\1\145\2\5\1\0"+
+    "\17\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\1\5\1\147\4\5\1\0\17\5\1\0\3\5"+
+    "\1\0\1\54\10\5\1\0\2\5\13\0\4\5\1\70"+
+    "\1\5\1\0\17\5\24\16\1\0\35\16\24\20\1\0"+
+    "\35\20\26\75\1\150\33\75\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\5\5\1\151\1\0\3\5"+
+    "\1\152\13\5\1\0\3\5\1\0\1\54\10\5\1\0"+
+    "\2\5\13\0\6\5\1\0\1\5\1\153\4\5\1\70"+
+    "\3\5\1\145\4\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\2\5\1\145\3\5\1\0\17\5"+
+    "\1\0\3\5\1\0\1\54\3\5\1\154\4\5\1\0"+
+    "\2\5\13\0\6\5\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\5\5\1\155\1\0"+
+    "\4\5\1\156\12\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\6\5\1\0\1\5\1\157\15\5"+
+    "\1\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\2\5\1\160\3\5\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\6\5\1\0\5\5"+
+    "\1\161\11\5\1\0\3\5\1\0\1\54\1\5\1\65"+
+    "\6\5\1\0\2\5\13\0\6\5\1\0\17\5\1\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\6\5"+
+    "\1\0\3\5\1\162\13\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\2\5\1\163\3\5\1\0"+
+    "\17\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\5\5\1\164\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\1\5\1\165\4\5"+
+    "\1\0\17\5\1\0\3\5\1\0\1\54\10\5\1\0"+
+    "\2\5\13\0\3\5\1\166\2\5\1\0\17\5\1\0"+
+    "\1\5\1\167\1\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\1\5\1\170\4\5\1\0\17\5\1\0\3\5"+
+    "\1\0\1\54\10\5\1\0\2\5\13\0\6\5\1\0"+
+    "\13\5\1\171\3\5\1\0\3\5\1\0\1\54\7\5"+
+    "\1\172\1\0\2\5\13\0\6\5\1\0\17\5\1\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\6\5"+
+    "\1\0\1\70\16\5\1\0\3\5\1\0\1\54\1\5"+
+    "\1\173\6\5\1\0\2\5\13\0\6\5\1\0\17\5"+
+    "\1\0\3\5\1\0\1\54\7\5\1\174\1\0\2\5"+
+    "\13\0\6\5\1\0\17\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\1\5\1\144\4\5\1\0"+
+    "\17\5\1\0\3\5\1\0\1\54\1\5\1\70\6\5"+
+    "\1\0\2\5\13\0\6\5\1\0\3\5\1\70\13\5"+
+    "\35\0\1\175\62\0\1\176\32\0\1\177\115\0\1\200"+
+    "\53\0\1\201\62\0\1\202\32\0\1\203\115\0\1\204"+
+    "\16\0\1\137\15\0\1\137\3\0\7\137\1\0\2\137"+
+    "\6\0\1\137\22\0\1\140\6\0\1\140\4\0\2\57"+
+    "\17\0\1\57\24\0\1\140\6\0\1\140\50\0\3\5"+
+    "\1\0\1\54\10\5\1\0\2\5\13\0\6\5\1\0"+
+    "\6\5\1\70\10\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\3\5\1\151\2\5\1\0\17\5"+
+    "\1\0\3\5\1\0\1\54\3\5\1\165\4\5\1\0"+
+    "\2\5\13\0\6\5\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\7\5\1\70\1\0\2\5\13\0\6\5\1\0"+
+    "\17\5\1\0\3\5\1\0\1\54\7\5\1\205\1\0"+
+    "\2\5\13\0\6\5\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\3\5\1\70\2\5"+
+    "\1\0\17\5\1\0\3\5\1\0\1\54\10\5\1\0"+
+    "\2\5\13\0\6\5\1\0\4\5\1\121\12\5\1\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\5\5"+
+    "\1\206\1\0\17\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\6\5\1\0\15\5\1\207\1\5"+
+    "\1\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\6\5\1\0\14\5\1\210\2\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\1\5\1\211\4\5"+
+    "\1\0\17\5\1\0\3\5\1\0\1\54\1\5\1\212"+
+    "\6\5\1\0\2\5\13\0\6\5\1\0\17\5\1\0"+
+    "\3\5\1\0\1\54\7\5\1\213\1\0\2\5\13\0"+
+    "\6\5\1\0\17\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\6\5\1\0\1\5\1\214\15\5"+
+    "\1\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\6\5\1\0\7\5\1\215\7\5\1\0\3\5\1\0"+
+    "\1\54\1\5\1\216\6\5\1\0\2\5\13\0\6\5"+
+    "\1\0\4\5\1\217\12\5\1\0\3\5\1\0\1\54"+
+    "\1\5\1\145\6\5\1\0\2\5\13\0\6\5\1\0"+
+    "\17\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\1\70\5\5\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\1\5\1\220\4\5"+
+    "\1\0\17\5\1\0\3\5\1\0\1\54\10\5\1\0"+
+    "\2\5\13\0\6\5\1\0\12\5\1\221\4\5\1\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\6\5"+
+    "\1\0\12\5\1\222\4\5\1\0\3\5\1\0\1\54"+
+    "\7\5\1\223\1\0\2\5\13\0\6\5\1\0\17\5"+
+    "\1\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\6\5\1\0\3\5\1\224\13\5\1\0\3\5\1\0"+
+    "\1\54\1\5\1\70\6\5\1\0\2\5\13\0\6\5"+
+    "\1\0\17\5\1\0\3\5\1\0\1\54\1\5\1\225"+
+    "\6\5\1\0\2\5\13\0\6\5\1\0\17\5\36\0"+
+    "\1\226\65\0\1\227\34\0\1\176\65\0\1\230\76\0"+
+    "\1\231\65\0\1\232\34\0\1\202\65\0\1\233\41\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\6\5"+
+    "\1\0\5\5\1\234\11\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\1\5\1\70\4\5\1\0"+
+    "\17\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\6\5\1\0\1\5\1\235\15\5\1\0\3\5"+
+    "\1\0\1\54\10\5\1\0\2\5\13\0\6\5\1\0"+
+    "\1\5\1\236\15\5\1\0\3\5\1\0\1\54\7\5"+
+    "\1\237\1\0\2\5\13\0\6\5\1\0\17\5\1\0"+
+    "\3\5\1\0\1\54\7\5\1\225\1\0\2\5\13\0"+
+    "\6\5\1\0\17\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\6\5\1\0\3\5\1\70\13\5"+
+    "\1\0\3\5\1\0\1\54\1\5\1\240\6\5\1\0"+
+    "\2\5\13\0\6\5\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\6\5\1\0\4\5"+
+    "\1\241\12\5\1\0\3\5\1\0\1\54\10\5\1\0"+
+    "\2\5\13\0\5\5\1\242\1\0\17\5\1\0\3\5"+
+    "\1\0\1\54\10\5\1\0\2\5\13\0\6\5\1\0"+
+    "\3\5\1\206\13\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\2\5\13\0\6\5\1\0\3\5\1\243\13\5"+
+    "\1\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\5\5\1\244\1\0\17\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\6\5\1\0\3\5\1\245"+
+    "\13\5\1\0\3\5\1\0\1\54\3\5\1\206\4\5"+
+    "\1\0\2\5\13\0\6\5\1\0\17\5\1\0\3\5"+
+    "\1\0\1\54\10\5\1\0\2\5\13\0\6\5\1\0"+
+    "\3\5\1\246\13\5\1\0\3\5\1\0\1\54\10\5"+
+    "\1\0\1\5\1\70\13\0\6\5\1\0\17\5\37\0"+
+    "\1\176\2\0\1\227\46\0\1\247\33\0\3\230\1\250"+
+    "\11\230\1\250\2\230\2\250\4\0\1\230\1\250\2\0"+
+    "\1\250\6\230\1\250\17\230\37\0\1\202\2\0\1\232"+
+    "\46\0\1\251\33\0\3\233\1\252\11\233\1\252\2\233"+
+    "\2\252\4\0\1\233\1\252\2\0\1\252\6\233\1\252"+
+    "\17\233\1\0\3\5\1\0\1\54\10\5\1\0\1\5"+
+    "\1\151\13\0\6\5\1\0\17\5\1\0\3\5\1\0"+
+    "\1\54\10\5\1\0\2\5\13\0\6\5\1\0\16\5"+
+    "\1\145\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\1\5\1\145\4\5\1\0\17\5\1\0\3\5"+
+    "\1\0\1\54\3\5\1\253\4\5\1\0\2\5\13\0"+
+    "\6\5\1\0\17\5\1\0\3\5\1\0\1\54\1\5"+
+    "\1\142\6\5\1\0\2\5\13\0\6\5\1\0\17\5"+
+    "\1\0\3\5\1\0\1\54\10\5\1\0\2\5\13\0"+
+    "\6\5\1\0\10\5\1\145\6\5\1\0\3\5\1\0"+
+    "\1\54\3\5\1\153\4\5\1\0\2\5\13\0\6\5"+
+    "\1\0\17\5\1\0\3\5\1\0\1\54\10\5\1\0"+
+    "\2\5\13\0\6\5\1\0\1\5\1\223\15\5\1\0"+
+    "\3\5\1\0\1\54\10\5\1\0\2\5\13\0\6\5"+
+    "\1\0\3\5\1\254\13\5\1\0\3\5\1\0\1\54"+
+    "\10\5\1\0\2\5\13\0\6\5\1\0\5\5\1\70"+
+    "\11\5\1\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\5\5\1\255\1\0\17\5\27\0\1\230\61\0"+
+    "\1\233\33\0\3\5\1\0\1\54\10\5\1\0\2\5"+
+    "\13\0\1\5\1\212\4\5\1\0\17\5\1\0\3\5"+
+    "\1\0\1\54\7\5\1\151\1\0\2\5\13\0\6\5"+
+    "\1\0\17\5\1\0\3\5\1\0\1\54\10\5\1\0"+
+    "\1\5\1\145\13\0\6\5\1\0\17\5";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[7850];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\3\0\1\11\2\1\1\11\7\1\1\11\22\1\1\11"+
+    "\5\1\1\11\4\1\1\11\1\0\1\11\4\1\1\0"+
+    "\4\1\1\11\2\1\1\11\1\1\2\11\26\1\1\11"+
+    "\10\0\2\1\1\0\6\1\1\11\24\1\10\0\21\1"+
+    "\2\0\1\1\2\0\14\1\4\0\3\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[173];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public ScalaTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addHyperlinkToken(int, int, int)
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, false);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 * @param hyperlink Whether this token is a hyperlink.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType,
+						int startOffset, boolean hyperlink) {
+		super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = MLC;
+				start = text.offset;
+				break;
+			default:
+				state = Token.NULL;
+		}
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public ScalaTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public ScalaTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 150) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 22: break;
+        case 13: 
+          { addToken(Token.LITERAL_CHAR);
+          }
+        case 23: break;
+        case 17: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+          }
+        case 24: break;
+        case 16: 
+          { start = zzMarkedPos-2; yybegin(MLC);
+          }
+        case 25: break;
+        case 7: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 26: break;
+        case 18: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 27: break;
+        case 11: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 28: break;
+        case 12: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 29: break;
+        case 3: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 30: break;
+        case 19: 
+          { addToken(Token.LITERAL_BACKQUOTE);
+          }
+        case 31: break;
+        case 1: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 32: break;
+        case 10: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 33: break;
+        case 15: 
+          { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+          }
+        case 34: break;
+        case 4: 
+          { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+          }
+        case 35: break;
+        case 6: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 36: break;
+        case 14: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 37: break;
+        case 21: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+          }
+        case 38: break;
+        case 20: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 39: break;
+        case 2: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 40: break;
+        case 8: 
+          { 
+          }
+        case 41: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+          }
+        case 42: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case EOL_COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+            }
+            case 174: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 175: break;
+            case MLC: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+            }
+            case 176: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex	(revision 25584)
@@ -0,0 +1,404 @@
+/*
+ * 10/03/2007
+ *
+ * TclTokenMaker.java - Scanner for the Tcl programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Tcl programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated TclTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class TclTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public TclTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+Letter							= [A-Za-z]
+NonzeroDigit						= [1-9]
+Digit							= ("0"|{NonzeroDigit})
+HexDigit							= ({Digit}|[A-Fa-f])
+OctalDigit						= ([0-7])
+EscapedSourceCharacter				= ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator						= ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart					= ({Letter}|"_"|"$")
+IdentifierPart						= ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator				= (\n)
+WhiteSpace				= ([ \t\f])
+
+UnclosedStringLiteral		= ([\"]([\\].|[^\\\"])*[^\"]?)
+StringLiteral				= ({UnclosedStringLiteral}[\"])
+
+LineCommentBegin			= "#"
+
+IntegerHelper1				= (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2				= ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral				= ({IntegerHelper1}[lL]?)
+HexLiteral				= ({IntegerHelper2}[lL]?)
+FloatHelper1				= ([fFdD]?)
+FloatHelper2				= ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1				= ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2				= ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3				= ({Digit}+{FloatHelper2})
+FloatLiteral				= ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat			= (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+Separator					= ([\(\)\{\}\[\]])
+Separator2				= ([\;,.])
+
+Operator					= ("="|"!"|"+"|"-"|"*"|"/"|">"=?|"<"=?|"%"|"&"|"|"|"^"|"~")
+
+Identifier				= ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier			= ({NonSeparator}+)
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "append"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "array"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "auto_mkindex"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "concat"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "console"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "eval"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "expr"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "format"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "global"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "set"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "trace"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "unset"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "upvar"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "join"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lappend"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lindex"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "linsert"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "list"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "llength"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lrange"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lreplace"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lsearch"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lsort"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "split"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scan"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "string"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "regexp"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "regsub"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elseif"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "switch"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "foreach"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "break"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "continue"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "proc"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "source"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "unkown"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "uplevel"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cd"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "close"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "eof"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "file"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "flush"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "gets"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "glob"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "open"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "read"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "puts"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pwd"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "seek"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tell"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "catch"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "error"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exec"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pid"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "after"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "time"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exit"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "history"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "rename"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "info"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ceil"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "floor"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "round"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "incr"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "hypot"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "abs"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "acos"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cos"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cosh"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "asin"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sin"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sinh"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "atan"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "atan2"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tan"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tanh"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "log"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "log10"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "fmod"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pow"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "hypot"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sqrt"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "double"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "int"				{ addToken(Token.RESERVED_WORD); }
+
+<YYINITIAL> "bind"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "button"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "canvas"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "checkbutton"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "destroy"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "entry"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "focus"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "frame"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "grab"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "image"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "label"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "listbox"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lower"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "menu"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "menubutton"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "message"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "option"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pack"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "placer"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "radiobutton"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "raise"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scale"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scrollbar"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "selection"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "send"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "text"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tk"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tkerror"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tkwait"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "toplevel"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "update"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "winfo"				{ addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "wm"				{ addToken(Token.RESERVED_WORD); }
+
+
+<YYINITIAL> {
+
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+
+	{WhiteSpace}+					{ addToken(Token.WHITESPACE); }
+
+	/* String/Character literals. */
+	{StringLiteral}				{ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+	{UnclosedStringLiteral}			{ addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+	/* Comment literals. */
+	{LineCommentBegin}.*			{ addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+	/* Separators. */
+	{Separator}					{ addToken(Token.SEPARATOR); }
+	{Separator2}					{ addToken(Token.IDENTIFIER); }
+
+	/* Operators. */
+	{Operator}					{ addToken(Token.OPERATOR); }
+
+	/* Numbers */
+	{IntegerLiteral}				{ addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+	{HexLiteral}					{ addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+	{FloatLiteral}					{ addToken(Token.LITERAL_NUMBER_FLOAT); }
+	{ErrorNumberFormat}				{ addToken(Token.ERROR_NUMBER_FORMAT); }
+
+	{ErrorIdentifier}				{ addToken(Token.ERROR_IDENTIFIER); }
+
+	/* Ended with a line not in a string or comment. */
+	<<EOF>>						{ addNullToken(); return firstToken; }
+
+	/* Catch any other (unhandled) characters and flag them as bad. */
+	.							{ addToken(Token.ERROR_IDENTIFIER); }
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java	(revision 25584)
@@ -0,0 +1,1075 @@
+/* The following code was generated by JFlex 1.4.1 on 10/10/10 10:56 PM */
+
+/*
+ * 10/03/2007
+ *
+ * TclTokenMaker.java - Scanner for the Tcl programming language.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Tcl programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated TclTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class TclTokenMaker extends AbstractJFlexCTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int YYINITIAL = 0;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\14\1\13\1\0\1\14\1\7\22\0\1\14\1\27\1\15"+
+    "\1\10\1\1\1\27\1\27\1\7\2\24\1\27\1\22\1\25\1\22"+
+    "\1\23\1\27\1\3\1\61\1\60\5\5\2\2\1\7\1\25\1\30"+
+    "\1\26\1\30\1\7\1\0\3\4\1\20\1\21\1\20\5\1\1\17"+
+    "\13\1\1\16\2\1\1\24\1\11\1\24\1\27\1\12\1\0\1\31"+
+    "\1\54\1\46\1\35\1\33\1\52\1\53\1\56\1\44\1\55\1\43"+
+    "\1\50\1\42\1\34\1\41\1\32\1\62\1\36\1\47\1\40\1\6"+
+    "\1\51\1\57\1\45\1\37\1\1\1\24\1\27\1\24\1\27\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\1\0\1\1\1\2\2\3\1\2\1\1\1\4\1\5"+
+    "\1\6\1\7\1\10\1\2\1\11\1\2\1\10\22\2"+
+    "\1\1\1\12\1\3\1\13\1\12\1\13\1\12\1\14"+
+    "\1\12\2\2\1\7\1\15\35\2\1\16\5\2\1\16"+
+    "\40\2\1\1\1\13\1\0\2\14\5\2\1\15\25\2"+
+    "\1\16\30\2\1\16\4\2\1\16\11\2\1\1\5\2"+
+    "\2\16\6\2\1\16\15\2\1\16\3\2\1\16\1\2"+
+    "\1\1\14\2\1\1\6\2";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[241];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\63\0\146\0\231\0\314\0\377\0\u0132\0\u0165"+
+    "\0\u0132\0\u0198\0\u01cb\0\u0132\0\u01fe\0\u0132\0\u0132\0\u0231"+
+    "\0\u0264\0\u0297\0\u02ca\0\u02fd\0\u0330\0\u0363\0\u0396\0\u03c9"+
+    "\0\u03fc\0\u042f\0\u0462\0\u0495\0\u04c8\0\u04fb\0\u052e\0\u0561"+
+    "\0\u0594\0\u05c7\0\u05fa\0\u062d\0\u062d\0\u062d\0\u0660\0\u0693"+
+    "\0\u06c6\0\u06f9\0\u072c\0\u075f\0\u0792\0\u07c5\0\u0132\0\u07f8"+
+    "\0\u082b\0\u085e\0\u0891\0\u08c4\0\u08f7\0\u092a\0\u095d\0\u0990"+
+    "\0\u09c3\0\u09f6\0\u0a29\0\u0a5c\0\u0a8f\0\u0ac2\0\u0af5\0\u0b28"+
+    "\0\u0b5b\0\u0b8e\0\u0bc1\0\u0bf4\0\u0c27\0\u0c5a\0\u0c8d\0\u0cc0"+
+    "\0\u0cf3\0\u0d26\0\u0d59\0\u0d8c\0\u0dbf\0\u0df2\0\u0e25\0\u0e58"+
+    "\0\u0e8b\0\u0ebe\0\146\0\u0ef1\0\u0f24\0\u0f57\0\u0f8a\0\u0fbd"+
+    "\0\u0ff0\0\u1023\0\u1056\0\u1089\0\u10bc\0\u10ef\0\u1122\0\u1155"+
+    "\0\u1188\0\u11bb\0\u11ee\0\u1221\0\u1254\0\u1287\0\u12ba\0\u12ed"+
+    "\0\u1320\0\u1353\0\u1386\0\u13b9\0\u13ec\0\u141f\0\u1452\0\u1485"+
+    "\0\u14b8\0\u14eb\0\u151e\0\u1551\0\u1584\0\u15b7\0\u062d\0\u15ea"+
+    "\0\u161d\0\u1650\0\u1683\0\u16b6\0\u16e9\0\u01cb\0\u171c\0\u174f"+
+    "\0\u1782\0\u17b5\0\u17e8\0\u181b\0\u184e\0\u1881\0\u18b4\0\u18e7"+
+    "\0\u191a\0\u194d\0\u1980\0\u19b3\0\u19e6\0\u1a19\0\u1a4c\0\u1a7f"+
+    "\0\u1ab2\0\u1ae5\0\u1b18\0\u1b4b\0\u1b7e\0\u1bb1\0\u1be4\0\u1c17"+
+    "\0\u1c4a\0\u1c7d\0\u1cb0\0\u1ce3\0\u1d16\0\u1d49\0\u1d7c\0\u1daf"+
+    "\0\u1de2\0\u1e15\0\u1e48\0\u1e7b\0\u1eae\0\u1ee1\0\u1f14\0\u1f47"+
+    "\0\u1f7a\0\u1fad\0\u1fe0\0\u2013\0\u2046\0\u2079\0\u20ac\0\u20df"+
+    "\0\u2112\0\u2145\0\u2178\0\u21ab\0\u21de\0\u2211\0\u2244\0\u2277"+
+    "\0\u22aa\0\u22dd\0\u2310\0\u2343\0\u2376\0\u23a9\0\u23dc\0\u240f"+
+    "\0\u2442\0\u2475\0\u24a8\0\u24db\0\u250e\0\u2541\0\u2574\0\u25a7"+
+    "\0\u25da\0\u260d\0\u2640\0\u1b4b\0\u2673\0\u26a6\0\u26d9\0\u270c"+
+    "\0\u273f\0\u2772\0\u27a5\0\u27d8\0\u280b\0\u283e\0\u2871\0\u28a4"+
+    "\0\u28d7\0\u290a\0\u293d\0\u0bc1\0\u2970\0\u29a3\0\u29d6\0\u2a09"+
+    "\0\u260d\0\u2a3c\0\u2a6f\0\u2aa2\0\u2ad5\0\u2b08\0\u2b3b\0\u2b6e"+
+    "\0\u2ba1\0\u2bd4\0\u2c07\0\u2c3a\0\u2c6d\0\u2ca0\0\u2cd3\0\u2d06"+
+    "\0\u2d39";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[241];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\1\2\1\3\1\4\1\5\1\3\1\4\1\6\1\7"+
+    "\1\10\1\2\1\3\1\11\1\12\1\13\4\3\1\14"+
+    "\1\15\1\16\1\17\2\14\1\20\1\21\1\22\1\23"+
+    "\1\3\1\24\1\25\1\3\1\26\1\27\1\30\1\3"+
+    "\1\31\1\3\1\32\1\33\1\34\1\3\1\35\1\36"+
+    "\1\37\1\40\1\41\1\42\2\4\1\3\7\2\1\0"+
+    "\3\2\3\0\4\2\7\0\33\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\32\3\2\44\2\4"+
+    "\1\44\1\4\1\44\1\0\3\44\3\0\1\44\1\45"+
+    "\1\46\1\47\1\0\1\50\5\0\2\44\1\47\1\44"+
+    "\1\46\12\44\1\45\1\44\1\46\5\44\2\4\3\44"+
+    "\1\51\1\52\1\44\1\52\1\44\1\0\3\44\3\0"+
+    "\1\53\1\45\1\46\1\47\1\0\1\50\5\0\2\44"+
+    "\1\47\1\44\1\46\7\44\1\53\2\44\1\45\1\44"+
+    "\1\46\5\44\2\52\1\44\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\3\1\54\1\3"+
+    "\1\55\26\3\63\0\13\10\1\0\47\10\14\0\1\12"+
+    "\46\0\11\13\1\56\3\13\1\57\45\13\2\0\2\50"+
+    "\1\0\1\50\52\0\2\50\27\0\1\14\34\0\1\2"+
+    "\5\3\1\60\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\3\1\61\3\3\1\62\1\3\1\63\5\3"+
+    "\1\64\1\65\2\3\1\66\1\3\1\67\6\3\1\2"+
+    "\5\3\1\70\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\71\4\3\1\72\2\3\1\73\2\3\1\74"+
+    "\3\3\1\75\6\3\1\74\3\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\76"+
+    "\1\3\1\77\2\3\1\100\3\3\1\101\2\3\1\102"+
+    "\1\103\11\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\2\3\1\104\5\3\1\105\21\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\106\1\3\1\107\5\3\1\110\21\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\111\1\3\1\112\2\3\1\113\2\3\1\114\1\3"+
+    "\1\115\1\116\16\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\3\1\117\30\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\2\3\1\120\27\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\121\5\3\1\122"+
+    "\7\3\1\123\10\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\124\1\3\1\125\1\3"+
+    "\1\123\3\3\1\126\6\3\1\127\5\3\1\130\4\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\3\1\131\1\132\4\3\1\133\1\134\2\3"+
+    "\1\111\1\3\1\135\10\3\1\136\2\3\1\137\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\140\4\3\1\141\2\3\1\142\2\3\1\143\2\3"+
+    "\1\144\1\145\12\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\5\3\1\146\2\3\1\147"+
+    "\1\150\1\3\1\151\3\3\1\152\12\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\70\2\3\1\153\11\3\1\154\12\3\1\2\5\3"+
+    "\1\155\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\156\5\3\1\157\16\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\65"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\6\3\1\160\4\3\1\161\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\11\3\1\123\1\3\1\162\11\3\1\163\4\3\6\2"+
+    "\1\164\1\0\3\2\3\0\4\2\7\0\32\2\7\44"+
+    "\1\0\3\44\3\0\4\44\7\0\34\44\2\165\1\44"+
+    "\1\165\1\44\1\0\3\44\3\0\4\44\1\166\6\0"+
+    "\27\44\2\165\3\44\2\50\1\44\1\50\1\44\1\0"+
+    "\3\44\3\0\2\44\1\46\1\47\7\0\2\44\1\47"+
+    "\1\44\1\46\14\44\1\46\5\44\2\50\3\44\2\51"+
+    "\1\44\1\51\1\44\1\0\3\44\3\0\2\44\1\46"+
+    "\1\47\1\0\1\50\5\0\2\44\1\47\1\44\1\46"+
+    "\14\44\1\46\5\44\2\51\3\44\1\51\1\52\1\44"+
+    "\1\52\1\44\1\0\3\44\3\0\1\44\1\167\1\46"+
+    "\1\47\1\0\1\50\5\0\2\44\1\47\1\44\1\46"+
+    "\12\44\1\167\1\44\1\46\5\44\2\52\3\44\4\170"+
+    "\1\44\1\0\3\44\3\0\2\44\2\170\7\0\1\170"+
+    "\1\44\1\170\1\44\1\170\10\44\1\170\3\44\1\170"+
+    "\1\44\1\170\3\44\2\170\1\44\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\4\3\1\171"+
+    "\12\3\1\172\1\173\11\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\12\3\1\174\3\3"+
+    "\1\175\13\3\13\13\1\0\1\13\1\176\45\13\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\177\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\3\1\200\30\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\201\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\202\31\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\67\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\13\3\1\203\16\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\7\3"+
+    "\1\204\22\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\16\3\1\123\13\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\7\3"+
+    "\1\67\22\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\15\3\1\205\14\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\206\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\26\3\1\123\3\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\4\3"+
+    "\1\123\25\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\207\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\210"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\5\3\1\211\24\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\21\3\1\123"+
+    "\10\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\1\3\1\212\1\206\10\3\1\213\16\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\16\3\1\214\13\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\215\31\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\16\3\1\216\13\3\1\2\5\3\1\217\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\32\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\4\3"+
+    "\1\220\6\3\1\221\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\74\2\3\1\146"+
+    "\3\3\1\222\12\3\1\223\7\3\1\2\5\3\1\157"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\32\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\3\3\1\224\26\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\14\3\1\213\2\3"+
+    "\1\215\12\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\225\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\1\3\1\226"+
+    "\30\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\2\3\1\227\23\3\1\230\3\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\11\3\1\231\20\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\2\3\1\203\4\3\1\232"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\3\3\1\233\12\3\1\234\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\123\5\3\1\212\3\3\1\235\10\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\236\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\3\3\1\237\3\3\1\240\22\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\13\3\1\215\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\3\3\1\241\12\3"+
+    "\1\224\13\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\221\21\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\242\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\17\3\1\243\12\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\205\1\74\3\3\1\123\7\3\1\244\12\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\245\24\3\1\2\5\3\1\246\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\32\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\1\247"+
+    "\4\3\1\250\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\13\3\1\251\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\213\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\3\1\61\21\3\1\252"+
+    "\6\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\1\253\1\3\1\254\27\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\22\3"+
+    "\1\255\3\3\1\204\3\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\3\3\1\256\12\3"+
+    "\1\257\13\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\2\3\1\260\5\3\1\137\21\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\2\3\1\261\27\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\116\31\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\262\7\3\1\263\14\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\74"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\17\3\1\231\12\3\1\2\5\3\1\264"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\211\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\265\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\266"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\7\3\1\267\22\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\270"+
+    "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\3\3\1\74\26\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\1\3\1\271"+
+    "\30\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\16\3\1\272\13\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\273"+
+    "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\13\3\1\151\16\3\2\2\4\274\1\2"+
+    "\1\0\3\2\3\0\2\2\2\274\7\0\1\274\1\2"+
+    "\1\274\1\2\1\274\10\2\1\274\3\2\1\274\1\2"+
+    "\1\274\3\2\2\274\1\2\2\44\2\165\1\44\1\165"+
+    "\1\44\1\0\3\44\3\0\2\44\1\46\1\44\7\0"+
+    "\4\44\1\46\14\44\1\46\5\44\2\165\1\44\2\0"+
+    "\2\165\1\0\1\165\52\0\2\165\1\0\2\44\4\170"+
+    "\1\44\1\0\3\44\3\0\1\44\1\167\2\170\7\0"+
+    "\1\170\1\44\1\170\1\44\1\170\10\44\1\170\1\44"+
+    "\1\167\1\44\1\170\1\44\1\170\3\44\2\170\1\44"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\1\275\31\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\2\3\1\276\27\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\212\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\277\21\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\213\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\300\21\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+    "\1\157\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\1\301\31\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\302"+
+    "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\3\3\1\123\26\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\212"+
+    "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\12\3\1\123\17\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\15\3\1\123"+
+    "\14\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\15\3\1\204\14\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\5\3\1\301"+
+    "\24\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\10\3\1\212\21\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\5\3\1\123"+
+    "\24\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\7\3\1\123\22\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\303"+
+    "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\17\3\1\123\12\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\304"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\23\3\1\151\6\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\13\3\1\305"+
+    "\16\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\16\3\1\231\13\3\1\2\5\3\1\306"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\32\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\2\3\1\307\13\3\1\310\13\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\25\3"+
+    "\1\123\4\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\15\3\1\231\14\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\17\3"+
+    "\1\172\12\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\5\3\1\77\24\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\1\243"+
+    "\31\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\2\3\1\123\27\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\13\3\1\311"+
+    "\16\3\1\2\5\3\1\312\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\32\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\16\3\1\122\13\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\10\3\1\123\21\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\22\3\1\231\7\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\20\3\1\313\11\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\15\3\1\314\14\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\7\3\1\315\5\3\1\316\1\317\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\15\3\1\320\14\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\13\3\1\213\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\2\3\1\321\27\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\13\3\1\322\16\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\225\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\123\13\3\1\231"+
+    "\12\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\10\3\1\323\21\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\240"+
+    "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\2\3\1\215\27\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\236"+
+    "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\1\3\1\324\30\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\30\3\1\325"+
+    "\1\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\4\3\1\326\11\3\1\327\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\330\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\331\31\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\3\3"+
+    "\1\332\26\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\2\3\1\333\6\3\1\316\20\3"+
+    "\1\2\5\3\1\67\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\16\3\1\314\13\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\23\3\1\123\6\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\23\3\1\334\6\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\311\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\1\205\31\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\213\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\7\3\1\335\22\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\21\3"+
+    "\1\235\10\3\2\2\4\336\1\2\1\0\3\2\3\0"+
+    "\2\2\2\336\7\0\1\336\1\2\1\336\1\2\1\336"+
+    "\10\2\1\336\3\2\1\336\1\2\1\336\3\2\2\336"+
+    "\2\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\7\3\1\231\22\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\20\3\1\252\11\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\26\3\1\203\3\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\337\3\0\4\3\7\0\32\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\6\3"+
+    "\1\123\23\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\27\3\1\123\2\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\13\3"+
+    "\1\100\16\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\5\3\1\340\24\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+    "\1\341\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\5\3\1\203\24\3\1\2\6\3"+
+    "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\14\3"+
+    "\1\342\15\3\1\2\5\3\1\265\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\32\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\203"+
+    "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\23\3\1\343\6\3\1\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\1\67\31\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\13\3\1\344\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\213\31\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\10\3\1\151\21\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\12\3\1\341\17\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\15\3\1\345\14\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\346\26\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\17\3\1\347\12\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\17\3\1\113\12\3\1\2"+
+    "\2\3\1\123\3\3\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\2\3\1\350\27\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\2\3\1\137\27\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\23\3\1\351\6\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\5\3\1\240\24\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\22\3\1\352\7\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\1\240\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\10\3\1\210\21\3\2\2\4\353"+
+    "\1\2\1\0\3\2\3\0\2\2\2\353\7\0\1\353"+
+    "\1\2\1\353\1\2\1\353\10\2\1\353\3\2\1\353"+
+    "\1\2\1\353\3\2\2\353\2\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\11\3\1\354\20\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\10\3\1\301\21\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\1\3\1\123\30\3"+
+    "\1\2\5\3\1\155\1\0\1\2\1\43\1\3\3\0"+
+    "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\3\3\1\355\26\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\7\3\1\232\22\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\22\3\1\123\7\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\17\3\1\356\12\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\14\3\1\123\15\3\1\2"+
+    "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+    "\10\3\1\350\21\3\1\2\6\3\1\0\1\2\1\43"+
+    "\1\3\3\0\4\3\7\0\7\3\1\314\22\3\2\2"+
+    "\4\3\1\2\1\0\3\2\3\0\2\2\2\3\7\0"+
+    "\1\3\1\2\1\3\1\2\1\3\10\2\1\3\3\2"+
+    "\1\3\1\2\1\3\3\2\2\3\2\2\6\3\1\0"+
+    "\1\2\1\43\1\3\3\0\4\3\7\0\12\3\1\357"+
+    "\17\3\1\2\5\3\1\231\1\0\1\2\1\43\1\3"+
+    "\3\0\4\3\7\0\32\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\23\3\1\173\6\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\13\3\1\360\16\3\1\2\6\3\1\0\1\2"+
+    "\1\43\1\3\3\0\4\3\7\0\3\3\1\361\26\3"+
+    "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+    "\7\0\4\3\1\326\25\3";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[11628];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\1\0\5\1\1\11\1\1\1\11\2\1\1\11\1\1"+
+    "\2\11\37\1\1\11\106\1\1\0\173\1";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[241];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public TclTokenMaker() {
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "//", null };
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 * @exception   IOException  if any I/O-Error occurs.
+	 */
+	private boolean zzRefill() throws java.io.IOException {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public TclTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public TclTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 160) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 14: 
+          { addToken(Token.RESERVED_WORD);
+          }
+        case 15: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 16: break;
+        case 13: 
+          { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+          }
+        case 17: break;
+        case 11: 
+          { addToken(Token.LITERAL_NUMBER_FLOAT);
+          }
+        case 18: break;
+        case 4: 
+          { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+          }
+        case 19: break;
+        case 6: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 20: break;
+        case 10: 
+          { addToken(Token.ERROR_NUMBER_FORMAT);
+          }
+        case 21: break;
+        case 1: 
+          { addToken(Token.ERROR_IDENTIFIER);
+          }
+        case 22: break;
+        case 12: 
+          { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+          }
+        case 23: break;
+        case 8: 
+          { addToken(Token.OPERATOR);
+          }
+        case 24: break;
+        case 3: 
+          { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+          }
+        case 25: break;
+        case 7: 
+          { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+          }
+        case 26: break;
+        case 5: 
+          { addNullToken(); return firstToken;
+          }
+        case 27: break;
+        case 9: 
+          { addToken(Token.SEPARATOR);
+          }
+        case 28: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 242: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java	(revision 25584)
@@ -0,0 +1,1113 @@
+/*
+ * 03/16/2004
+ *
+ * UnixShellTokenMaker.java - Scanner for UNIX shell scripts.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A token maker that turns text into a linked list of <code>Token</code>s
+ * for syntax highlighting UNIX shell scripts.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class UnixShellTokenMaker extends AbstractTokenMaker {
+
+	protected final String operators = "=|><&";
+	protected final String separators = "()[]";
+	protected final String separators2 = ".,;";			// Characters you don't want syntax highlighted but separate identifiers.
+	protected final String shellVariables = "#-?$!*@_";	// Characters that are part of "$<char>" shell variables; e.g., "$_".
+
+
+	private int currentTokenStart;
+	private int currentTokenType;
+
+
+	/**
+	 * Constructor.
+	 */
+	public UnixShellTokenMaker() {
+		super();	// Initializes tokensToHighlight.
+	}
+
+
+	/**
+	 * Checks the token to give it the exact ID it deserves before
+	 * being passed up to the super method.
+	 *
+	 * @param segment <code>Segment</code> to get text from.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which the token occurs.
+	 */
+	public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
+
+		switch (tokenType) {
+			// Since reserved words, functions, and data types are all passed into here
+			// as "identifiers," we have to see what the token really is...
+			case Token.IDENTIFIER:
+				int value = wordsToHighlight.get(segment, start,end);
+				if (value!=-1)
+					tokenType = value;
+				break;
+			case Token.WHITESPACE:
+			case Token.SEPARATOR:
+			case Token.OPERATOR:
+			case Token.LITERAL_NUMBER_DECIMAL_INT:
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+			case Token.LITERAL_CHAR:
+			case Token.LITERAL_BACKQUOTE:
+			case Token.COMMENT_EOL:
+			case Token.PREPROCESSOR:
+			case Token.VARIABLE:
+				break;
+
+			default:
+				new Exception("Unknown tokenType: '" + tokenType + "'").
+													printStackTrace();
+				tokenType = Token.IDENTIFIER;
+				break;
+
+		}
+
+		super.addToken(segment, start, end, tokenType, startOffset);
+
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "#", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the words to highlight for UNIX shell scripts.
+	 *
+	 * @return A <code>TokenMap</code> containing the words to highlight for
+	 *         UNIX shell scripts.
+	 * @see org.fife.ui.rsyntaxtextarea.AbstractTokenMaker#getWordsToHighlight
+	 */
+	public TokenMap getWordsToHighlight() {
+
+		TokenMap tokenMap = new TokenMap();
+
+		int reservedWord = Token.RESERVED_WORD;
+		tokenMap.put("case",				reservedWord);
+		tokenMap.put("do",				reservedWord);
+		tokenMap.put("done",				reservedWord);
+		tokenMap.put("elif",				reservedWord);
+		tokenMap.put("else",				reservedWord);
+		tokenMap.put("esac",				reservedWord);
+		tokenMap.put("fi",				reservedWord);
+		tokenMap.put("for",				reservedWord);
+		tokenMap.put("if",				reservedWord);
+		tokenMap.put("in",				reservedWord);
+		tokenMap.put("select",			reservedWord);
+		tokenMap.put("then",				reservedWord);
+		tokenMap.put("until",			reservedWord);
+		tokenMap.put("while",			reservedWord);
+
+		int function = Token.FUNCTION;
+		tokenMap.put("addbib",			function);
+		tokenMap.put("admin",			function);
+		tokenMap.put("alias",			function);
+		tokenMap.put("apropos",			function);
+		tokenMap.put("ar",			function);
+		tokenMap.put("at",				function);
+		tokenMap.put("awk",			function);
+		tokenMap.put("banner",			function);
+		tokenMap.put("basename",			function);
+		tokenMap.put("batch",			function);
+		tokenMap.put("bg",			function);
+		tokenMap.put("biff",			function);
+		tokenMap.put("bin-mail",			function);
+		tokenMap.put("binmail",			function);
+		tokenMap.put("break",			function);
+		tokenMap.put("cal",			function);
+		tokenMap.put("calendar",			function);
+		tokenMap.put("cancel",			function);
+		tokenMap.put("cat",			function);
+		tokenMap.put("cb",			function);
+		tokenMap.put("cc",			function);
+		tokenMap.put("cd",			function);
+		tokenMap.put("cdc",			function);
+		tokenMap.put("chdir",			function);
+		tokenMap.put("checkeq",		function);
+		tokenMap.put("checknr",			function);
+		tokenMap.put("chfn",			function);
+		tokenMap.put("chgrp",			function);
+		tokenMap.put("chmod",			function);
+		tokenMap.put("chown",			function);
+		tokenMap.put("chsh",			function);
+		tokenMap.put("clear",			function);
+		tokenMap.put("cmp",			function);
+		tokenMap.put("colcrt",			function);
+		tokenMap.put("comb",			function);
+		tokenMap.put("comm",			function);
+		tokenMap.put("command",			function);
+		tokenMap.put("compress",			function);
+		tokenMap.put("continue",			function);
+		tokenMap.put("cp",			function);
+		tokenMap.put("cpio",			function);
+		tokenMap.put("cpp",			function);
+		tokenMap.put("crontab",			function);
+		tokenMap.put("csh",			function);
+		tokenMap.put("ctags",			function);
+		tokenMap.put("cut", 		function);
+		tokenMap.put("cvs",			function);
+		tokenMap.put("date",			function);
+		tokenMap.put("dbx",			function);
+		tokenMap.put("delta",			function);
+		tokenMap.put("deroff",			function);
+		tokenMap.put("df",			function);
+		tokenMap.put("diff",			function);
+		tokenMap.put("dtree",			function);
+		tokenMap.put("du",			function);
+		tokenMap.put("e",			function);
+		tokenMap.put("echo",			function);
+		tokenMap.put("ed",			function);
+		tokenMap.put("edit",			function);
+		tokenMap.put("enscript",		function);
+		tokenMap.put("eqn",			function);
+		tokenMap.put("error",		function);
+		tokenMap.put("eval",		function);
+		tokenMap.put("ex",			function);
+		tokenMap.put("exec",			function);
+		tokenMap.put("exit",			function);
+		tokenMap.put("expand",		function);
+		tokenMap.put("export",		function);
+		tokenMap.put("expr",			function);
+		tokenMap.put("false",			function);
+		tokenMap.put("fc",			function);
+		tokenMap.put("fg",			function);
+		tokenMap.put("file",			function);
+		tokenMap.put("find",			function);
+		tokenMap.put("finger",			function);
+		tokenMap.put("fmt",			function);
+		tokenMap.put("fmt_mail",			function);
+		tokenMap.put("fold",			function);
+		tokenMap.put("ftp",			function);
+		tokenMap.put("function",		function);
+		tokenMap.put("gcore",			function);
+		tokenMap.put("get",			function);
+		tokenMap.put("getopts",			function);
+		tokenMap.put("gprof",			function);
+		tokenMap.put("grep",			function);
+		tokenMap.put("groups",			function);
+		tokenMap.put("gunzip",			function);
+		tokenMap.put("gzip",			function);
+		tokenMap.put("hashcheck",			function);
+		tokenMap.put("hashmake",			function);
+		tokenMap.put("head",			function);
+		tokenMap.put("help",			function);
+		tokenMap.put("history",			function);
+		tokenMap.put("imake",			function);
+		tokenMap.put("indent",			function);
+		tokenMap.put("install",			function);
+		tokenMap.put("jobs",			function);
+		tokenMap.put("join",			function);
+		tokenMap.put("kill",			function);
+		tokenMap.put("last",			function);
+		tokenMap.put("ld",			function);
+		tokenMap.put("leave",			function);
+		tokenMap.put("less",			function);
+		tokenMap.put("let",			function);
+		tokenMap.put("lex",			function);
+		tokenMap.put("lint",			function);
+		tokenMap.put("ln",			function);
+		tokenMap.put("login",			function);
+		tokenMap.put("look",			function);
+		tokenMap.put("lookbib",			function);
+		tokenMap.put("lorder",			function);
+		tokenMap.put("lp",			function);
+		tokenMap.put("lpq",			function);
+		tokenMap.put("lpr",			function);
+		tokenMap.put("lprm",			function);
+		tokenMap.put("ls",			function);
+		tokenMap.put("mail",			function);
+		tokenMap.put("Mail",			function);
+		tokenMap.put("make",			function);
+		tokenMap.put("man",			function);
+		tokenMap.put("md",			function);
+		tokenMap.put("mesg",			function);
+		tokenMap.put("mkdir",		function);
+		tokenMap.put("mkstr",			function);
+		tokenMap.put("more",			function);
+		tokenMap.put("mount",			function);
+		tokenMap.put("mv",			function);
+		tokenMap.put("nawk",			function);
+		tokenMap.put("neqn",			function);
+		tokenMap.put("nice",			function);
+		tokenMap.put("nm",			function);
+		tokenMap.put("nroff",			function);
+		tokenMap.put("od",			function);
+		tokenMap.put("page",			function);
+		tokenMap.put("passwd",			function);
+		tokenMap.put("paste",			function);
+		tokenMap.put("pr",			function);
+		tokenMap.put("print",		function);
+		tokenMap.put("printf",		function);
+		tokenMap.put("printenv",			function);
+		tokenMap.put("prof",			function);
+		tokenMap.put("prs",			function);
+		tokenMap.put("prt",			function);
+		tokenMap.put("ps",			function);
+		tokenMap.put("ptx",			function);
+		tokenMap.put("pwd",			function);
+		tokenMap.put("quota",			function);
+		tokenMap.put("ranlib",			function);
+		tokenMap.put("rcp",			function);
+		tokenMap.put("rcs",			function);
+		tokenMap.put("rcsdiff",			function);
+		tokenMap.put("read",			function);
+		tokenMap.put("readonly",			function);
+		tokenMap.put("red",			function);
+		tokenMap.put("return",		function);
+		tokenMap.put("rev",			function);
+		tokenMap.put("rlogin",			function);
+		tokenMap.put("rm",			function);
+		tokenMap.put("rmdel",			function);
+		tokenMap.put("rmdir",			function);
+		tokenMap.put("roffbib",			function);
+		tokenMap.put("rsh",			function);
+		tokenMap.put("rup",			function);
+		tokenMap.put("ruptime",			function);
+		tokenMap.put("rusers",			function);
+		tokenMap.put("rwall",			function);
+		tokenMap.put("rwho",			function);
+		tokenMap.put("sact",			function);
+		tokenMap.put("sccs",			function);
+		tokenMap.put("sccsdiff",			function);
+		tokenMap.put("script",			function);
+		tokenMap.put("sed",			function);
+		tokenMap.put("set",			function);
+		tokenMap.put("setgroups",			function);
+		tokenMap.put("setsenv",			function);
+		tokenMap.put("sh",			function);
+		tokenMap.put("shift",		function);
+		tokenMap.put("size",			function);
+		tokenMap.put("sleep",			function);
+		tokenMap.put("sort",			function);
+		tokenMap.put("sortbib",			function);
+		tokenMap.put("spell",		function);
+		tokenMap.put("split",			function);
+		tokenMap.put("ssh",				function);
+		tokenMap.put("strings",			function);
+		tokenMap.put("strip",			function);
+		tokenMap.put("stty",			function);
+		tokenMap.put("su",			function);
+		tokenMap.put("sudo",			function);
+		tokenMap.put("symorder",			function);
+		tokenMap.put("tabs",			function);
+		tokenMap.put("tail",			function);
+		tokenMap.put("talk",			function);
+		tokenMap.put("tar",			function);
+		tokenMap.put("tbl",			function);
+		tokenMap.put("tee",			function);
+		tokenMap.put("telnet",			function);
+		tokenMap.put("test",			function);
+		tokenMap.put("tftp",			function);
+		tokenMap.put("time",			function);
+		tokenMap.put("times",			function);
+		tokenMap.put("touch",			function);
+		tokenMap.put("trap",			function);
+		tokenMap.put("troff",			function);
+		tokenMap.put("true",			function);
+		tokenMap.put("tsort",			function);
+		tokenMap.put("tty",			function);
+		tokenMap.put("type",			function);
+		tokenMap.put("typeset",		function);
+		tokenMap.put("ue",			function);
+		tokenMap.put("ul",			function);
+		tokenMap.put("ulimit",			function);
+		tokenMap.put("umask",		function);
+		tokenMap.put("unalias",			function);
+		tokenMap.put("uncompress",			function);
+		tokenMap.put("unexpand",		function);
+		tokenMap.put("unget",			function);
+		tokenMap.put("unifdef",			function);
+		tokenMap.put("uniq",			function);
+		tokenMap.put("units",			function);
+		tokenMap.put("unset",			function);
+		tokenMap.put("uptime",			function);
+		tokenMap.put("users",			function);
+		tokenMap.put("uucp",			function);
+		tokenMap.put("uudecode",			function);
+		tokenMap.put("uuencode",			function);
+		tokenMap.put("uulog",			function);
+		tokenMap.put("uuname",			function);
+		tokenMap.put("uusend",			function);
+		tokenMap.put("uux",			function);
+		tokenMap.put("vacation",			function);
+		tokenMap.put("val",			function);
+		tokenMap.put("vedit",			function);
+		tokenMap.put("vgrind",			function);
+		tokenMap.put("vi",			function);
+		tokenMap.put("view",			function);
+		tokenMap.put("vtroff",			function);
+		tokenMap.put("w",			function);
+		tokenMap.put("wait",			function);
+		tokenMap.put("wall",			function);
+		tokenMap.put("wc",			function);
+		tokenMap.put("wait",			function);
+		tokenMap.put("what",			function);
+		tokenMap.put("whatis",			function);
+		tokenMap.put("whence",			function);
+		tokenMap.put("whereis",			function);
+		tokenMap.put("which",			function);
+		tokenMap.put("who",			function);
+		tokenMap.put("whoami",			function);
+		tokenMap.put("write",			function);
+		tokenMap.put("xargs",			function);
+		tokenMap.put("xstr",			function);
+		tokenMap.put("yacc",			function);
+		tokenMap.put("yes",			function);
+		tokenMap.put("zcat",			function);
+
+		return tokenMap;
+
+	}
+
+
+	/**
+	 * Returns a list of tokens representing the given text.
+	 *
+	 * @param text The text to break into tokens.
+	 * @param startTokenType The token with which to start tokenizing.
+	 * @param startOffset The offset at which the line of tokens begins.
+	 * @return A linked list of tokens representing <code>text</code>.
+	 */
+	public Token getTokenList(Segment text, int startTokenType, final int startOffset) {
+
+		resetTokenList();
+
+		char[] array = text.array;
+		int offset = text.offset;
+		int count = text.count;
+		int end = offset + count;
+
+		// See, when we find a token, its starting position is always of the form:
+		// 'startOffset + (currentTokenStart-offset)'; but since startOffset and
+		// offset are constant, tokens' starting positions become:
+		// 'newStartOffset+currentTokenStart' for one less subraction operation.
+		int newStartOffset = startOffset - offset;
+
+		currentTokenStart = offset;
+		currentTokenType  = startTokenType;
+		boolean backslash = false;
+
+//beginning:
+		for (int i=offset; i<end; i++) {
+
+			char c = array[i];
+
+			switch (currentTokenType) {
+
+				case Token.NULL:
+
+					currentTokenStart = i;	// Starting a new token here.
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '`':
+							if (backslash) { // Escaped back quote => call '`' an identifier..
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.LITERAL_BACKQUOTE;
+							}
+							break;
+
+						case '"':
+							if (backslash) { // Escaped double quote => call '"' an identifier..
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							}
+							break;
+
+						case '\'':
+							if (backslash) { // Escaped single quote => call '\'' an identifier.
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.LITERAL_CHAR;
+							}
+							break;
+
+						case '\\':
+							addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+							backslash = !backslash;
+							break;
+
+						case '$':
+							if (backslash) { // Escaped dollar sign => call '$' an identifier..
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								backslash = false;
+							}
+							else {
+								currentTokenType = Token.VARIABLE;
+							}
+							break;
+
+						case '#':
+							backslash = false;
+							currentTokenType = Token.COMMENT_EOL;
+							break;
+
+						default:
+							if (RSyntaxUtilities.isDigit(c)) {
+								currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
+								break;
+							}
+							else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.SEPARATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.WHITESPACE:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							break;	// Still whitespace.
+
+						case '\\':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							backslash = true; // Previous char whitespace => this must be first backslash.
+							break;
+
+						case '`': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_BACKQUOTE;
+							backslash = false;
+							break;
+
+						case '"': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							backslash = false;
+							break;
+
+						case '\'': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_CHAR;
+							backslash = false;
+							break;
+						
+						case '$': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							backslash = false;
+							break;
+
+						case '#':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.COMMENT_EOL;
+							break;
+
+						default:	// Add the whitespace token and start anew.
+
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+
+							if (RSyntaxUtilities.isDigit(c)) {
+								currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
+								break;
+							}
+							else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				default: // Should never happen
+				case Token.IDENTIFIER:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '/': // Special-case to colorize commands like "echo" in "/bin/echo"
+							addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i+1;
+							currentTokenType = Token.NULL;
+							break;
+
+						case '`': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_BACKQUOTE;
+							backslash = false;
+							break;
+
+						case '"': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							backslash = false;
+							break;
+
+						case '\'': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_CHAR;
+							backslash = false;
+							break;
+
+						case '\\':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							backslash = true;
+							break;
+
+						case '$': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							backslash = false;
+							break;
+						
+						case '=': // Special case here; when you have "identifier=<value>" in shell, "identifier" is a variable.
+							addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						default:
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='/' || c=='_') {
+								break;	// Still an identifier of some type.
+							}
+							int indexOf = operators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							// Otherwise, we're still an identifier (?).
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.LITERAL_NUMBER_DECIMAL_INT:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '`': // Don't need to worry about backslashes as previous char is space.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_BACKQUOTE;
+							backslash = false;
+							break;
+
+						case '"': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+							backslash = false;
+							break;
+
+						case '\'': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.LITERAL_CHAR;
+							backslash = false;
+							break;
+
+						case '$': // Don't need to worry about backslashes as previous char is non-backslash.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							backslash = false;
+							break;
+
+						case '\\':
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							backslash = true;
+							break;
+
+						default:
+
+							if (RSyntaxUtilities.isDigit(c)) {
+								break;	// Still a literal number.
+							}
+							int indexOf = operators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							indexOf = separators2.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+
+							// Otherwise, remember this was a number and start over.
+							addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+							i--;
+							currentTokenType = Token.NULL;
+
+					} // End of switch (c).
+
+					break;
+				
+				case Token.VARIABLE:
+
+					// Note that we first arrive here AFTER the '$' character.
+					// First check if the variable name is enclosed in '{' and '}' characters.
+					if (c=='{') {
+						while (++i<end) {
+							if (array[i]=='}') {
+								addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+						} // End of while (++i<end).
+						if (i==end) { // Happens when '}' wasn't found...
+							addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+						}
+						break;
+					} // End of if (i<end-1 && array[i+1]=='{').
+
+					// If we didn't find the '{' character, find the end of the variable...
+					while (i<end) {
+						c = array[i];	// Not needed the first iteration, but can't think of a better way to do it...
+						if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+							addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+							i--;
+							currentTokenType = Token.NULL;
+							break;
+						}
+						i++;
+					}
+								
+					// This only happens if we never found the end of the variable in the loop above.
+					if (i==end) {
+						addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+						currentTokenType = Token.NULL;
+					}
+								
+					break;
+
+				case Token.COMMENT_EOL:
+					// If we got here, then the line != "#" only, so check for "#!".
+					if (c=='!')
+						currentTokenType = Token.PREPROCESSOR;
+					i = end - 1;
+					addToken(text, currentTokenStart,i, currentTokenType, newStartOffset+currentTokenStart);
+					// We need to set token type to null so at the bottom we don't add one more token.
+					currentTokenType = Token.NULL;
+					
+					break;
+
+				case Token.LITERAL_CHAR:
+
+						if (c=='\\') {
+							backslash = !backslash; // Okay because if we got in here, backslash was initially false.
+						}
+						else {
+							if (c=='\'' && !backslash) {
+								addToken(text, currentTokenStart,i, Token.LITERAL_CHAR, newStartOffset+currentTokenStart);
+								currentTokenStart = i + 1;
+								currentTokenType = Token.NULL;
+								// backslash is definitely false when we leave.
+							}
+
+							backslash = false; // Need to set backslash to false here as a character was typed.
+
+						}
+						// Otherwise, we're still an unclosed char literal...
+
+						break;
+
+				case Token.LITERAL_BACKQUOTE:
+
+						switch (c) {
+								
+							case '\\':
+								backslash = !backslash;
+								break;
+								
+							case '`':
+								if (!backslash) {
+									addToken(text, currentTokenStart,i, Token.LITERAL_BACKQUOTE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+									// backslash is definitely false when we leave.
+									break;
+								}
+								backslash = false;
+								break;
+							
+							// Variable in the backquote string...
+							case '$':
+
+								if (backslash==true) {
+									backslash = false;
+									break;
+								}
+							
+								// Add the string up-to the variable.
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_BACKQUOTE, newStartOffset+currentTokenStart);
+								currentTokenType = Token.VARIABLE;
+								currentTokenStart = i;
+								
+								// First check if the variable name is enclosed in '{' and '}' characters.
+								if (i<end-1 && array[i+1]=='{') {
+									i++; // Now we're on the '{' char.
+									while (++i<end) {
+										if (array[i]=='}') {
+											addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+											i++;
+											if (i<end) {
+												c = array[i];
+												if (c=='`') { // The only rub - back quote right after variable.
+													addToken(text, i,i, Token.LITERAL_BACKQUOTE, newStartOffset+i);
+													currentTokenType = Token.NULL;
+													break;
+												}
+												else { // Continue on with the string.
+													currentTokenStart = i;
+													currentTokenType = Token.LITERAL_BACKQUOTE;
+													i--;
+													break;
+												}
+											}
+											else { // i==end = "trick" this method so that the string is continued to the next line.
+												currentTokenStart = i;
+												currentTokenType = Token.LITERAL_BACKQUOTE;
+												break; // So we don't hit the condition below.
+											}
+										} // End of if (array[i]=='}').
+									} // End of while (++i<end).
+									if (i==end) { // Happens when '}' wasn't found...
+										addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										currentTokenStart = end; // ???
+										currentTokenType = Token.LITERAL_BACKQUOTE;
+										break;
+									}
+								} // End of if (i<end-1 && array[i+1]=='{').
+								
+								// If we reached the end of the variable, get out.
+								if (currentTokenType==Token.NULL || currentTokenType==Token.LITERAL_BACKQUOTE)
+									break;
+
+								// If we didn't find the '{' character, find the end of the variable...
+								// Increment first to skip the '$'.
+								while (++i<end) {
+									c = array[i];
+									if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+										addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										if (c=='`') { // The only rub.
+											addToken(text, i,i, Token.LITERAL_BACKQUOTE, newStartOffset+i);
+											currentTokenType = Token.NULL;
+											break;
+										}
+										else {
+											currentTokenStart = i;
+											currentTokenType = Token.LITERAL_BACKQUOTE;
+											i--;
+											break;
+										}
+									}
+								}
+								
+								// This only happens if we never found the end of the variable in the loop above.
+								// We "trick" this method so that the backquote string token is at the end.
+								if (i==end) {
+									addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenStart = i;
+									currentTokenType = Token.LITERAL_BACKQUOTE;
+								}
+								
+								break;
+								
+							// Otherwise, we're still in an unclosed string...
+							default:
+								backslash = false; // Need to set backslash to false here as a character was typed.
+
+						} // End of switch (c).
+				
+						break;
+
+				case Token.LITERAL_STRING_DOUBLE_QUOTE:
+				
+						switch (c) {
+								
+							case '\\':
+								backslash = !backslash;
+								break;
+								
+							case '"':
+								if (!backslash) {
+									addToken(text, currentTokenStart,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+									// backslash is definitely false when we leave.
+									break;
+								}
+								backslash = false;
+								break;
+							
+							// Variable in the double-quoted string...
+							case '$':
+							
+								if (backslash==true) {
+									backslash = false;
+									break;
+								}
+							
+								// Add the string up-to the variable.
+								addToken(text, currentTokenStart,i-1, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+								currentTokenType = Token.VARIABLE;
+								currentTokenStart = i;
+								
+								// First check if the variable name is enclosed in '{' and '}' characters.
+								if (i<end-1 && array[i+1]=='{') {
+									i++; // Now we're on the '{' char.
+									while (++i<end) {
+										if (array[i]=='}') {
+											addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+											i++;
+											if (i<end) {
+												c = array[i];
+												if (c=='"') { // The only rub - double-quote right after variable.
+													addToken(text, i,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+i);
+													currentTokenType = Token.NULL;
+													break;
+												}
+												else { // Continue on with the string.
+													currentTokenStart = i;
+													currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+													i--;
+													break;
+												}
+											}
+											else { // i==end = "trick" this method so that the string is continued to the next line.
+												currentTokenStart = i;
+												currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+												break; // So we don't hit the condition below.
+											}
+										} // End of if (array[i]=='}').
+									} // End of while (++i<end).
+									if (i==end) { // Happens when '}' wasn't found...
+										addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										currentTokenStart = end; // ???
+										currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+										break;
+									}
+								} // End of if (i<end-1 && array[i+1]=='{').
+								
+								// If we reached the end of the variable, get out.
+								if (currentTokenType==Token.NULL || currentTokenType==Token.LITERAL_STRING_DOUBLE_QUOTE)
+									break;
+
+								// If we didn't find the '{' character, find the end of the variable...
+								// Increment first to skip the '$'.
+								while (++i<end) {
+									c = array[i];
+									if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+										addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+										if (c=='"') { // The only rub.
+											addToken(text, i,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+i);
+											currentTokenType = Token.NULL;
+											break;
+										}
+										else {
+											currentTokenStart = i;
+											currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+											i--;
+											break;
+										}
+									}
+								}
+								
+								// This only happens if we never found the end of the variable in the loop above.
+								// We "trick" this method so that the double-quote string token is at the end.
+								if (i==end) {
+									addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenStart = i;
+									currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+								}
+								
+								break;
+								
+							// Otherwise, we're still in an unclosed string...
+							default:
+								backslash = false; // Need to set backslash to false here as a character was typed.
+
+						} // End of switch (c).
+				
+						break;
+
+			} // End of switch (currentTokenType).
+
+		} // End of for (int i=offset; i<end; i++).
+
+		switch (currentTokenType) {
+
+			// Remember what token type to begin the next line with.
+			case Token.LITERAL_BACKQUOTE:
+			case Token.LITERAL_STRING_DOUBLE_QUOTE:
+			case Token.LITERAL_CHAR:
+						addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+						break;
+
+			// Do nothing if everything was okay.
+			case Token.NULL:
+						addNullToken();
+						break;
+
+			// All other token types don't continue to the next line...
+			default:
+						addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+						addNullToken();
+
+		}
+
+		// Return the first token in our linked list.
+		return firstToken;
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java	(revision 25584)
@@ -0,0 +1,603 @@
+/*
+ * 03/07/2004
+ *
+ * WindowsBatchTokenMaker.java - Scanner for Windows batch files.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A token maker that turns text into a linked list of
+ * <code>Token</code>s for syntax highlighting Microsoft
+ * Windows batch files.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class WindowsBatchTokenMaker extends AbstractTokenMaker {
+
+	protected final String operators = "@:*<>=?";
+
+	private int currentTokenStart;
+	private int currentTokenType;
+
+	private boolean bracketVariable;			// Whether a variable is of the format %{...}
+
+
+	/**
+	 * Constructor.
+	 */
+	public WindowsBatchTokenMaker() {
+		super();	// Initializes tokensToHighlight.
+	}
+
+
+	/**
+	 * Checks the token to give it the exact ID it deserves before
+	 * being passed up to the super method.
+	 *
+	 * @param segment <code>Segment</code> to get text from.
+	 * @param start Start offset in <code>segment</code> of token.
+	 * @param end End offset in <code>segment</code> of token.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which the token occurs.
+	 */
+	public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
+
+		switch (tokenType) {
+			// Since reserved words, functions, and data types are all passed
+			// into here as "identifiers," we have to see what the token
+			// really is...
+			case Token.IDENTIFIER:
+				int value = wordsToHighlight.get(segment, start,end);
+				if (value!=-1)
+					tokenType = value;
+				break;
+		}
+
+		super.addToken(segment, start, end, tokenType, startOffset);
+
+	}
+
+
+	/**
+	 * Returns the text to place at the beginning and end of a
+	 * line to "comment" it in a this programming language.
+	 *
+	 * @return The start and end strings to add to a line to "comment"
+	 *         it out.
+	 */
+	public String[] getLineCommentStartAndEnd() {
+		return new String[] { "rem ", null };
+	}
+
+
+	/**
+	 * Returns whether tokens of the specified type should have "mark
+	 * occurrences" enabled for the current programming language.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return type==Token.IDENTIFIER || type==Token.VARIABLE;
+	}
+
+
+	/**
+	 * Returns the words to highlight for Windows batch files.
+	 *
+	 * @return A <code>TokenMap</code> containing the words to highlight for
+	 *         Windows batch files.
+	 * @see org.fife.ui.rsyntaxtextarea.AbstractTokenMaker#getWordsToHighlight
+	 */
+	public TokenMap getWordsToHighlight() {
+
+		TokenMap tokenMap = new TokenMap(true); // Ignore case.
+
+		int reservedWord = Token.RESERVED_WORD;
+		tokenMap.put("call",			reservedWord);
+		tokenMap.put("choice",		reservedWord);
+		tokenMap.put("cls",			reservedWord);
+		tokenMap.put("echo",			reservedWord);
+		tokenMap.put("exit",			reservedWord);
+		tokenMap.put("goto",			reservedWord);
+		tokenMap.put("if",			reservedWord);
+		tokenMap.put("pause",		reservedWord);
+		tokenMap.put("shift",		reservedWord);
+		tokenMap.put("start",		reservedWord);
+
+		tokenMap.put("ansi.sys",		reservedWord);
+		tokenMap.put("append",		reservedWord);
+		tokenMap.put("arp",			reservedWord);
+		tokenMap.put("assign",		reservedWord);
+		tokenMap.put("assoc",		reservedWord);
+		tokenMap.put("at",			reservedWord);
+		tokenMap.put("attrib",		reservedWord);
+		tokenMap.put("break",		reservedWord);
+		tokenMap.put("cacls",		reservedWord);
+		tokenMap.put("call",			reservedWord);
+		tokenMap.put("cd",			reservedWord);
+		tokenMap.put("chcp",			reservedWord);
+		tokenMap.put("chdir",		reservedWord);
+		tokenMap.put("chkdsk",		reservedWord);
+		tokenMap.put("chknfts",		reservedWord);
+		tokenMap.put("choice",		reservedWord);
+		tokenMap.put("cls",			reservedWord);
+		tokenMap.put("cmd",			reservedWord);
+		tokenMap.put("color",		reservedWord);
+		tokenMap.put("comp",			reservedWord);
+		tokenMap.put("compact",		reservedWord);
+		tokenMap.put("control",		reservedWord);
+		tokenMap.put("convert",		reservedWord);
+		tokenMap.put("copy",			reservedWord);
+		tokenMap.put("ctty",			reservedWord);
+		tokenMap.put("date",			reservedWord);
+		tokenMap.put("debug",		reservedWord);
+		tokenMap.put("defrag",		reservedWord);
+		tokenMap.put("del",			reservedWord);
+		tokenMap.put("deltree",		reservedWord);
+		tokenMap.put("dir",			reservedWord);
+		tokenMap.put("diskcomp",		reservedWord);
+		tokenMap.put("diskcopy",		reservedWord);
+		tokenMap.put("do",				reservedWord);
+		tokenMap.put("doskey",		reservedWord);
+		tokenMap.put("dosshell",		reservedWord);
+		tokenMap.put("drivparm",		reservedWord);
+		tokenMap.put("echo",			reservedWord);
+		tokenMap.put("edit",			reservedWord);
+		tokenMap.put("edlin",		reservedWord);
+		tokenMap.put("emm386",		reservedWord);
+		tokenMap.put("erase",		reservedWord);
+		tokenMap.put("exist",		reservedWord);
+		tokenMap.put("exit",			reservedWord);
+		tokenMap.put("expand",		reservedWord);
+		tokenMap.put("extract",		reservedWord);
+		tokenMap.put("fasthelp",		reservedWord);
+		tokenMap.put("fc",			reservedWord);
+		tokenMap.put("fdisk",		reservedWord);
+		tokenMap.put("find",			reservedWord);
+		tokenMap.put("for",			reservedWord);
+		tokenMap.put("format",		reservedWord);
+		tokenMap.put("ftp",			reservedWord);
+		tokenMap.put("graftabl",		reservedWord);
+		tokenMap.put("help",			reservedWord);
+		tokenMap.put("ifshlp.sys",	reservedWord);
+		tokenMap.put("in",			reservedWord);
+		tokenMap.put("ipconfig",		reservedWord);
+		tokenMap.put("keyb",			reservedWord);
+		tokenMap.put("label",		reservedWord);
+		tokenMap.put("lh",			reservedWord);
+		tokenMap.put("loadfix",		reservedWord);
+		tokenMap.put("loadhigh",		reservedWord);
+		tokenMap.put("lock",			reservedWord);
+		tokenMap.put("md",			reservedWord);
+		tokenMap.put("mem",			reservedWord);
+		tokenMap.put("mkdir",		reservedWord);
+		tokenMap.put("mode",			reservedWord);
+		tokenMap.put("more",			reservedWord);
+		tokenMap.put("move",			reservedWord);
+		tokenMap.put("msav",			reservedWord);
+		tokenMap.put("msd",			reservedWord);
+		tokenMap.put("mscdex",		reservedWord);
+		tokenMap.put("nbtstat",		reservedWord);
+		tokenMap.put("net",			reservedWord);
+		tokenMap.put("netstat",		reservedWord);
+		tokenMap.put("nlsfunc",		reservedWord);
+		tokenMap.put("not",			reservedWord);
+		tokenMap.put("nslookup",		reservedWord);
+		tokenMap.put("path",			reservedWord);
+		tokenMap.put("pathping",		reservedWord);
+		tokenMap.put("pause",		reservedWord);
+		tokenMap.put("ping",			reservedWord);
+		tokenMap.put("power",		reservedWord);
+		tokenMap.put("print",		reservedWord);
+		tokenMap.put("prompt",		reservedWord);
+		tokenMap.put("qbasic",		reservedWord);
+		tokenMap.put("rd",			reservedWord);
+		tokenMap.put("ren",			reservedWord);
+		tokenMap.put("rename",		reservedWord);
+		tokenMap.put("rmdir",		reservedWord);
+		tokenMap.put("route",		reservedWord);
+		tokenMap.put("sc",			reservedWord);
+		tokenMap.put("scandisk",		reservedWord);
+		tokenMap.put("scandreg",		reservedWord);
+		tokenMap.put("set",			reservedWord);
+		tokenMap.put("setx",			reservedWord);
+		tokenMap.put("setver",		reservedWord);
+		tokenMap.put("share",		reservedWord);
+		tokenMap.put("shutdown",		reservedWord);
+		tokenMap.put("smartdrv",		reservedWord);
+		tokenMap.put("sort",			reservedWord);
+		tokenMap.put("subset",		reservedWord);
+		tokenMap.put("switches",		reservedWord);
+		tokenMap.put("sys",			reservedWord);
+		tokenMap.put("time",			reservedWord);
+		tokenMap.put("tracert",		reservedWord);
+		tokenMap.put("tree",			reservedWord);
+		tokenMap.put("type",			reservedWord);
+		tokenMap.put("undelete",		reservedWord);
+		tokenMap.put("unformat",		reservedWord);
+		tokenMap.put("unlock",		reservedWord);
+		tokenMap.put("ver",			reservedWord);
+		tokenMap.put("verify",		reservedWord);
+		tokenMap.put("vol",			reservedWord);
+		tokenMap.put("xcopy",		reservedWord);
+
+		return tokenMap;
+
+	}
+
+
+	/**
+	 * Returns a list of tokens representing the given text.
+	 *
+	 * @param text The text to break into tokens.
+	 * @param startTokenType The token with which to start tokenizing.
+	 * @param startOffset The offset at which the line of tokens begins.
+	 * @return A linked list of tokens representing <code>text</code>.
+	 */
+	public Token getTokenList(Segment text, int startTokenType, final int startOffset) {
+
+		resetTokenList();
+
+		char[] array = text.array;
+		int offset = text.offset;
+		int count = text.count;
+		int end = offset + count;
+
+		// See, when we find a token, its starting position is always of the form:
+		// 'startOffset + (currentTokenStart-offset)'; but since startOffset and
+		// offset are constant, tokens' starting positions become:
+		// 'newStartOffset+currentTokenStart' for one less subtraction operation.
+		int newStartOffset = startOffset - offset;
+
+		currentTokenStart = offset;
+		currentTokenType  = startTokenType;
+
+//beginning:
+		for (int i=offset; i<end; i++) {
+
+			char c = array[i];
+
+			switch (currentTokenType) {
+
+				case Token.NULL:
+
+					currentTokenStart = i;	// Starting a new token here.
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '"':
+							currentTokenType = Token.ERROR_STRING_DOUBLE;
+							break;
+
+						case '%':
+							currentTokenType = Token.VARIABLE;
+							break;
+
+						// The "separators".
+						case '(':
+						case ')':
+							addToken(text, currentTokenStart,i, Token.SEPARATOR, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+							break;
+
+						// The "separators2".
+						case ',':
+						case ';':
+							addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenType = Token.NULL;
+							break;
+
+						// Newer version of EOL comments, or a label
+						case ':':
+							// If this will be the first token added, it is
+							// a new-style comment or a label
+							if (firstToken==null) {
+								if (i<end-1 && array[i+1]==':') { // new-style comment
+									currentTokenType = Token.COMMENT_EOL;
+								}
+								else { // Label
+									currentTokenType = Token.PREPROCESSOR;
+								}
+							}
+							else { // Just a colon
+								currentTokenType = Token.IDENTIFIER;
+							}
+							break;
+
+						default:
+
+							// Just to speed things up a tad, as this will usually be the case (if spaces above failed).
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.WHITESPACE:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							break;	// Still whitespace.
+
+						case '"':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.ERROR_STRING_DOUBLE;
+							break;
+
+						case '%':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							break;
+
+						// The "separators".
+						case '(':
+						case ')':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						// The "separators2".
+						case ',':
+						case ';':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						// Newer version of EOL comments, or a label
+						case ':':
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							// If the previous (whitespace) token was the first token
+							// added, this is a new-style comment or a label
+							if (firstToken.getNextToken()==null) {
+								if (i<end-1 && array[i+1]==':') { // new-style comment
+									currentTokenType = Token.COMMENT_EOL;
+								}
+								else { // Label
+									currentTokenType = Token.PREPROCESSOR;
+								}
+							}
+							else { // Just a colon
+								currentTokenType = Token.IDENTIFIER;
+							}
+							break;
+
+						default:	// Add the whitespace token and start anew.
+
+							addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+
+							// Just to speed things up a tad, as this will usually be the case (if spaces above failed).
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+								currentTokenType = Token.IDENTIFIER;
+								break;
+							}
+
+							int indexOf = operators.indexOf(c,0);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+								currentTokenType = Token.NULL;
+								break;
+							}
+							else {
+								currentTokenType = Token.IDENTIFIER;
+							}
+
+					} // End of switch (c).
+
+					break;
+
+				default: // Should never happen
+				case Token.IDENTIFIER:
+
+					switch (c) {
+
+						case ' ':
+						case '\t':
+							// Check for REM comments.
+							if (i-currentTokenStart==3 &&
+								(array[i-3]=='r' || array[i-3]=='R') &&
+								(array[i-2]=='e' || array[i-2]=='E') &&
+								(array[i-1]=='m' || array[i-1]=='M')) {
+									currentTokenType = Token.COMMENT_EOL;
+									break;
+							}
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.WHITESPACE;
+							break;
+
+						case '"':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.ERROR_STRING_DOUBLE;
+							break;
+
+						case '%':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							currentTokenStart = i;
+							currentTokenType = Token.VARIABLE;
+							break;
+
+						// Should be part of identifiers, but not at end of "REM".
+						case '\\':
+							// Check for REM comments.
+							if (i-currentTokenStart==3 &&
+								(array[i-3]=='r' || array[i-3]=='R') &&
+								(array[i-2]=='e' || array[i-2]=='E') &&
+								(array[i-1]=='m' || array[i-1]=='M')) {
+									currentTokenType = Token.COMMENT_EOL;
+							}
+							break;
+
+						case '.':
+						case '_':
+							break;	// Characters good for identifiers.
+
+						// The "separators".
+						case '(':
+						case ')':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						// The "separators2".
+						case ',':
+						case ';':
+							addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+							addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+							currentTokenType = Token.NULL;
+							break;
+
+						default:
+
+							// Just to speed things up a tad, as this will usually be the case.
+							if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+								break;
+							}
+
+							int indexOf = operators.indexOf(c);
+							if (indexOf>-1) {
+								addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+								addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+								currentTokenType = Token.NULL;
+								break;
+							}
+
+							// Otherwise, fall through and assume we're still okay as an IDENTIFIER...
+
+					} // End of switch (c).
+
+					break;
+
+				case Token.COMMENT_EOL:
+					i = end - 1;
+					addToken(text, currentTokenStart,i, Token.COMMENT_EOL, newStartOffset+currentTokenStart);
+					// We need to set token type to null so at the bottom we don't add one more token.
+					currentTokenType = Token.NULL;
+					break;
+
+				case Token.PREPROCESSOR: // Used for labels
+					i = end - 1;
+					addToken(text, currentTokenStart,i, Token.PREPROCESSOR, newStartOffset+currentTokenStart);
+					// We need to set token type to null so at the bottom we don't add one more token.
+					currentTokenType = Token.NULL;
+					break;
+
+				case Token.ERROR_STRING_DOUBLE:
+
+					if (c=='"') {
+						addToken(text, currentTokenStart,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+						currentTokenStart = i + 1;
+						currentTokenType = Token.NULL;
+					}
+					// Otherwise, we're still an unclosed string...
+
+					break;
+
+				case Token.VARIABLE:
+
+						if (i==currentTokenStart+1) { // first character after '%'.
+							bracketVariable = false;
+							switch (c) {
+								case '{':
+									bracketVariable = true;
+									break;
+								default:
+									if (RSyntaxUtilities.isLetter(c) || c==' ') { // No tab, just space; spaces are okay in variable names.
+										break;
+									}
+									else if (RSyntaxUtilities.isDigit(c)) { // Single-digit command-line argument ("%1").
+										addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+										currentTokenType = Token.NULL;
+										break;
+									}
+									else { // Anything else, ???.
+										addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart); // ???
+										i--;
+										currentTokenType = Token.NULL;
+										break;
+									}
+							} // End of switch (c).
+						}
+						else { // Character other than first after the '%'.
+							if (bracketVariable==true) {
+								if (c=='}') {
+									addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+								}
+							}
+							else {
+								if (c=='%') {
+									addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+									currentTokenType = Token.NULL;
+								}
+							}
+							break;
+						}
+						break;
+
+			} // End of switch (currentTokenType).
+
+		} // End of for (int i=offset; i<end; i++).
+
+		// Deal with the (possibly there) last token.
+		if (currentTokenType != Token.NULL) {
+
+				// Check for REM comments.
+				if (end-currentTokenStart==3 &&
+					(array[end-3]=='r' || array[end-3]=='R') &&
+					(array[end-2]=='e' || array[end-2]=='E') &&
+					(array[end-1]=='m' || array[end-1]=='M')) {
+						currentTokenType = Token.COMMENT_EOL;
+				}
+
+				addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+		}
+
+		addNullToken();
+
+		// Return the first token in our linked list.
+		return firstToken;
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex	(revision 25584)
@@ -0,0 +1,478 @@
+/*
+ * 01/24/2005
+ *
+ * XMLTokenMaker.java - Generates tokens for XML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for XML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class XMLTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD					= -4;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD_INTERNAL			= -5;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_XML_COMMENT			= -(1<<11);
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * Whether the DTD we're currently in is a locally-defined one.  This
+	 * field is only valid when in a DOCTYPE element (the <DTD> state).
+	 */
+	private boolean inInternalDtd;
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public XMLTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		prevState = YYINITIAL;
+		inInternalDtd = false;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				break;
+			case INTERNAL_DTD:
+				state = DTD;
+				break;
+			case INTERNAL_DTD_INTERNAL:
+				state = DTD;
+				inInternalDtd = true;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_XML_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_XML_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtBOL  = true;
+		zzAtEOF  = false;
+	}
+
+
+%}
+
+NameStartChar		= ([\:A-Z_a-z])
+NameChar			= ({NameStartChar}|[\-\.0-9])
+TagName				= ({NameStartChar}{NameChar}*)
+Whitespace			= ([ \t\f])
+LineTerminator			= ([\n])
+Identifier			= ([^ \t\n<&]+)
+AmperItem				= ([&][^; \t]*[;]?)
+InTagIdentifier		= ([^ \t\n\"\'=\/>]+)
+CDataBegin			= ("<![CDATA[")
+CDataEnd				= ("]]>")
+
+URLGenDelim				= ([:\/\?#\[\]@])
+URLSubDelim				= ([\!\$&'\(\)\*\+,;=])
+URLUnreserved			= ([A-Za-z_0-9\-\.\~])
+URLCharacter			= ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters			= ({URLCharacter}*)
+URLEndCharacter			= ([\/\$A-Za-z0-9])
+URL						= (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state CDATA
+
+%%
+
+<YYINITIAL> {
+	"<!--"							{ start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT); }
+	{CDataBegin}					{ addToken(Token.DATA_TYPE); start = zzMarkedPos; yybegin(CDATA); }
+	"<!"							{ start = zzMarkedPos-2; inInternalDtd = false; yybegin(DTD); }
+	"<?"							{ start = zzMarkedPos-2; yybegin(PI); }
+	"<"{TagName}				{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+								}
+	"</"{TagName}				{
+									int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+								}
+	"<"							{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	"</"						{ addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+	{LineTerminator}				{ addNullToken(); return firstToken; }
+	{Identifier}					{ addToken(Token.IDENTIFIER); }
+	{AmperItem}					{ addToken(Token.DATA_TYPE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	<<EOF>>						{ addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+	[^hwf\n\-]+					{}
+	{URL}						{ int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+	[hwf]						{}
+	"-->"						{ int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState); }
+	"-"							{}
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken; }
+}
+
+<PI> {
+	[^\n\?]+						{}
+	{LineTerminator}				{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+	"?>"							{ yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+	"?"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+	[^\n\[\]<>]+				{}
+	"<!--"						{ int temp = zzStartRead; addToken(start,zzStartRead-1, Token.FUNCTION); start = temp; prevState = zzLexicalState; yybegin(COMMENT); }
+	"<"							{}
+	"["							{ inInternalDtd = true; }
+	"]"							{ inInternalDtd = false; }
+	">"							{ if (!inInternalDtd) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.FUNCTION); } }
+	{LineTerminator} |
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.FUNCTION); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken; }
+}
+
+<INTAG> {
+	{InTagIdentifier}				{ addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+	{Whitespace}+					{ addToken(Token.WHITESPACE); }
+	"="							{ addToken(Token.OPERATOR); }
+	"/"							{ addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+	"/>"						{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	">"							{ yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+	[\"]						{ start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+	[\']						{ start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+	[^\"]*						{}
+	[\"]						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+	[^\']*						{}
+	[\']						{ yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<CDATA> {
+	[^\]]+						{}
+	{CDataEnd}					{ int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.DATA_TYPE); }
+	"]"							{}
+	<<EOF>>						{ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken; }
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java	(revision 25584)
@@ -0,0 +1,985 @@
+/* The following code was generated by JFlex 1.4.1 on 2/17/12 7:12 PM */
+
+/*
+ * 01/24/2005
+ *
+ * XMLTokenMaker.java - Generates tokens for XML syntax highlighting.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for XML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance.  Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really).  Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ *   <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ *       definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ *       You should hand-delete the second of each definition (the ones
+ *       generated by the lexer), as these generated methods modify the input
+ *       buffer, which we'll never have to do.</li>
+ *   <li>You should also change the declaration/definition of zzBuffer to NOT
+ *       be initialized.  This is a needless memory allocation for us since we
+ *       will be pointing the array somewhere else anyway.</li>
+ *   <li>You should NOT call <code>yylex()</code> on the generated scanner
+ *       directly; rather, you should use <code>getTokenList</code> as you would
+ *       with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class XMLTokenMaker extends AbstractMarkupTokenMaker {
+
+  /** This character denotes the end of file */
+  public static final int YYEOF = -1;
+
+  /** lexical states */
+  public static final int INTAG = 4;
+  public static final int DTD = 3;
+  public static final int INATTR_DOUBLE = 5;
+  public static final int YYINITIAL = 0;
+  public static final int COMMENT = 1;
+  public static final int CDATA = 7;
+  public static final int INATTR_SINGLE = 6;
+  public static final int PI = 2;
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final String ZZ_CMAP_PACKED = 
+    "\11\0\1\6\1\4\1\0\1\3\23\0\1\6\1\12\1\11\1\22"+
+    "\1\30\1\22\1\7\1\25\5\22\1\2\1\42\1\24\12\27\1\23"+
+    "\1\10\1\5\1\44\1\21\1\43\1\22\1\16\1\26\1\14\1\15"+
+    "\17\26\1\17\6\26\1\13\1\0\1\20\1\0\1\1\1\0\4\26"+
+    "\1\40\1\35\1\26\1\31\1\36\2\26\1\37\3\26\1\33\2\26"+
+    "\1\34\1\32\2\26\1\41\3\26\3\0\1\22\uff81\0";
+
+  /** 
+   * Translates characters to character classes
+   */
+  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+  /** 
+   * Translates DFA states to action switch labels.
+   */
+  private static final int [] ZZ_ACTION = zzUnpackAction();
+
+  private static final String ZZ_ACTION_PACKED_0 =
+    "\5\0\2\1\1\0\2\2\1\3\1\4\1\5\1\6"+
+    "\2\1\1\7\4\1\1\10\2\1\1\11\1\1\1\12"+
+    "\1\13\1\14\2\15\1\16\1\17\1\20\1\21\1\22"+
+    "\1\1\1\23\3\1\1\24\1\25\1\4\1\26\1\6"+
+    "\5\0\1\27\4\0\1\30\1\31\5\0\1\32\1\33"+
+    "\3\0\1\34\1\35\6\0\1\36";
+
+  private static int [] zzUnpackAction() {
+    int [] result = new int[77];
+    int offset = 0;
+    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAction(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /** 
+   * Translates a state to a row index in the transition table
+   */
+  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+  private static final String ZZ_ROWMAP_PACKED_0 =
+    "\0\0\0\45\0\112\0\157\0\224\0\271\0\336\0\u0103"+
+    "\0\u0128\0\u014d\0\u0172\0\u0197\0\u01bc\0\u01e1\0\u0206\0\u022b"+
+    "\0\u0172\0\u0250\0\u0275\0\u029a\0\u02bf\0\u0172\0\u02e4\0\u0309"+
+    "\0\u0172\0\u032e\0\u0172\0\u0172\0\u0172\0\u0353\0\u0378\0\u0172"+
+    "\0\u0172\0\u039d\0\u0172\0\u0172\0\u03c2\0\u0172\0\u03e7\0\u040c"+
+    "\0\u0431\0\u0456\0\u047b\0\u04a0\0\u0172\0\u0172\0\u04c5\0\u04ea"+
+    "\0\u050f\0\u0534\0\u0559\0\u0172\0\u057e\0\u05a3\0\u05c8\0\u05ed"+
+    "\0\u0612\0\u0172\0\u0637\0\u065c\0\u0681\0\u06a6\0\u06cb\0\u0172"+
+    "\0\u0172\0\u06f0\0\u0715\0\u073a\0\u075f\0\u0172\0\u0784\0\u07a9"+
+    "\0\u075f\0\u07ce\0\u07f3\0\u0818\0\u0172";
+
+  private static int [] zzUnpackRowMap() {
+    int [] result = new int[77];
+    int offset = 0;
+    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+    int i = 0;  /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int high = packed.charAt(i++) << 16;
+      result[j++] = high | packed.charAt(i++);
+    }
+    return j;
+  }
+
+  /** 
+   * The transition table of the DFA
+   */
+  private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+  private static final String ZZ_TRANS_PACKED_0 =
+    "\3\11\1\12\1\13\1\14\1\15\1\16\35\11\2\17"+
+    "\1\20\1\17\1\21\24\17\1\22\3\17\1\23\3\17"+
+    "\1\24\3\17\4\25\1\26\36\25\1\27\1\25\4\30"+
+    "\1\31\1\32\5\30\1\33\4\30\1\34\1\35\23\30"+
+    "\3\36\1\37\1\0\1\36\1\15\2\36\1\40\7\36"+
+    "\1\41\2\36\1\42\1\43\16\36\1\44\11\45\1\46"+
+    "\33\45\25\47\1\46\17\47\20\50\1\51\24\50\4\11"+
+    "\4\0\40\11\1\12\2\0\1\15\1\0\35\11\46\0"+
+    "\1\52\10\0\1\53\1\0\4\52\3\0\1\52\1\54"+
+    "\1\0\1\52\2\0\11\52\1\0\1\55\4\0\1\15"+
+    "\2\0\1\15\36\0\6\16\1\0\1\16\1\56\34\16"+
+    "\2\17\1\0\1\17\1\0\24\17\1\0\3\17\1\0"+
+    "\3\17\1\0\3\17\2\0\1\57\74\0\1\60\44\0"+
+    "\1\61\3\0\1\62\47\0\1\63\3\0\4\25\1\0"+
+    "\36\25\1\0\1\25\21\0\1\64\23\0\4\30\2\0"+
+    "\5\30\1\0\4\30\2\0\23\30\12\0\1\65\32\0"+
+    "\4\36\1\0\1\36\1\0\2\36\1\0\7\36\1\0"+
+    "\2\36\2\0\16\36\1\0\3\36\1\37\1\0\1\36"+
+    "\1\15\2\36\1\0\7\36\1\0\2\36\2\0\16\36"+
+    "\22\0\1\41\23\0\11\45\1\0\33\45\25\47\1\0"+
+    "\17\47\20\50\1\0\24\50\20\0\1\66\25\0\2\52"+
+    "\11\0\4\52\3\0\1\52\2\0\2\52\1\0\12\52"+
+    "\4\0\1\67\10\0\1\70\32\0\1\71\12\0\4\71"+
+    "\3\0\1\71\2\0\1\71\2\0\11\71\24\0\1\72"+
+    "\55\0\1\73\45\0\1\74\50\0\1\75\46\0\1\76"+
+    "\5\0\1\77\63\0\1\100\25\0\1\101\56\0\1\102"+
+    "\31\0\2\71\11\0\4\71\3\0\1\71\2\0\2\71"+
+    "\1\0\12\71\35\0\1\103\34\0\1\104\61\0\1\74"+
+    "\46\0\1\105\4\0\1\106\57\0\1\107\52\0\1\104"+
+    "\10\0\1\74\34\0\1\110\21\0\2\111\4\0\2\111"+
+    "\1\0\2\111\4\105\1\111\1\0\2\111\1\105\1\111"+
+    "\14\105\3\111\16\0\1\112\52\0\1\105\37\0\1\113"+
+    "\43\0\1\114\41\0\1\115\31\0";
+
+  private static int [] zzUnpackTrans() {
+    int [] result = new int[2109];
+    int offset = 0;
+    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackTrans(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      value--;
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+
+  /* error codes */
+  private static final int ZZ_UNKNOWN_ERROR = 0;
+  private static final int ZZ_NO_MATCH = 1;
+  private static final int ZZ_PUSHBACK_2BIG = 2;
+
+  /* error messages for the codes above */
+  private static final String ZZ_ERROR_MSG[] = {
+    "Unkown internal scanner error",
+    "Error: could not match input",
+    "Error: pushback value was too large"
+  };
+
+  /**
+   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+   */
+  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+  private static final String ZZ_ATTRIBUTE_PACKED_0 =
+    "\5\0\2\1\1\0\2\1\1\11\5\1\1\11\4\1"+
+    "\1\11\2\1\1\11\1\1\3\11\2\1\2\11\1\1"+
+    "\2\11\1\1\1\11\6\1\2\11\5\0\1\11\4\0"+
+    "\1\1\1\11\5\0\2\11\3\0\1\1\1\11\6\0"+
+    "\1\11";
+
+  private static int [] zzUnpackAttribute() {
+    int [] result = new int[77];
+    int offset = 0;
+    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+    return result;
+  }
+
+  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+    int i = 0;       /* index in packed string  */
+    int j = offset;  /* index in unpacked array */
+    int l = packed.length();
+    while (i < l) {
+      int count = packed.charAt(i++);
+      int value = packed.charAt(i++);
+      do result[j++] = value; while (--count > 0);
+    }
+    return j;
+  }
+
+  /** the input device */
+  private java.io.Reader zzReader;
+
+  /** the current state of the DFA */
+  private int zzState;
+
+  /** the current lexical state */
+  private int zzLexicalState = YYINITIAL;
+
+  /** this buffer contains the current text to be matched and is
+      the source of the yytext() string */
+  private char zzBuffer[];
+
+  /** the textposition at the last accepting state */
+  private int zzMarkedPos;
+
+  /** the current text position in the buffer */
+  private int zzCurrentPos;
+
+  /** startRead marks the beginning of the yytext() string in the buffer */
+  private int zzStartRead;
+
+  /** endRead marks the last character in the buffer, that has been read
+      from input */
+  private int zzEndRead;
+
+  /** zzAtEOF == true <=> the scanner is at the EOF */
+  private boolean zzAtEOF;
+
+  /* user code: */
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * double-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_DOUBLE			= -1;
+
+
+	/**
+	 * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+	 * single-quote attribute.
+	 */
+	public static final int INTERNAL_ATTR_SINGLE			= -2;
+
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed XML tag; thus a new line is beginning still inside of the tag.
+	 */
+	public static final int INTERNAL_INTAG					= -3;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD					= -4;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed, locally-defined DTD in a DOCTYPE element.
+	 */
+	public static final int INTERNAL_DTD_INTERNAL			= -5;
+
+	/**
+	 * Token type specific to XMLTokenMaker denoting a line ending with an
+	 * unclosed comment.  The state to return to when this comment ends is
+	 * embedded in the token type as well.
+	 */
+	public static final int INTERNAL_IN_XML_COMMENT			= -(1<<11);
+
+	/**
+	 * Whether closing markup tags are automatically completed for HTML.
+	 */
+	private static boolean completeCloseTags;
+
+	/**
+	 * Whether the DTD we're currently in is a locally-defined one.  This
+	 * field is only valid when in a DOCTYPE element (the <DTD> state).
+	 */
+	private boolean inInternalDtd;
+
+	/**
+	 * The state we were in prior to the current one.  This is used to know
+	 * what state to resume after an MLC ends.
+	 */
+	private int prevState;
+
+
+	/**
+	 * Constructor.  This must be here because JFlex does not generate a
+	 * no-parameter constructor.
+	 */
+	public XMLTokenMaker() {
+	}
+
+
+	static {
+		completeCloseTags = true;
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens as an
+	 * "end token;" that is, at <code>zzMarkedPos</code>.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addEndToken(int tokenType) {
+		addToken(zzMarkedPos,zzMarkedPos, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 * @see #addToken(int, int, int)
+	 */
+	private void addHyperlinkToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so, true);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int tokenType) {
+		addToken(zzStartRead, zzMarkedPos-1, tokenType);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param tokenType The token's type.
+	 */
+	private void addToken(int start, int end, int tokenType) {
+		int so = start + offsetShift;
+		addToken(zzBuffer, start,end, tokenType, so);
+	}
+
+
+	/**
+	 * Adds the token specified to the current linked list of tokens.
+	 *
+	 * @param array The character array.
+	 * @param start The starting offset in the array.
+	 * @param end The ending offset in the array.
+	 * @param tokenType The token's type.
+	 * @param startOffset The offset in the document at which this token
+	 *                    occurs.
+	 */
+	public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+		super.addToken(array, start,end, tokenType, startOffset);
+		zzStartRead = zzMarkedPos;
+	}
+
+
+	/**
+	 * Returns whether markup close tags should be completed.  For XML, the
+	 * default value is <code>true</code>.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public boolean getCompleteCloseTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Static version of {@link #getCompleteCloseTags()}.  This hack is
+	 * unfortunately needed for applications to be able to query this value
+	 * without instantiating this class.
+	 *
+	 * @return Whether closing markup tags are completed.
+	 * @see #setCompleteCloseTags(boolean)
+	 */
+	public static boolean getCompleteCloseMarkupTags() {
+		return completeCloseTags;
+	}
+
+
+	/**
+	 * Always returns <tt>false</tt>, as you never want "mark occurrences"
+	 * working in XML files.
+	 *
+	 * @param type The token type.
+	 * @return Whether tokens of this type should have "mark occurrences"
+	 *         enabled.
+	 */
+	public boolean getMarkOccurrencesOfTokenType(int type) {
+		return false;
+	}
+
+
+	/**
+	 * Returns the first token in the linked list of tokens generated
+	 * from <code>text</code>.  This method must be implemented by
+	 * subclasses so they can correctly implement syntax highlighting.
+	 *
+	 * @param text The text from which to get tokens.
+	 * @param initialTokenType The token type we should start with.
+	 * @param startOffset The offset into the document at which
+	 *        <code>text</code> starts.
+	 * @return The first <code>Token</code> in a linked list representing
+	 *         the syntax highlighted text.
+	 */
+	public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+		resetTokenList();
+		this.offsetShift = -text.offset + startOffset;
+		prevState = YYINITIAL;
+		inInternalDtd = false;
+
+		// Start off in the proper state.
+		int state = Token.NULL;
+		switch (initialTokenType) {
+			case Token.COMMENT_MULTILINE:
+				state = COMMENT;
+				break;
+			case INTERNAL_DTD:
+				state = DTD;
+				break;
+			case INTERNAL_DTD_INTERNAL:
+				state = DTD;
+				inInternalDtd = true;
+				break;
+			case INTERNAL_ATTR_DOUBLE:
+				state = INATTR_DOUBLE;
+				break;
+			case INTERNAL_ATTR_SINGLE:
+				state = INATTR_SINGLE;
+				break;
+			case Token.MARKUP_PROCESSING_INSTRUCTION:
+				state = PI;
+				break;
+			case INTERNAL_INTAG:
+				state = INTAG;
+				break;
+			case Token.MARKUP_CDATA:
+				state = CDATA;
+				break;
+			default:
+				if (initialTokenType<-1024) { // INTERNAL_IN_XML_COMMENT - prevState
+					int main = -(-initialTokenType & 0xffffff00);
+					switch (main) {
+						default: // Should never happen
+						case INTERNAL_IN_XML_COMMENT:
+							state = COMMENT;
+							break;
+					}
+					prevState = -initialTokenType&0xff;
+				}
+				else { // Shouldn't happen
+					state = Token.NULL;
+				}
+		}
+
+		start = text.offset;
+		s = text;
+		try {
+			yyreset(zzReader);
+			yybegin(state);
+			return yylex();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			return new DefaultToken();
+		}
+
+	}
+
+
+	/**
+	 * Sets whether markup close tags should be completed.
+	 *
+	 * @param complete Whether closing markup tags are completed.
+	 * @see #getCompleteCloseTags()
+	 */
+	public static void setCompleteCloseTags(boolean complete) {
+		completeCloseTags = complete;
+	}
+
+
+	/**
+	 * Refills the input buffer.
+	 *
+	 * @return      <code>true</code> if EOF was reached, otherwise
+	 *              <code>false</code>.
+	 */
+	private boolean zzRefill() {
+		return zzCurrentPos>=s.offset+s.count;
+	}
+
+
+	/**
+	 * Resets the scanner to read from a new input stream.
+	 * Does not close the old reader.
+	 *
+	 * All internal variables are reset, the old input stream 
+	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
+	 * Lexical state is set to <tt>YY_INITIAL</tt>.
+	 *
+	 * @param reader   the new input stream 
+	 */
+	public final void yyreset(java.io.Reader reader) {
+		// 's' has been updated.
+		zzBuffer = s.array;
+		/*
+		 * We replaced the line below with the two below it because zzRefill
+		 * no longer "refills" the buffer (since the way we do it, it's always
+		 * "full" the first time through, since it points to the segment's
+		 * array).  So, we assign zzEndRead here.
+		 */
+		//zzStartRead = zzEndRead = s.offset;
+		zzStartRead = s.offset;
+		zzEndRead = zzStartRead + s.count - 1;
+		zzCurrentPos = zzMarkedPos = s.offset;
+		zzLexicalState = YYINITIAL;
+		zzReader = reader;
+		zzAtEOF  = false;
+	}
+
+
+
+
+  /**
+   * Creates a new scanner
+   * There is also a java.io.InputStream version of this constructor.
+   *
+   * @param   in  the java.io.Reader to read input from.
+   */
+  public XMLTokenMaker(java.io.Reader in) {
+    this.zzReader = in;
+  }
+
+  /**
+   * Creates a new scanner.
+   * There is also java.io.Reader version of this constructor.
+   *
+   * @param   in  the java.io.Inputstream to read input from.
+   */
+  public XMLTokenMaker(java.io.InputStream in) {
+    this(new java.io.InputStreamReader(in));
+  }
+
+  /** 
+   * Unpacks the compressed character translation table.
+   *
+   * @param packed   the packed character translation table
+   * @return         the unpacked character translation table
+   */
+  private static char [] zzUnpackCMap(String packed) {
+    char [] map = new char[0x10000];
+    int i = 0;  /* index in packed string  */
+    int j = 0;  /* index in unpacked array */
+    while (i < 116) {
+      int  count = packed.charAt(i++);
+      char value = packed.charAt(i++);
+      do map[j++] = value; while (--count > 0);
+    }
+    return map;
+  }
+
+
+  /**
+   * Closes the input stream.
+   */
+  public final void yyclose() throws java.io.IOException {
+    zzAtEOF = true;            /* indicate end of file */
+    zzEndRead = zzStartRead;  /* invalidate buffer    */
+
+    if (zzReader != null)
+      zzReader.close();
+  }
+
+
+  /**
+   * Returns the current lexical state.
+   */
+  public final int yystate() {
+    return zzLexicalState;
+  }
+
+
+  /**
+   * Enters a new lexical state
+   *
+   * @param newState the new lexical state
+   */
+  public final void yybegin(int newState) {
+    zzLexicalState = newState;
+  }
+
+
+  /**
+   * Returns the text matched by the current regular expression.
+   */
+  public final String yytext() {
+    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+  }
+
+
+  /**
+   * Returns the character at position <tt>pos</tt> from the 
+   * matched text. 
+   * 
+   * It is equivalent to yytext().charAt(pos), but faster
+   *
+   * @param pos the position of the character to fetch. 
+   *            A value from 0 to yylength()-1.
+   *
+   * @return the character at position pos
+   */
+  public final char yycharat(int pos) {
+    return zzBuffer[zzStartRead+pos];
+  }
+
+
+  /**
+   * Returns the length of the matched text region.
+   */
+  public final int yylength() {
+    return zzMarkedPos-zzStartRead;
+  }
+
+
+  /**
+   * Reports an error that occured while scanning.
+   *
+   * In a wellformed scanner (no or only correct usage of 
+   * yypushback(int) and a match-all fallback rule) this method 
+   * will only be called with things that "Can't Possibly Happen".
+   * If this method is called, something is seriously wrong
+   * (e.g. a JFlex bug producing a faulty scanner etc.).
+   *
+   * Usual syntax/scanner level error handling should be done
+   * in error fallback rules.
+   *
+   * @param   errorCode  the code of the errormessage to display
+   */
+  private void zzScanError(int errorCode) {
+    String message;
+    try {
+      message = ZZ_ERROR_MSG[errorCode];
+    }
+    catch (ArrayIndexOutOfBoundsException e) {
+      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+    }
+
+    throw new Error(message);
+  } 
+
+
+  /**
+   * Pushes the specified amount of characters back into the input stream.
+   *
+   * They will be read again by then next call of the scanning method
+   *
+   * @param number  the number of characters to be read again.
+   *                This number must not be greater than yylength()!
+   */
+  public void yypushback(int number)  {
+    if ( number > yylength() )
+      zzScanError(ZZ_PUSHBACK_2BIG);
+
+    zzMarkedPos -= number;
+  }
+
+
+  /**
+   * Resumes scanning until the next regular expression is matched,
+   * the end of input is encountered or an I/O-Error occurs.
+   *
+   * @return      the next token
+   * @exception   java.io.IOException  if any I/O-Error occurs
+   */
+  public org.fife.ui.rsyntaxtextarea.Token yylex() throws java.io.IOException {
+    int zzInput;
+    int zzAction;
+
+    // cached fields:
+    int zzCurrentPosL;
+    int zzMarkedPosL;
+    int zzEndReadL = zzEndRead;
+    char [] zzBufferL = zzBuffer;
+    char [] zzCMapL = ZZ_CMAP;
+
+    int [] zzTransL = ZZ_TRANS;
+    int [] zzRowMapL = ZZ_ROWMAP;
+    int [] zzAttrL = ZZ_ATTRIBUTE;
+
+    while (true) {
+      zzMarkedPosL = zzMarkedPos;
+
+      zzAction = -1;
+
+      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+  
+      zzState = zzLexicalState;
+
+
+      zzForAction: {
+        while (true) {
+    
+          if (zzCurrentPosL < zzEndReadL)
+            zzInput = zzBufferL[zzCurrentPosL++];
+          else if (zzAtEOF) {
+            zzInput = YYEOF;
+            break zzForAction;
+          }
+          else {
+            // store back cached positions
+            zzCurrentPos  = zzCurrentPosL;
+            zzMarkedPos   = zzMarkedPosL;
+            boolean eof = zzRefill();
+            // get translated positions and possibly new buffer
+            zzCurrentPosL  = zzCurrentPos;
+            zzMarkedPosL   = zzMarkedPos;
+            zzBufferL      = zzBuffer;
+            zzEndReadL     = zzEndRead;
+            if (eof) {
+              zzInput = YYEOF;
+              break zzForAction;
+            }
+            else {
+              zzInput = zzBufferL[zzCurrentPosL++];
+            }
+          }
+          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+          if (zzNext == -1) break zzForAction;
+          zzState = zzNext;
+
+          int zzAttributes = zzAttrL[zzState];
+          if ( (zzAttributes & 1) == 1 ) {
+            zzAction = zzState;
+            zzMarkedPosL = zzCurrentPosL;
+            if ( (zzAttributes & 8) == 8 ) break zzForAction;
+          }
+
+        }
+      }
+
+      // store back cached position
+      zzMarkedPos = zzMarkedPosL;
+
+      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 19: 
+          { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+          }
+        case 31: break;
+        case 3: 
+          { addNullToken(); return firstToken;
+          }
+        case 32: break;
+        case 11: 
+          { inInternalDtd = false;
+          }
+        case 33: break;
+        case 4: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+          }
+        case 34: break;
+        case 24: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+          }
+        case 35: break;
+        case 16: 
+          { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+          }
+        case 36: break;
+        case 5: 
+          { addToken(Token.WHITESPACE);
+          }
+        case 37: break;
+        case 27: 
+          { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT);
+          }
+        case 38: break;
+        case 29: 
+          { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.FUNCTION); start = temp; prevState = zzLexicalState; yybegin(COMMENT);
+          }
+        case 39: break;
+        case 25: 
+          { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState);
+          }
+        case 40: break;
+        case 2: 
+          { addToken(Token.IDENTIFIER);
+          }
+        case 41: break;
+        case 9: 
+          { addToken(start,zzStartRead-1, Token.FUNCTION); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken;
+          }
+        case 42: break;
+        case 10: 
+          { inInternalDtd = true;
+          }
+        case 43: break;
+        case 30: 
+          { addToken(Token.DATA_TYPE); start = zzMarkedPos; yybegin(CDATA);
+          }
+        case 44: break;
+        case 6: 
+          { addToken(Token.DATA_TYPE);
+          }
+        case 45: break;
+        case 23: 
+          { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+          }
+        case 46: break;
+        case 21: 
+          { start = zzMarkedPos-2; inInternalDtd = false; yybegin(DTD);
+          }
+        case 47: break;
+        case 20: 
+          { int count = yylength();
+									addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+									addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+									yybegin(INTAG);
+          }
+        case 48: break;
+        case 22: 
+          { start = zzMarkedPos-2; yybegin(PI);
+          }
+        case 49: break;
+        case 8: 
+          { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+          }
+        case 50: break;
+        case 14: 
+          { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+          }
+        case 51: break;
+        case 15: 
+          { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+          }
+        case 52: break;
+        case 12: 
+          { if (!inInternalDtd) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.FUNCTION); }
+          }
+        case 53: break;
+        case 17: 
+          { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+          }
+        case 54: break;
+        case 28: 
+          { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+          }
+        case 55: break;
+        case 26: 
+          { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.DATA_TYPE);
+          }
+        case 56: break;
+        case 18: 
+          { addToken(Token.OPERATOR);
+          }
+        case 57: break;
+        case 7: 
+          { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken;
+          }
+        case 58: break;
+        case 13: 
+          { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+          }
+        case 59: break;
+        case 1: 
+          { 
+          }
+        case 60: break;
+        default: 
+          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+            zzAtEOF = true;
+            switch (zzLexicalState) {
+            case INTAG: {
+              addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken;
+            }
+            case 78: break;
+            case DTD: {
+              addToken(start,zzStartRead-1, Token.FUNCTION); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken;
+            }
+            case 79: break;
+            case INATTR_DOUBLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+            }
+            case 80: break;
+            case YYINITIAL: {
+              addNullToken(); return firstToken;
+            }
+            case 81: break;
+            case COMMENT: {
+              addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken;
+            }
+            case 82: break;
+            case CDATA: {
+              addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken;
+            }
+            case 83: break;
+            case INATTR_SINGLE: {
+              addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+            }
+            case 84: break;
+            case PI: {
+              addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+            }
+            case 85: break;
+            default:
+            return null;
+            }
+          } 
+          else {
+            zzScanError(ZZ_NO_MATCH);
+          }
+      }
+    }
+  }
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/modes/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Scanners that tokenize source in <code>RSyntaxTextArea</code>.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	A syntax-highlighting text editor.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java	(revision 25584)
@@ -0,0 +1,95 @@
+/*
+ * 07/31/2009
+ *
+ * AbstractParser.java - A base implementation for parsers.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * A base class for {@link Parser} implementations.  Most <code>Parser</code>s
+ * should be able to extend this class.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractParser implements Parser {
+
+	/**
+	 * Whether this parser is enabled.  If this is <code>false</code>, then
+	 * this parser will not be run.
+	 */
+	private boolean enabled;
+
+	/**
+	 * Listens for events from {@link FocusableTip}s generated from this
+	 * parser's notices.
+	 */
+	private ExtendedHyperlinkListener linkListener;
+
+
+	/**
+	 * Constructor.
+	 */
+	protected AbstractParser() {
+		setEnabled(true);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ExtendedHyperlinkListener getHyperlinkListener() {
+		return linkListener;
+	}
+
+
+	/**
+	 * Returns <code>null</code>.  Parsers that wish to show images in their
+	 * tool tips should override this method to return the image base URL.
+	 *
+	 * @return <code>null</code> always.
+	 */
+	public URL getImageBase() {
+		return null;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+
+	/**
+	 * Toggles whether this parser is enabled.
+	 *
+	 * @param enabled Whether this parser is enabled.
+	 * @see #isEnabled()
+	 */
+	public void setEnabled(boolean enabled) {
+		this.enabled = enabled;
+	}
+
+
+	/**
+	 * Returns the listener for this parser.
+	 *
+	 * @param listener The new listener.
+	 * @see #getHyperlinkListener()
+	 */
+	public void setHyperlinkListener(ExtendedHyperlinkListener listener) {
+		linkListener = listener;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java	(revision 25584)
@@ -0,0 +1,145 @@
+/*
+ * 07/27/2009
+ *
+ * DefaultParseResult.java - A basic implementation of a ParseResult.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * A basic implementation of {@link ParseResult}.  Most, if not all,
+ * <code>Parser</code>s can return instances of this class.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Parser
+ */
+public class DefaultParseResult implements ParseResult {
+
+	private Parser parser;
+	private int firstLineParsed;
+	private int lastLineParsed;
+	private List notices;
+	private long parseTime;
+	private Exception error;
+
+
+	public DefaultParseResult(Parser parser) {
+		this.parser = parser;
+		notices = new ArrayList();
+	}
+
+
+	/**
+	 * Adds a parser notice.
+	 *
+	 * @param notice The new notice.
+	 * @see #clearNotices()
+	 */
+	public void addNotice(ParserNotice notice) {
+		notices.add(notice);
+	}
+
+
+	/**
+	 * Clears any parser notices in this result.
+	 *
+	 * @see #addNotice(ParserNotice)
+	 */
+	public void clearNotices() {
+		notices.clear();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Exception getError() {
+		return error;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getFirstLineParsed() {
+		return firstLineParsed;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLastLineParsed() {
+		return lastLineParsed;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getNotices() {
+		return notices;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public long getParseTime() {
+		return parseTime;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Parser getParser() {
+		return parser;
+	}
+
+
+	/**
+	 * Sets the error that occurred when last parsing the document, if
+	 * any.
+	 *
+	 * @param e The error that occurred, or <code>null</code> if no error
+	 *         occurred.
+	 */
+	public void setError(Exception e) {
+		this.error = e;
+	}
+
+
+	/**
+	 * Sets the amount of time it took for this parser to parse the document.
+	 *
+	 * @param time The amount of time, in milliseconds.
+	 * @see #getParseTime()
+	 */
+	public void setParseTime(long time) {
+		parseTime = time;
+	}
+
+
+	/**
+	 * Sets the line range parsed.
+	 *
+	 * @param first The first line parsed, inclusive.
+	 * @param last The last line parsed, inclusive.
+	 * @see #getFirstLineParsed()
+	 * @see #getLastLineParsed()
+	 */
+	public void setParsedLines(int first, int last) {
+		firstLineParsed = first;
+		lastLineParsed = last;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java	(revision 25584)
@@ -0,0 +1,268 @@
+/*
+ * 08/11/2009
+ *
+ * DefaultParserNotice.java - Base implementation of a parser notice.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+
+
+/**
+ * Base implementation of a parser notice.  Most <code>Parser</code>
+ * implementations can return instances of this in their parse result.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Parser
+ * @see ParseResult
+ */
+public class DefaultParserNotice implements ParserNotice {
+
+	private Parser parser;
+	private int level;
+	private int line;
+	private int offset;
+	private int length;
+	private boolean showInEditor;
+	private Color color;
+	private String message;
+	private String toolTipText;
+
+	private static final Color[] DEFAULT_COLORS = {
+		new Color(255, 0, 128),		// Error
+		new Color(244, 200, 45),	// Warning
+		Color.gray,					// Info
+	};
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param parser The parser that created this notice.
+	 * @param msg The text of the message.
+	 * @param line The line number for the message.
+	 */
+	public DefaultParserNotice(Parser parser, String msg, int line) {
+		this(parser, msg, line, -1, -1);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param parser The parser that created this notice.
+	 * @param message The message.
+	 * @param line The line number corresponding to the message.
+	 * @param offset The offset in the input stream of the code the
+	 *        message is concerned with, or <code>-1</code> if unknown.
+	 * @param length The length of the code the message is concerned with,
+	 *        or <code>-1</code> if unknown.
+	 */
+	public DefaultParserNotice(Parser parser, String message, int line,
+						int offset, int length) {
+		this.parser = parser;
+		this.message = message;
+		this.line = line;
+		this.offset = offset;
+		this.length = length;
+		setLevel(ERROR);
+		setShowInEditor(true);
+	}
+
+
+	/**
+	 * Compares this parser notice to another.
+	 *
+	 * @param obj Another parser notice.
+	 * @return How the two parser notices should be sorted relative to one
+	 *         another.
+	 */
+	public int compareTo(Object obj) {
+		int diff = -1;
+		if (obj instanceof ParserNotice) {
+			ParserNotice p2 = (ParserNotice)obj;
+			diff = level - p2.getLevel();
+			if (diff==0) {
+				diff = line - p2.getLine();
+				if (diff==0) {
+					diff = message.compareTo(p2.getMessage());
+				}
+			}
+		}
+		return diff;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean containsPosition(int pos) {
+		return offset<=pos && pos<(offset+length);
+	}
+
+
+	/**
+	 * Returns whether this parser notice is equal to another one.
+	 *
+	 * @param obj Another parser notice.
+	 * @return Whether the two notices are equal.
+	 */
+	public boolean equals(Object obj) {
+		return compareTo(obj)==0;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Color getColor() {
+		Color c = color; // User-defined
+		if (c==null) {
+			c = DEFAULT_COLORS[getLevel()];
+		}
+		return c;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLength() {
+		return length;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLevel() {
+		return level;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getLine() {
+		return line;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getMessage() {
+		return message;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int getOffset() {
+		return offset;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Parser getParser() {
+		return parser;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean getShowInEditor() {
+		return showInEditor;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getToolTipText() {
+		return toolTipText!=null ? toolTipText : getMessage();
+	}
+
+
+	/**
+	 * Returns the hash code for this notice.
+	 *
+	 * @return The hash code.
+	 */
+	public int hashCode() {
+		return (line<<16) | offset;
+	}
+
+
+	/**
+	 * Sets the color to use when painting this notice.
+	 *
+	 * @param color The color to use.
+	 * @see #getColor()
+	 */
+	public void setColor(Color color) {
+		this.color = color;
+	}
+
+
+	/**
+	 * Sets the level of this notice.
+	 *
+	 * @param level The new level.
+	 * @see #getLevel()
+	 */
+	public void setLevel(int level) {
+		if (level>INFO) {
+			level = INFO;
+		}
+		else if (level<ERROR) {
+			level = ERROR;
+		}
+		this.level = level;
+	}
+
+
+	/**
+	 * Sets whether a squiggle underline should be drawn in the editor for
+	 * this notice.
+	 *
+	 * @param show Whether to draw a squiggle underline.
+	 * @see #getShowInEditor()
+	 */
+	public void setShowInEditor(boolean show) {
+		showInEditor = show;
+	}
+
+
+	/**
+	 * Sets the tooltip text to display for this notice.
+	 *
+	 * @param text The new tooltip text.  This can be HTML.  If this is
+	 *        <code>null</code>, then tooltips will return the same text as
+	 *        {@link #getMessage()}.
+	 * @see #getToolTipText()
+	 */
+	public void setToolTipText(String text) {
+		this.toolTipText = text;
+	}
+
+
+	/**
+	 * Returns a string representation of this parser notice.
+	 *
+	 * @return This parser notice as a string.
+	 */
+	public String toString() {
+		return "Line " + getLine() + ": " + getMessage();
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java	(revision 25584)
@@ -0,0 +1,38 @@
+/*
+ * 07/31/2009
+ *
+ * ExtendedHyeprlinkListener.java - A hyperlink event from a FocusableTip.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.EventListener;
+import javax.swing.event.HyperlinkEvent;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * Listens for hyperlink events from {@link FocusableTip}s.  In addition to
+ * the link event, the text area that the tip is for is also received, which
+ * allows the listener to modify the displayed content, if desired.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ExtendedHyperlinkListener extends EventListener {
+
+
+	/**
+	 * Called when a link in a {@link FocusableTip} is clicked.
+	 *
+	 * @param textArea The text area displaying the tip.
+	 * @param e The event.
+	 */
+	public void linkClicked(RSyntaxTextArea textArea, HyperlinkEvent e);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java	(revision 25584)
@@ -0,0 +1,84 @@
+/*
+ * 07/27/2009
+ *
+ * ParseResult.java - The result of a Parser parsing some section of an
+ * RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.List;
+
+
+/**
+ * The result from a {@link Parser}.  This contains the section of lines
+ * parsed and any notices for that section.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see DefaultParseResult
+ * @see ParserNotice
+ */
+public interface ParseResult {
+
+
+	/**
+	 * Returns an error that occurred while parsing the document, if any.
+	 *
+	 * @return The error, or <code>null</code> if the document was
+	 *         successfully parsed.
+	 */
+	public Exception getError();
+
+
+	/**
+	 * Returns the first line parsed.  All parser implementations should
+	 * currently set this to <code>0</code> and parse the entire document.
+	 *
+	 * @return The first line parsed.
+	 * @see #getLastLineParsed()
+	 */
+	public int getFirstLineParsed();
+
+
+	/**
+	 * Returns the first line parsed.  All parser implementations should
+	 * currently set this to the document's line count and parse the entire
+	 * document.
+	 *
+	 * @return The last line parsed.
+	 * @see #getFirstLineParsed()
+	 */
+	public int getLastLineParsed();
+
+
+	/**
+	 * Returns the notices for the parsed section.
+	 *
+	 * @return A list of {@link ParserNotice}s.
+	 */
+	public List getNotices();
+
+
+	/**
+	 * Returns the parser that generated these notices.
+	 *
+	 * @return The parser.
+	 */
+	public Parser getParser();
+
+
+	/**
+	 * Returns the amount of time this parser took to parse the specified
+	 * range of text.  This is an optional operation; parsers are permitted
+	 * to return <code>0</code> for this value.
+	 *
+	 * @return The parse time, in milliseconds, or <code>0</code> if the
+	 *         parse time was not recorded.
+	 */
+	public long getParseTime();
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/Parser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/Parser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/Parser.java	(revision 25584)
@@ -0,0 +1,76 @@
+/*
+ * 09/23/2005
+ *
+ * Parser.java - An interface for a parser for RSyntaxTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * An interface for a parser for content in an {@link RSyntaxTextArea}.
+ * A <code>Parser</code> returns a list of issues it finds in the text area's
+ * content, which the text area can flag (e.g. squiggle underline).  It can
+ * also return descriptions of the issues, to be used in tool tips.<p>
+ * 
+ * To install a <code>Parser</code>, simply call
+ * {@link RSyntaxTextArea#addParser(Parser)}.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ * @see AbstractParser
+ */
+public interface Parser {
+
+
+	/**
+	 * Returns the listener for hyperlink events from {@link FocusableTip}s,
+	 * or <code>null</code> if none.
+	 *
+	 * @return The listener.
+	 */
+	public ExtendedHyperlinkListener getHyperlinkListener();
+
+
+	/**
+	 * Returns the base URL for any images displayed in returned
+	 * {@link ParserNotice} HTML text.  Note that if a parser notice's text
+	 * is not HTML, this URL is not used.
+	 *
+	 * @return The URL.  This may be <code>null</code>.
+	 */
+	public URL getImageBase();
+
+
+	/**
+	 * Returns whether this parser is enabled.  If this returns
+	 * <code>false</code>, it will not be run.
+	 *
+	 * @return Whether this parser is enabled.
+	 */
+	public boolean isEnabled();
+
+
+	/**
+	 * Parses input from the specified document.
+	 *
+	 * @param doc The document to parse.  This document is in a read lock,
+	 *        so it cannot be modified while parsing is occurring.
+	 * @param style The language being rendered, such as
+	 *        {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+	 * @return An object describing the section of the document parsed and the
+	 *         results.  This is guaranteed to be non-<code>null</code>.
+	 */
+	public ParseResult parse(RSyntaxDocument doc, String style);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java	(revision 25584)
@@ -0,0 +1,130 @@
+/*
+ * 09/23/2005
+ *
+ * ParserNotice.java - A notice (i.e, and error or warning) from a parser.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+
+
+/**
+ * A notice (e.g., a warning or error) from a parser.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see DefaultParserNotice
+ */
+public interface ParserNotice extends Comparable {
+
+	/**
+	 * Indicates an info notice.
+	 */
+	public static final int INFO		= 2;
+
+	/**
+	 * Indicates a warning notice.
+	 */
+	public static final int WARNING		= 1;
+
+	/**
+	 * Indicates an error notice.
+	 */
+	public static final int ERROR		= 0;
+
+
+	/**
+	 * Returns whether this parser notice contains the specified location
+	 * in the document.
+	 *
+	 * @param pos The position in the document.
+	 * @return Whether the position is contained.  This will always return
+	 *         <code>false</code> if {@link #getOffset()} returns
+	 *         <code>-1</code>.
+	 */
+	public boolean containsPosition(int pos);
+
+
+	/**
+	 * Returns the color to use when painting this notice.
+	 *
+	 * @return The color.
+	 */
+	public Color getColor();
+
+
+	/**
+	 * Returns the length of the code the message is concerned with.
+	 *
+ 	 * @return The length of the code the message is concerned with, or
+ 	 *         <code>-1</code> if unknown.
+ 	 * @see #getOffset()
+ 	 * @see #getLine()
+	 */
+	public int getLength();
+
+
+	/**
+	 * Returns the level of this notice.
+	 *
+	 * @return One of {@link #INFO}, {@link #WARNING} OR {@link #ERROR}.
+	 */
+	public int getLevel();
+
+
+	/**
+	 * Returns the line number the notice is about.
+	 *
+	 * @return The line number.
+	 */
+	public int getLine();
+
+
+	/**
+	 * Returns the message from the parser.
+	 *
+	 * @return The message from the parser.
+	 */
+	public String getMessage();
+
+
+	/**
+	 * Returns the offset of the code the message is concerned with.
+	 *
+	 * @return The offset, or <code>-1</code> if unknown.
+	 * @see #getLength()
+	 * @see #getLine()
+	 */
+	public int getOffset();
+
+
+	/**
+	 * Returns the parser that created this message.
+	 *
+	 * @return The parser.
+	 */
+	public Parser getParser();
+
+
+	/**
+	 * Whether a squiggle underline should be drawn in the editor for this
+	 * notice.
+	 *
+	 * @return Whether a squiggle underline should be drawn.
+	 */
+	public boolean getShowInEditor();
+
+
+	/**
+	 * Returns the tooltip text to display for this notice.
+	 *
+	 * @return The tool tip text.  If none has been explicitly set, this
+	 *         method returns the same text as {@link #getMessage()}.
+	 */
+	public String getToolTipText();
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java	(revision 25584)
@@ -0,0 +1,158 @@
+/*
+ * 08/11/2009
+ *
+ * TaskTagParser.java - Parser that scans code comments for task tags.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.ErrorStrip;
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Parser that identifies "task tags," such as "<code>TODO</code>",
+ * "<code>FIXME</code>", etc. in source code comments.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class TaskTagParser extends AbstractParser {
+
+	private DefaultParseResult result;
+	private String DEFAULT_TASK_PATTERN	= "TODO|FIXME|HACK";
+	private Pattern taskPattern;
+
+	private static final Color COLOR = new Color(48, 150, 252);
+
+
+	/**
+	 * Creates a new task parser.  The default parser treats the following
+	 * identifiers in comments as task definitions:  "<code>TODO</code>",
+	 * "<code>FIXME</code>", and "<code>HACK</code>".
+	 */
+	public TaskTagParser() {
+		result = new DefaultParseResult(this);
+		setTaskPattern(DEFAULT_TASK_PATTERN);
+	}
+
+
+	/**
+	 * Returns the regular expression used to search for tasks.
+	 *
+	 * @return The regular expression.  This may be <code>null</code> if no
+	 *         regular expression was specified (or an empty string was
+	 *         specified).
+	 * @see #setTaskPattern(String)
+	 */
+	public String getTaskPattern() {
+		return taskPattern==null ? null : taskPattern.pattern();
+	}
+
+
+	public ParseResult parse(RSyntaxDocument doc, String style) {
+
+		Element root = doc.getDefaultRootElement();
+		int lineCount = root.getElementCount();
+
+		if (taskPattern==null ||
+				style==null || SyntaxConstants.SYNTAX_STYLE_NONE.equals(style)){
+			result.clearNotices();
+			result.setParsedLines(0, lineCount-1);
+			return result;
+		}
+
+		// TODO: Pass in parsed line range and just do that
+		result.clearNotices();
+		result.setParsedLines(0, lineCount-1);
+
+		for (int line=0; line<lineCount; line++) {
+
+			Token t = doc.getTokenListForLine(line);
+			int offs = -1;
+			int start = -1;
+			String text = null;
+
+			while (t!=null && t.isPaintable()) {
+				if (t.isComment()) {
+
+					offs = t.offset;
+					text = t.getLexeme();
+
+					Matcher m = taskPattern.matcher(text);
+					if (m.find()) {
+						start = m.start();
+						offs += start;
+						break;
+					}
+
+				}
+				t = t.getNextToken();
+			}
+
+			if (start>-1) {
+				text = text.substring(start);
+				// TODO: Strip off end of MLC's if they're there.
+				int len = text.length();
+				TaskNotice pn = new TaskNotice(this, text, line, offs, len);
+				pn.setLevel(ParserNotice.INFO);
+				pn.setShowInEditor(false);
+				pn.setColor(COLOR);
+				result.addNotice(pn);
+			}
+
+		}
+
+		return result;
+
+	}
+
+
+	/**
+	 * Sets the pattern of task identifiers.  You will usually want this to be
+	 * a list of words "or'ed" together, such as
+	 * "<code>TODO|FIXME|HACK|REMIND</code>".
+	 *
+	 * @param pattern The pattern.  A value of <code>null</code> or an
+	 *        empty string effectively disables task parsing.
+	 * @throws PatternSyntaxException If <code>pattern</code> is an invalid
+	 *         regular expression.
+	 * @see #getTaskPattern()
+	 */
+	public void setTaskPattern(String pattern) throws PatternSyntaxException {
+		if (pattern==null || pattern.length()==0) {
+			taskPattern = null;
+		}
+		else {
+			taskPattern = Pattern.compile(pattern);
+		}
+	}
+
+
+	/**
+	 * A parser notice that signifies a task.  This class is here so we can
+	 * treat tasks specially and show them in the {@link ErrorStrip} even
+	 * though they are <code>INFO</code>-level and marked as "don't show in
+	 * editor."
+	 */
+	public static class TaskNotice extends DefaultParserNotice {
+
+		public TaskNotice(Parser parser, String message, int line, int offs,
+							int length) {
+			super(parser, message, line, offs, length);
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java	(revision 25584)
@@ -0,0 +1,95 @@
+/*
+ * 07/29/2009
+ *
+ * ToolTipInfo.java - A tool tip's text and hyperlink listener.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+import javax.swing.event.HyperlinkListener;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * Wrapper for a tool tip and a listener for hyperlink events in the tool
+ * tip (assuming the tip is HTML).  If the {@link RSyntaxTextArea} instance
+ * has {@link FocusableTip}s enabled, and the user clicks on a hyperlink in
+ * the tool tip, the specified {@link HyperlinkListener} will be called.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class ToolTipInfo {
+
+	private String text;
+	private HyperlinkListener listener;
+	private URL imageBase;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The tool tip text, or <code>null</code> for none.
+	 * @param listener The hyperlink listener, or <code>null</code> for none.
+	 */
+	public ToolTipInfo(String text, HyperlinkListener listener) {
+		this(text, listener, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The tool tip text, or <code>null</code> for none.
+	 * @param l The hyperlink listener, or <code>null</code> for none.
+	 * @param imageBase The base URL for images in the HTML <code>text</code>,
+	 *        or <code>null</code> for the default.
+	 */
+	public ToolTipInfo(String text, HyperlinkListener l, URL imageBase) {
+		this.text = text;
+		this.listener = l;
+		this.imageBase = imageBase;
+	}
+
+
+	/**
+	 * Returns the listener to call when hyperlinks are clicked in the tool
+	 * tip.
+	 *
+	 * @return The listener, or <code>null</code> for none.
+	 */
+	public HyperlinkListener getHyperlinkListener() {
+		return listener;
+	}
+
+
+	/**
+	 * Returns the base URL that any images in the HTML tool tip live in.
+	 * This allows you to reference images in a jar file in your
+	 * {@link FocusableTip}s.
+	 * Note that if what {@link #getToolTipText()} returns isn't HTML, this
+	 * value is effectively ignored.
+	 *
+	 * @return The image base, or <code>null</code> for the default.
+	 */
+	public URL getImageBase() {
+		return imageBase;
+	}
+
+
+	/**
+	 * Returns the tool tip text to display.
+	 *
+	 * @return The tool tip text, or <code>null</code> for none.
+	 */
+	public String getToolTipText() {
+		return text;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java	(revision 25584)
@@ -0,0 +1,137 @@
+/*
+ * 08/16/2008
+ *
+ * XMLParser.java - Simple XML parser.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+
+import org.fife.io.DocumentReader;
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+
+
+/**
+ * A parser for XML documents.  Adds squiggle underlines for any XML errors
+ * found (though most XML parsers don't really have error recovery and so only
+ * can find one error at a time).<p>
+ *
+ * This class isn't actually used by RSyntaxTextArea anywhere, but you can
+ * install and use it yourself.  Doing so is as simple as:
+ * 
+ * <pre>
+ * XmlParser xmlParser = new XmlParser();
+ * textArea.addParser(xmlParser);
+ * </pre>
+ *
+ * Also note that a single instance of this class can be installed on
+ * multiple instances of <code>RSyntaxTextArea</code>.
+ *
+ * For a more complete XML parsing solution, see the
+ * <a href="http://svn.fifesoft.com/viewvc-1.0.5/bin/cgi/viewvc.cgi/RSTALanguageSupport/trunk/?root=RSyntaxTextArea">RSTALanguageSupport
+ * project</a>'s <code>XmlLanguageSupport</code> class.
+ * 
+ * @author Robert Futrell
+ * @version 1.1
+ */
+public class XmlParser extends AbstractParser {
+
+	private SAXParserFactory spf;
+	private DefaultParseResult result;
+
+
+	public XmlParser() {
+		result = new DefaultParseResult(this);
+		try {
+			spf = SAXParserFactory.newInstance();
+		} catch (FactoryConfigurationError fce) {
+			fce.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ParseResult parse(RSyntaxDocument doc, String style) {
+
+		result.clearNotices();
+		Element root = doc.getDefaultRootElement();
+		result.setParsedLines(0, root.getElementCount()-1);
+
+		if (spf==null) {
+			return result;
+		}
+
+		try {
+			SAXParser sp = spf.newSAXParser();
+			Handler handler = new Handler(doc);
+			DocumentReader r = new DocumentReader(doc);
+			InputSource input = new InputSource(r);
+			sp.parse(input, handler);
+			r.close();
+		} catch (SAXParseException spe) {
+			// A fatal parse error - ignore; a ParserNotice was already created.
+		} catch (Exception e) {
+			e.printStackTrace();
+			result.addNotice(new DefaultParserNotice(this,
+					"Error parsing XML: " + e.getMessage(), 0, -1, -1));
+		}
+
+		return result;
+
+	}
+
+
+	/**
+	 * Callback notified when errors are found in the XML document.  Adds a
+	 * notice to be squiggle-underlined.
+	 */
+	private class Handler extends DefaultHandler {
+
+		private Document doc;
+
+		private Handler(Document doc) {
+			this.doc = doc;
+		}
+
+		private void doError(SAXParseException e, int level) {
+			int line = e.getLineNumber() - 1;
+			Element root = doc.getDefaultRootElement();
+			Element elem = root.getElement(line);
+			int offs = elem.getStartOffset();
+			int len = elem.getEndOffset() - offs;
+			if (line==root.getElementCount()-1) {
+				len++;
+			}
+			DefaultParserNotice pn = new DefaultParserNotice(XmlParser.this,
+											e.getMessage(), line, offs, len);
+			pn.setLevel(level);
+			result.addNotice(pn);
+		}
+
+		public void error(SAXParseException e) {
+			doError(e, ParserNotice.ERROR);
+		}
+
+		public void fatalError(SAXParseException e) {
+			doError(e, ParserNotice.ERROR);
+		}
+
+		public void warning(SAXParseException e) {
+			doError(e, ParserNotice.WARNING);
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/parser/package.html	(revision 25584)
@@ -0,0 +1,9 @@
+<html>
+	<body>
+	Interfaces for parsing text in RSyntaxTextAreas and identifying errors,
+	warnings, etc.  Implementations of the <code>Parser</code>  interface
+	are notified when the document has been modified, so they can add
+	squiggle-underline markers to instances of RSTA to signify code errors and
+	other important snippets.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java	(revision 25584)
@@ -0,0 +1,132 @@
+/*
+ * 12/01/2008
+ *
+ * AbstractCodeTemplate.java - Base class for code templates.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+
+/**
+ * A base class to build code templates on top of.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractCodeTemplate implements CodeTemplate {
+
+	/**
+	 * The ID of this template.
+	 */
+	private String id;
+
+
+	/**
+	 * This no-arg constructor is required for serialization purposes.
+	 */
+	public AbstractCodeTemplate() {
+	}
+
+
+	/**
+	 * Creates a new template.
+	 *
+	 * @param id The ID for this template.
+	 * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+	 */
+	public AbstractCodeTemplate(String id) {
+		setID(id);
+	}
+
+
+	/**
+	 * Creates a deep copy of this template.
+	 *
+	 * @return A deep copy of this template.
+	 */
+	public Object clone() {
+		// This method can't be abstract as compilers don't like concrete
+		// subclassses calling super.clone() on  an abstract super.
+		try {
+			return super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new InternalError(
+				"CodeTemplate implementation not Cloneable: " +
+							getClass().getName());
+		}
+	}
+
+
+
+	/**
+	 * Compares the <code>StaticCodeTemplate</code> to another.
+	 *
+	 * @param o Another <code>StaticCodeTemplate</code> object.
+	 * @return A negative integer, zero, or a positive integer as this
+	 *         object is less than, equal-to, or greater than the passed-in
+	 *         object.
+	 * @throws ClassCastException If <code>o</code> is
+	 *         not an instance of <code>CodeTemplate</code>.
+	 */
+	public int compareTo(Object o) {
+		if (!(o instanceof CodeTemplate)) {
+			return -1;
+		}
+		CodeTemplate t2 = (CodeTemplate)o;
+		return getID().compareTo(t2.getID());
+	}
+
+
+	/**
+	 * Overridden to return "<code>true</code>" iff {@link #compareTo(Object)}
+	 * returns <code>0</code>.
+	 *
+	 * @return Whether this code template is equal to another.
+	 */
+	public boolean equals(Object obj) {
+		if (obj instanceof CodeTemplate) {
+			return compareTo(obj)==0;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns the ID of this code template.
+	 *
+	 * @return The template's ID.
+	 * @see #setID(String)
+	 */
+	public String getID() {
+		return id;
+	}
+
+
+	/**
+	 * Returns the hash code for this template.
+	 *
+	 * @return The hash code for this template.
+	 */
+	public int hashCode() {
+		return id.hashCode();
+	}
+
+
+	/**
+	 * Sets the ID for this template.
+	 *
+	 * @param id The ID for this template.
+	 * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+	 * @see #getID()
+	 */
+	public void setID(String id) {
+		if (id==null) {
+			throw new IllegalArgumentException("id cannot be null");
+		}
+		this.id = id;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java	(revision 25584)
@@ -0,0 +1,73 @@
+/*
+ * 11/29/2008
+ *
+ * CodeTemplate.java - A "template" (macro) for commonly-typed code.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+import java.io.Serializable;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * A "code template" is a kind of macro for commonly-typed code.  It
+ * associates a short identifier with a longer code snippet, then when the
+ * code template is enabled and the short identifier is typed, it is
+ * replaced with the longer code snippet.<p>
+ *
+ * For example, you can associate the identifier <code>forb</code>
+ * (short for "for-block") with the following code:<p>
+ *
+ * <pre>
+ *   for (&lt;caret&gt;) {
+ *
+ *   }
+ * </pre>
+ *
+ * Then, whenever you type <code>forb</code> followed by a trigger
+ * (e.g., a space) into a text area with this <code>CodeTemplate</code>,
+ * the code snippet is added in place of <code>forb</code>.  Further,
+ * the caret is placed at the position denoted by <code>&lt;caret&gt;</code>.<p>
+ *
+ * Static text replacements are done with {@link StaticCodeTemplate}.  Dynamic
+ * templates can also be created and used.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see StaticCodeTemplate
+ */
+public interface CodeTemplate extends Cloneable, Comparable, Serializable {
+
+
+	/**
+	 * Creates a deep copy of this template.
+	 *
+	 * @return A deep copy of this template.
+	 */
+	public Object clone();
+
+
+	/**
+	 * Returns the ID of this code template.
+	 *
+	 * @return The template's ID.
+	 */
+	public String getID();
+
+
+	/**
+	 * Invokes this code template.  The changes are made to the given text
+	 * area.
+	 *
+	 * @param textArea The text area to operate on.
+	 * @throws BadLocationException If something bad happens.
+	 */
+	public void invoke(RSyntaxTextArea textArea) throws BadLocationException;
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java	(revision 25584)
@@ -0,0 +1,262 @@
+/*
+ * 02/21/2005
+ *
+ * CodeTemplate.java - A "template" (macro) for commonly-typed code.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * A code template that inserts static text before and after the caret.<p>
+ *
+ * For example, you can associate the identifier <code>forb</code>
+ * (short for "for-block") with the following code:<p>
+ *
+ * <pre>
+ *   for (&lt;caret&gt;) {
+ *
+ *   }
+ * </pre>
+ *
+ * Then, whenever you type <code>forb</code> followed by a trigger
+ * (e.g., a space) into a text area with this <code>CodeTemplate</code>,
+ * the code snippet is added in place of <code>forb</code>.  Further,
+ * the caret is placed at the position denoted by <code>&lt;caret&gt;</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see CodeTemplate
+ */
+public class StaticCodeTemplate extends AbstractCodeTemplate {
+
+	private static final long serialVersionUID = 1;
+
+	/**
+	 * The code inserted before the caret position.
+	 */
+	private String beforeCaret;
+
+	/**
+	 * The code inserted after the caret position.
+	 */
+	private String afterCaret;
+
+	/**
+	 * Cached value representing whether <code>beforeCaret</code> contains
+	 * one or more newlines.
+	 */
+	private transient int firstBeforeNewline;
+
+	/**
+	 * Cached value representing whether <code>afterCaret</code> contains
+	 * one or more newlines.
+	 */
+	private transient int firstAfterNewline;
+
+	private static final String EMPTY_STRING		= "";
+
+
+	/**
+	 * Constructor.  This constructor only exists to support persistance
+	 * through serialization.
+	 */
+	public StaticCodeTemplate() {
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param id The ID of this code template.
+	 * @param beforeCaret The text to place before the caret.
+	 * @param afterCaret The text to place after the caret.
+	 */
+	public StaticCodeTemplate(String id, String beforeCaret, String afterCaret){
+		super(id);
+		setBeforeCaretText(beforeCaret);
+		setAfterCaretText(afterCaret);
+	}
+
+
+	/**
+	 * Returns the text that will be placed after the caret.
+	 *
+	 * @return The text.
+	 * @see #setAfterCaretText
+	 */
+	public String getAfterCaretText() {
+		return afterCaret;
+	}
+
+
+	/**
+	 * Returns the text that will be placed before the caret.
+	 *
+	 * @return The text.
+	 * @see #setBeforeCaretText
+	 */
+	public String getBeforeCaretText() {
+		return beforeCaret;
+	}
+
+
+	/**
+	 * Returns the "after caret" text, with each new line indented by
+	 * the specified amount.
+	 *
+	 * @param indent The amount to indent.
+	 * @return The "after caret" text.
+	 */
+	private String getAfterTextIndented(String indent) {
+		return getTextIndented(getAfterCaretText(), firstAfterNewline, indent);
+	}
+
+
+	/**
+	 * Returns the "before caret" text, with each new line indented by
+	 * the specified amount.
+	 *
+	 * @param indent The amount to indent.
+	 * @return The "before caret" text.
+	 */
+	private String getBeforeTextIndented(String indent) {
+		return getTextIndented(getBeforeCaretText(),firstBeforeNewline,indent);
+	}
+
+
+	/**
+	 * Returns text with newlines indented by the specifed amount.
+	 *
+	 * @param text The original text.
+	 * @param firstNewline The index of the first '\n' character.
+	 * @param indent The amount to indent.
+	 * @return The indented text.
+	 */
+	private String getTextIndented(String text,int firstNewline,String indent) {
+		if (firstNewline==-1) {
+			return text;
+		}
+		int pos = 0;
+		int old = firstNewline+1;
+		StringBuffer sb = new StringBuffer(text.substring(0, old));
+		sb.append(indent);
+		while ((pos=text.indexOf('\n', old))>-1) {
+			sb.append(text.substring(old, pos+1));
+			sb.append(indent);
+			old = pos+1;
+		}
+		if (old<text.length()) {
+			sb.append(text.substring(old));
+		}
+		return sb.toString();
+	}
+
+
+	/**
+	 * Invokes this code template.  The changes are made to the given text
+	 * area.
+	 *
+	 * @param textArea The text area to operate on.
+	 * @throws BadLocationException If something bad happens.
+	 */
+	public void invoke(RSyntaxTextArea textArea) throws BadLocationException {
+
+		Caret c = textArea.getCaret();
+		int dot = c.getDot();
+		int mark = c.getMark();
+		int p0 = Math.min(dot, mark);
+		int p1 = Math.max(dot, mark);
+		RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+		Element map = doc.getDefaultRootElement();
+
+		int lineNum = map.getElementIndex(dot);
+		Element line = map.getElement(lineNum);
+		int start = line.getStartOffset();
+		int end = line.getEndOffset()-1; // Why always "-1"?
+		String s = textArea.getText(start,end-start);
+		int len = s.length();
+
+		// endWS is the end of the leading whitespace
+		// of the current line.
+		int endWS = 0;
+		while (endWS<len && RSyntaxUtilities.isWhitespace(s.charAt(endWS))) {
+			endWS++;
+		}
+		s = s.substring(0, endWS);
+		p0 -= getID().length();
+		String beforeText = getBeforeTextIndented(s);
+		String afterText = getAfterTextIndented(s);
+		doc.replace(p0,p1-p0, beforeText+afterText, null);
+		textArea.setCaretPosition(p0+beforeText.length());
+
+	}
+
+
+	/**
+	 * Called when reading a serialized version of this document.  This is
+	 * overridden to initialize the transient members of this class.
+	 *
+	 * @param in The input stream to read from.
+	 * @throws ClassNotFoundException Never.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void readObject(ObjectInputStream in) throws ClassNotFoundException,
+											IOException  {
+		in.defaultReadObject();
+		// "Resetting" before and after text to the same values will replace
+		// nulls with empty srings, and set transient "first*Newline" values.
+		setBeforeCaretText(this.beforeCaret);
+		setAfterCaretText(this.afterCaret);
+	}
+
+
+	/**
+	 * Sets the text to place after the caret.
+	 *
+	 * @param afterCaret The text.
+	 * @see #getAfterCaretText()
+	 */
+	public void setAfterCaretText(String afterCaret) {
+		this.afterCaret = afterCaret==null ? EMPTY_STRING : afterCaret;
+		firstAfterNewline = this.afterCaret.indexOf('\n');
+	}
+
+
+	/**
+	 * Sets the text to place before the caret.
+	 *
+	 * @param beforeCaret The text.
+	 * @see #getBeforeCaretText()
+	 */
+	public void setBeforeCaretText(String beforeCaret) {
+		this.beforeCaret = beforeCaret==null ? EMPTY_STRING : beforeCaret;
+		firstBeforeNewline = this.beforeCaret.indexOf('\n');
+	}
+
+
+	/**
+	 * Returns a string representation of this template for debugging
+	 * purposes.
+	 *
+	 * @return A string representation of this template.
+	 */
+	public String toString() {
+		return "[StaticCodeTemplate: id=" + getID() +
+			", text=" + getBeforeCaretText() + "|" + getAfterCaretText() + "]";
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rsyntaxtextarea/templates/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	Facilitates adding code templates to an <code>RSyntaxTextArea</code>.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/AbstractGutterComponent.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/AbstractGutterComponent.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/AbstractGutterComponent.java	(revision 25584)
@@ -0,0 +1,114 @@
+/*
+ * 02/17/2009
+ *
+ * AbstractGutterComponent.java - A component that can be displayed in a Gutter.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Container;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.JPanel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.View;
+
+
+/**
+ * A component that can be displayed in a {@link Gutter}.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+abstract class AbstractGutterComponent extends JPanel {
+
+	/**
+	 * The text area whose lines we are marking with icons.
+	 */
+	protected RTextArea textArea;
+
+	/**
+	 * The number of lines in the text area.
+	 */
+	protected int currentLineCount;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area.
+	 */
+	public AbstractGutterComponent(RTextArea textArea) {
+		setTextArea(textArea);
+	}
+
+
+	/**
+	 * Returns the bounds of a child view as a rectangle, since
+	 * <code>View</code>s tend to use <code>Shape</code>.
+	 *
+	 * @param parent The parent view of the child whose bounds we're getting.
+	 * @param line The index of the child view.
+	 * @param editorRect Returned from the text area's
+	 *        <code>getVisibleEditorRect</code> method.
+	 * @return The child view's bounds.
+	 */
+	protected static final Rectangle getChildViewBounds(View parent, int line,
+										Rectangle editorRect) {
+		Shape alloc = parent.getChildAllocation(line, editorRect);
+		if (alloc==null) {
+			// WrappedSyntaxView can have this when made so small it's
+			// no longer visible
+			return new Rectangle();
+		}
+		return alloc instanceof Rectangle ? (Rectangle)alloc :
+										alloc.getBounds();
+	}
+
+
+	/**
+	 * Returns the parent <code>Gutter</code> component.
+	 *
+	 * @return The parent <code>Gutter</code>.
+	 */
+	protected Gutter getGutter() {
+		Container parent = getParent();
+		return (parent instanceof Gutter) ? (Gutter)parent : null;
+	}
+
+
+	/**
+	 * Called when text is inserted to or removed from the text area.
+	 * Implementations can take this opportunity to repaint, revalidate, etc.
+	 *
+	 * @param e The document event.
+	 */
+	abstract void handleDocumentEvent(DocumentEvent e);
+
+
+	/**
+	 * Called when the line heights of the text area change.  This is usually
+	 * the result of one or more of the fonts in the editor changing.
+	 */
+	abstract void lineHeightsChanged();
+
+
+	/**
+	 * Sets the text area being displayed.  Subclasses can override, but
+	 * should call the super implementation.
+	 *
+	 * @param textArea The text area.
+	 */
+	public void setTextArea(RTextArea textArea) {
+		this.textArea = textArea;
+		int lineCount = textArea==null ? 0 : textArea.getLineCount();
+		if (currentLineCount!=lineCount) {
+			currentLineCount = lineCount;
+			repaint();
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/BackgroundPainterStrategy.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/BackgroundPainterStrategy.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/BackgroundPainterStrategy.java	(revision 25584)
@@ -0,0 +1,44 @@
+/*
+ * 01/22/2005
+ *
+ * BackgroundPainterStrategy.java - Renders an RTextAreaBase's background
+ * using some strategy.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+
+
+/**
+ * Interface for classes that paint the background of an
+ * <code>RTextAreaBase</code>.  The Strategy pattern is used for this
+ * object because the background can be painted as a solid color, as
+ * an image, and possibly other ways (gradients, animated images, etc.).
+ * When a method to change the background of an <code>RTextAreaBase</code>
+ * instance is called (such as <code>setBackground</code>,
+ * <code>setBackgroundImage</code> or <code>setBackgoundObject</code>),
+ * the correct strategy is then created and used to paint its background.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.ColorBackgroundPainterStrategy
+ */
+public interface BackgroundPainterStrategy {
+
+
+	/**
+	 * Paints the background.
+	 *
+	 * @param g The graphics context.
+	 * @param bounds The bounds of the object whose backgrouns we're
+	 *        painting.
+	 */
+	public void paint(Graphics g, Rectangle bounds);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java	(revision 25584)
@@ -0,0 +1,98 @@
+/*
+ * 01/22/2005
+ *
+ * BufferedImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image using a BufferedImage.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image.  The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * A <code>java.awt.image.BufferedImage</code> is used for rendering;
+ * theoretically, for performance you should use
+ * <code>java.awt.image.VolatileImage</code>; see
+ * <code>org.fife.ui.RTextArea.VolatileImageBackgroundPainterStrategy</code>
+ * for this.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.VolatileImageBackgroundPainterStrategy
+ */
+public class BufferedImageBackgroundPainterStrategy
+					extends ImageBackgroundPainterStrategy {
+
+	private Image bgImage;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param ta The text area whose background we'll be painting.
+	 */
+	public BufferedImageBackgroundPainterStrategy(RTextAreaBase ta) {
+		super(ta);
+	}
+
+
+	/**
+	 * Paints the image at the specified location.  This method assumes
+	 * scaling has already been done, and simply paints the background
+	 * image "as-is."
+	 *
+	 * @param g The graphics context.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 */
+	protected void paintImage(Graphics g, int x, int y) {
+		if (bgImage != null)
+			g.drawImage(bgImage, x,y, null);
+	}
+
+
+	/**
+	 * Rescales the displayed image to be the specified size.
+	 *
+	 * @param width The new width of the image.
+	 * @param height The new height of the image.
+	 * @param hint The scaling hint to use.
+	 */
+	protected void rescaleImage(int width, int height, int hint) {
+		Image master = getMasterImage();
+		if (master!=null) {
+			bgImage = master.getScaledInstance(width,height, hint);
+			tracker.addImage(bgImage, 1);
+			try {
+				tracker.waitForID(1);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+				bgImage = null;
+				return;
+			} finally {
+				tracker.removeImage(bgImage, 1);
+			}
+		}
+		else {
+			bgImage = null;
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ChangeableHighlightPainter.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ChangeableHighlightPainter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ChangeableHighlightPainter.java	(revision 25584)
@@ -0,0 +1,422 @@
+/*
+ * 11/10/2004
+ *
+ * ChangableHighlightPainter.java - A highlight painter whose color you can
+ * change.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.SystemColor;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.LayeredHighlighter;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * An extension of <code>LayerPainter</code> that allows the user to
+ * change several of its properties:
+ *
+ * <ul>
+ *   <li>Its color/fill style (can use a <code>GradientPaint</code>, for
+ *       example).</li>
+ *   <li>Whether the edges of a painted highlight are rounded.</li>
+ *   <li>Whether painted highlights have translucency.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class ChangeableHighlightPainter
+		extends LayeredHighlighter.LayerPainter implements Serializable {
+
+
+	/**
+	 * The <code>Paint</code>/<code>Color</code> of this highlight.
+	 */
+	private Paint paint;
+
+	/**
+	 * Whether selections have rounded edges.
+	 */
+	private boolean roundedEdges;
+
+	/**
+	 * The alpha composite used to render with translucency.
+	 */
+	private transient AlphaComposite alphaComposite;
+
+	/**
+	 * The alpha value used in computing translucency.  This should stay in the
+	 * range <code>0.0f</code> (completely invisible) to <code>1.0f</code>
+	 * (completely opaque).
+	 */
+	private float alpha;
+
+
+	private static final int ARCWIDTH				= 8;
+	private static final int ARCHEIGHT				= 8;
+
+
+	/**
+	 * Creates a new <code>ChangableHighlightPainter</code> that paints
+	 * highlights with the text area's selection color (i.e., behaves exactly
+	 * like
+	 * <code>javax.swing.text.DefaultHighlighter.DefaultHighlightPainter
+	 * </code>).
+	 */
+	public ChangeableHighlightPainter() {
+		this(null);
+	}
+
+
+	/**
+	 * Creates a new highlight painter using the specified <code>Paint</code>
+	 * without rounded edges.
+	 *
+	 * @param paint The <code>Paint</code> (usually a
+	 *        <code>java.awt.Color</code>) with which to paint the
+	 *        highlights.
+	 */
+	public ChangeableHighlightPainter(Paint paint) {
+		this(paint, false);
+	}
+
+
+	/**
+	 * Creates a new highlight painter.
+	 *
+	 * @param paint The <code>Paint</code> (usually a
+	 *        <code>java.awt.Color</code>) with which to paint the
+	 *        highlights.
+	 * @param rounded Whether to use rounded edges on the highlights.
+	 */
+	public ChangeableHighlightPainter(Paint paint, boolean rounded) {
+		this(paint, rounded, 1.0f);
+	}
+
+
+	/**
+	 * Creates a new highlight painter.
+	 *
+	 * @param paint The <code>Paint</code> (usually a
+	 *        <code>java.awt.Color</code>) with which to paint the
+	 *        highlights.
+	 * @param rounded Whether to use rounded edges on the highlights.
+	 * @param alpha The alpha value to use when painting highlights.  This
+	 *        value should be in the range <code>0.0f</code> (completely
+	 *        transparent) through <code>1.0f</code> (opaque).
+	 */
+	public ChangeableHighlightPainter(Paint paint, boolean rounded,
+											float alpha) {
+		setPaint(paint);
+		setRoundedEdges(rounded);
+		setAlpha(alpha);
+	}
+
+
+	/**
+	 * Returns the alpha value used in computing the translucency of these
+	 * highlights.  A value of <code>1.0f</code> (the default) means that no
+	 * translucency is used; there is no performance hit for this value.  For
+	 * all other values (<code>[0.0f..1.0f)</code>), there will be a
+	 * performance hit.
+	 *
+	 * @return The alpha value.
+	 * @see #setAlpha
+	 */
+	public float getAlpha() {
+		return alpha;
+	}
+
+
+	/**
+	 * Returns the alpha composite to use when rendering highlights with this
+	 * painter.
+	 *
+	 * @return The alpha composite.
+	 */
+	private AlphaComposite getAlphaComposite() {
+		if (alphaComposite==null)
+			alphaComposite = AlphaComposite.getInstance(
+									AlphaComposite.SRC_OVER, alpha);
+		return alphaComposite;
+	}
+
+
+	/**
+	 * Returns the <code>Paint</code> (usually a <code>java.awt.Color</code>)
+	 * being used to paint highlights.
+	 *
+	 * @return The <code>Paint</code>.
+	 * @see #setPaint
+	 */
+	public Paint getPaint() {
+		return paint;
+	}
+
+
+	/**
+	 * Returns whether rounded edges are used when painting selections with
+	 * this highlight painter.
+	 *
+	 * @return Whether rounded edges are used.
+	 * @see #setRoundedEdges
+	 */
+	public boolean getRoundedEdges() {
+		return roundedEdges;
+	}
+
+
+	/**
+	 * Paints a highlight.
+	 *
+	 * @param g the graphics context
+	 * @param offs0 the starting model offset >= 0
+	 * @param offs1 the ending model offset >= offs1
+	 * @param bounds the bounding box for the highlight
+	 * @param c the editor
+	 */
+	public void paint(Graphics g, int offs0, int offs1, Shape bounds,
+					JTextComponent c) {
+
+		Rectangle alloc = bounds.getBounds();
+
+		// Set up translucency if necessary.
+		Graphics2D g2d = (Graphics2D)g;
+		Composite originalComposite = null;
+		if (getAlpha()<1.0f) {
+			originalComposite = g2d.getComposite();
+			g2d.setComposite(getAlphaComposite());
+		}
+
+		try {
+
+			// Determine locations.
+			TextUI mapper = c.getUI();
+			Rectangle p0 = mapper.modelToView(c, offs0);
+			Rectangle p1 = mapper.modelToView(c, offs1);
+			Paint paint = getPaint();
+			if (paint==null)
+				g2d.setColor(c.getSelectionColor());
+			else
+				g2d.setPaint(paint);
+
+			// Entire highlight is on one line.
+			if (p0.y == p1.y) {
+				Rectangle r = p0.union(p1);
+				g2d.fillRect(r.x, r.y, r.width, r.height);
+			}
+
+			// Highlight spans lines.
+			else {
+				int p0ToMarginWidth = alloc.x + alloc.width - p0.x;
+				g2d.fillRect(p0.x, p0.y, p0ToMarginWidth, p0.height);
+				if ((p0.y + p0.height) != p1.y) {
+					g2d.fillRect(alloc.x, p0.y + p0.height, alloc.width, 
+			   					p1.y - (p0.y + p0.height));
+				}
+				g2d.fillRect(alloc.x, p1.y, (p1.x - alloc.x), p1.height);
+			}
+
+		} catch (BadLocationException e) {
+			// Never happens.
+			e.printStackTrace();
+		} finally {
+			// Restore state from before translucency if necessary.
+			if (getAlpha()<1.0f)
+				g2d.setComposite(originalComposite);
+		}
+
+	}
+
+	
+	/**
+	 * Paints a portion of a highlight.
+	 *
+	 * @param g the graphics context
+	 * @param offs0 the starting model offset >= 0
+	 * @param offs1 the ending model offset >= offs1
+	 * @param bounds the bounding box of the view, which is not
+	 *        necessarily the region to paint.
+	 * @param c the editor
+	 * @param view View painting for
+	 * @return region drawing occurred in
+	 */
+	public Shape paintLayer(Graphics g, int offs0, int offs1,
+						Shape bounds, JTextComponent c, View view) {
+
+
+		// Set up translucency if necessary.
+		Graphics2D g2d = (Graphics2D)g;
+		Composite originalComposite = null;
+		if (getAlpha()<1.0f) {
+			originalComposite = g2d.getComposite();
+			g2d.setComposite(getAlphaComposite());
+		}
+
+		// Set the color (our own if defined, otherwise text area's).
+		Paint paint = getPaint();
+		if (paint==null)
+			g2d.setColor(c.getSelectionColor());
+		else
+			g2d.setPaint(paint);
+
+		// Contained in view, can just use bounds.
+		if (offs0==view.getStartOffset() && offs1==view.getEndOffset()) {
+
+			Rectangle alloc;
+			if (bounds instanceof Rectangle)
+				alloc = (Rectangle)bounds;
+			else
+				alloc = bounds.getBounds();
+			
+			g2d.fillRect(alloc.x, alloc.y, alloc.width, alloc.height);
+
+			// Restore state from before translucency if necessary.
+			if (getAlpha()<1.0f)
+				g2d.setComposite(originalComposite);
+
+			return alloc;
+
+		}
+
+		// Should only render part of View.
+		else {
+
+			try {
+
+				Shape shape = view.modelToView(offs0, Position.Bias.Forward,
+										offs1,Position.Bias.Backward,
+										bounds);
+				Rectangle r = (shape instanceof Rectangle) ?
+								(Rectangle)shape : shape.getBounds();
+				if (roundedEdges) {
+					g2d.fillRoundRect(r.x,r.y, r.width,r.height, ARCWIDTH,
+													ARCHEIGHT);
+				}
+				else {
+					g2d.fillRect(r.x, r.y, r.width, r.height);
+				}
+
+				// Restore state from before translucency if necessary.
+				if (getAlpha()<1.0f)
+					g2d.setComposite(originalComposite);
+
+				return r;
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			} finally {
+				// Restore state from before translucency if necessary.
+				if (getAlpha()<1.0f)
+					g2d.setComposite(originalComposite);
+			}
+
+		}
+
+		// Only if exception
+		return null;
+
+	}
+
+
+	/**
+	 * Deserializes a painter.
+	 *
+	 * @param s The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream s)
+						throws ClassNotFoundException, IOException {
+		s.defaultReadObject();
+		// We cheat and always serialize the Paint as a Color.  "-1" means
+		// no Paint (i.e. use system selection color when painting).
+		int rgb = s.readInt();
+		paint = rgb==-1 ? null : new Color(rgb);
+		alphaComposite = null; // Keep FindBugs happy.  This will get set later
+	}
+
+
+	/**
+	 * Sets the alpha value used in rendering highlights.  If this value is
+	 * <code>1.0f</code> (the default), the highlights are rendered completely
+	 * opaque.  This behavior matches that of
+	 * <code>DefaultHighlightPainter</code> and imposes no performance hit.  If
+	 * this value is below <code>1.0f</code>, it represents how opaque the
+	 * highlight will be.  There will be a small performance hit for values
+	 * less than <code>1.0f</code>.
+	 *
+	 * @param alpha The new alpha value to use for transparency.
+	 * @see #getAlpha
+	 */
+	public void setAlpha(float alpha) {
+		this.alpha = alpha;
+		this.alpha = Math.max(alpha, 0.0f);
+		this.alpha = Math.min(1.0f, alpha);
+		alphaComposite = null; // So it is recreated with new alpha.
+	}
+
+
+	/**
+	 * Sets the <code>Paint</code> (usually a <code>java.awt.Color</code>)
+	 * used to paint this highlight.
+	 *
+	 * @param paint The new <code>Paint</code>.
+	 * @see #getPaint
+	 */
+	public void setPaint(Paint paint) {
+		this.paint = paint;
+	}
+
+
+	/**
+	 * Sets whether rounded edges are used when painting this highlight.
+	 *
+	 * @param rounded Whether rounded edges should be used.
+	 * @see #getRoundedEdges
+	 */
+	public void setRoundedEdges(boolean rounded) {
+		roundedEdges = rounded;
+	}
+
+
+	/**
+	 * Serializes this painter.
+	 *
+	 * @param s The stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void writeObject(ObjectOutputStream s) throws IOException {
+		s.defaultWriteObject();
+		int rgb = -1; // No Paint -> Use JTextComponent's selection color
+		if (paint!=null) {
+			// NOTE: We cheat and always serialize the Paint as a Color.
+			// This is (practically) always the case anyway.
+			Color c = (paint instanceof Color) ? ((Color)paint) :
+											SystemColor.textHighlight;
+			rgb = c.getRGB();
+		}
+		s.writeInt(rgb);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java	(revision 25584)
@@ -0,0 +1,108 @@
+/*
+ * 01/22/2005
+ *
+ * ColorBackgroundPainterStrategy.java - Renders an RTextAreaBase's background
+ * as a single color.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as a solid color.  The default background for <code>RTextAreaBase</code>s
+ * is this strategy using the color white.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ */
+public class ColorBackgroundPainterStrategy
+				implements BackgroundPainterStrategy {
+
+	private Color color;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param color The color to use when painting the background.
+	 */
+	public ColorBackgroundPainterStrategy(Color color) {
+		setColor(color);
+	}
+
+
+	/**
+	 * Returns whether or not the specified object is equivalent to
+	 * this one.
+	 *
+	 * @param o2 The object to which to compare.
+	 * @return Whether <code>o2</code> is another
+	 *         <code>ColorBackgroundPainterStrategy</code> representing
+	 *         the same color as this one.
+	 */
+	public boolean equals(Object o2) {
+		return o2!=null &&
+			(o2 instanceof ColorBackgroundPainterStrategy) &&
+			this.color.equals(
+				((ColorBackgroundPainterStrategy)o2).getColor());
+	}
+
+
+	/**
+	 * Returns the color used to paint the background.
+	 *
+	 * @return The color.
+	 * @see #setColor
+	 */
+	public Color getColor() {
+		return color;
+	}
+
+
+	/**
+	 * Returns the hash code to use when placing an object of this type into
+	 * hash maps.  This method is implemented since we overrode
+	 * {@link #equals(Object)}, to keep FindBugs happy.
+	 *
+	 * @return The hash code.
+	 */
+	public int hashCode() {
+		return color.hashCode();
+	}
+
+
+	/**
+	 * Paints the background.
+	 *
+	 * @param g The graphics context.
+	 * @param bounds The bounds of the object whose backgrouns we're
+	 *        painting.
+	 */
+	public void paint(Graphics g, Rectangle bounds) {
+		Color temp = g.getColor();
+		g.setColor(color);
+		g.fillRect(bounds.x,bounds.y, bounds.width,bounds.height);
+		g.setColor(temp);
+	}
+
+
+	/**
+	 * Sets the color used to paint the background.
+	 *
+	 * @param color The color to use.
+	 * @see #getColor
+	 */
+	public void setColor(Color color) {
+		this.color = color;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ConfigurableCaret.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ConfigurableCaret.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ConfigurableCaret.java	(revision 25584)
@@ -0,0 +1,722 @@
+/*
+ * 12/21/2004
+ *
+ * ConfigurableCaret.java - The caret used by RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.datatransfer.*;
+import java.awt.event.ActionEvent;
+import java.io.*;
+import javax.swing.*;
+import javax.swing.plaf.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The caret used by {@link RTextArea}.  This caret has all of the properties
+ * that <code>javax.swing.text.DefaultCaret</code> does, as well as adding the
+ * following niceties:
+ *
+ * <ul>
+ *   <li>This caret can paint itself several different ways:
+ *      <ol>
+ *         <li>As a vertical line (like <code>DefaultCaret</code>)</li>
+ *         <li>As a slightly thicker vertical line (like Eclipse)</li>
+ *         <li>As an underline</li>
+ *         <li>As a "block caret"</li>
+ *         <li>As a rectangle around the current character</li>
+ *      </ol></li>
+ *   <li>On Microsoft Windows and other operating systems that do not
+ *       support system selection (i.e., selecting text, then pasting
+ *       via the middle mouse button), clicking the middle mouse button
+ *       will cause a regular paste operation to occur.  On systems
+ *       that support system selection (i.e., all UNIX variants),
+ *       the middle mouse button will behave normally.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class ConfigurableCaret extends DefaultCaret {
+
+	/**
+	 * The minimum value of a caret style.
+	 */
+	public static final int MIN_STYLE				= 0;
+
+	/**
+	 * The vertical line style.
+	 */
+	public static final int VERTICAL_LINE_STYLE		= 0;
+
+	/**
+	 * The horizontal line style.
+	 */
+	public static final int UNDERLINE_STYLE			= 1;
+
+	/**
+	 * The block style.
+	 */
+	public static final int BLOCK_STYLE			= 2;
+
+	/**
+	 * The block border style.
+	 */
+	public static final int BLOCK_BORDER_STYLE		= 3;
+
+	/**
+	 * A thicker vertical line (2 pixels instead of 1).
+	 */
+	public static final int THICK_VERTICAL_LINE_STYLE	= 4;
+
+	/**
+	 * The maximum value of a caret style.
+	 */
+	public static final int MAX_STYLE				= THICK_VERTICAL_LINE_STYLE;
+
+	/**
+	 * Action used to select a word on a double click.
+	 */
+	static private transient Action selectWord = null;
+
+	/**
+	 * Action used to select a line on a triple click.
+	 */
+	static private transient Action selectLine = null;
+
+	/**
+	 * holds last MouseEvent which caused the word selection
+	 */
+	private transient MouseEvent selectedWordEvent = null;
+
+	/**
+	 * Used for fastest-possible retrieval of the character at the
+	 * caret's position in the document.
+	 */
+	private transient Segment seg;
+
+	/**
+	 * Whether the caret is a vertical line, a horizontal line, or a block.
+	 */
+	private int style;
+
+	/**
+	 * The selection painter.  By default this paints selections with the
+	 * text area's selection color.
+	 */
+	private ChangeableHighlightPainter selectionPainter;
+
+	/**
+	 * Whether this is Java 1.4.
+	 */
+	/* TODO: Remove me when 1.4 support is removed. */
+	private static final boolean IS_JAVA_1_4 =
+				"1.4".equals(System.getProperty("java.specification.version"));
+
+
+	/**
+	 * Creates the caret using {@link #VERTICAL_LINE_STYLE}.
+	 */
+	public ConfigurableCaret() {
+		this(VERTICAL_LINE_STYLE);
+	}
+
+
+	/**
+	 * Constructs a new <code>ConfigurableCaret</code>.
+	 *
+	 * @param style The style to use when painting the caret.  If this is
+	 *        invalid, then {@link #VERTICAL_LINE_STYLE} is used.
+	 */
+	public ConfigurableCaret(int style) {
+		seg = new Segment();
+		setStyle(style);
+		selectionPainter = new ChangeableHighlightPainter();
+	}
+
+
+	/**
+	 * Adjusts the caret location based on the MouseEvent.
+	 */
+	private void adjustCaret(MouseEvent e) {
+		if ((e.getModifiers()&ActionEvent.SHIFT_MASK)!=0 && getDot()!=-1)
+			moveCaret(e);
+		else
+			positionCaret(e);
+	}
+
+
+	/**
+	 * Adjusts the focus, if necessary.
+	 *
+	 * @param inWindow if true indicates requestFocusInWindow should be used
+	 */
+	private void adjustFocus(boolean inWindow) {
+		RTextArea textArea = getTextArea();
+		if ((textArea != null) && textArea.isEnabled() &&
+				textArea.isRequestFocusEnabled()) {
+			if (inWindow)
+				textArea.requestFocusInWindow();
+			else 
+				textArea.requestFocus();
+		}
+	}
+
+
+	/**
+	 * Overridden to damage the correct width of the caret, since this caret
+	 * can be different sizes.
+	 *
+	 * @param r The current location of the caret.
+	 */
+	protected synchronized void damage(Rectangle r) {
+		if (r != null) {
+			validateWidth(r); // Check for "0" or "1" caret width
+			x = r.x - 1;
+			y = r.y;
+			width = r.width + 4;
+			height = r.height;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Called when the UI is being removed from the
+	 * interface of a JTextComponent.  This is used to
+	 * unregister any listeners that were attached.
+	 *
+	 * @param c The text component.  If this is not an
+	 *        <code>RTextArea</code>, an <code>Exception</code>
+	 *        will be thrown.
+	 * @see Caret#deinstall
+	 */
+	public void deinstall(JTextComponent c) {
+		if (!(c instanceof RTextArea))
+			throw new IllegalArgumentException(
+					"c must be instance of RTextArea");
+		super.deinstall(c);
+		c.setNavigationFilter(null);
+	}
+
+
+	/**
+	 * Gets the text editor component that this caret is bound to.
+	 *
+	 * @return The <code>RTextArea</code>.
+	 */
+	protected RTextArea getTextArea() {
+		return (RTextArea)getComponent();
+	}
+
+
+	/**
+	 * Returns whether this caret's selection uses rounded edges.
+	 *
+	 * @return Whether this caret's edges are rounded.
+	 * @see #setRoundedSelectionEdges
+	 */
+	public boolean getRoundedSelectionEdges() {
+		return ((ChangeableHighlightPainter)getSelectionPainter()).
+								getRoundedEdges();
+	}
+
+
+	/**
+	 * Gets the painter for the Highlighter.  This is overridden to return
+	 * our custom selection painter.
+	 *
+	 * @return The painter.
+	 */
+	protected Highlighter.HighlightPainter getSelectionPainter() {
+		return selectionPainter;
+	}
+
+
+	/**
+	 * Gets the current style of this caret.
+	 *
+	 * @return The caret's style.
+	 * @see #setStyle(int)
+	 */
+	public int getStyle() {
+		return style;
+	}
+
+
+	/**
+	 * Installs this caret on a text component.
+	 *
+	 * @param c The text component.  If this is not an {@link RTextArea},
+	 *        an <code>Exception</code> will be thrown.
+	 * @see Caret#install
+	 */
+	public void install(JTextComponent c) {
+		if (!(c instanceof RTextArea))
+			throw new IllegalArgumentException(
+					"c must be instance of RTextArea");
+		super.install(c);
+		c.setNavigationFilter(new FoldAwareNavigationFilter());
+	}
+	/**
+	 * Called when the mouse is clicked.  If the click was generated from
+	 * button1, a double click selects a word, and a triple click the
+	 * current line.
+	 *
+	 * @param e the mouse event
+	 * @see MouseListener#mouseClicked
+	 */
+	public void mouseClicked(MouseEvent e) {
+
+		if (! e.isConsumed()) {
+
+			RTextArea textArea = getTextArea();
+			int nclicks = e.getClickCount();
+
+			if (SwingUtilities.isLeftMouseButton(e)) {
+				if (nclicks<=2) {
+					// Only handle these clicks for 1.4.  In 1.5 the word
+					// selection is (also?) handled in mousePressed, and if we
+					// handle it here, our word selection gets doubled-up.
+					if (IS_JAVA_1_4) {
+						if (nclicks==1) {
+							selectedWordEvent = null;
+						}
+						else { // 2
+							selectWord(e);
+							selectedWordEvent = null;
+						}
+					}
+				}
+				else {
+					nclicks %= 2; // Alternate selecting word/line.
+					switch (nclicks) {
+						case 0:
+							selectWord(e);
+							selectedWordEvent = null;
+							break;
+						case 1:
+							Action a = null;
+							ActionMap map = textArea.getActionMap();
+							if (map != null)
+								a = map.get(RTextAreaEditorKit.selectLineAction);
+							if (a == null) {
+								if (selectLine == null) {
+									selectLine = new RTextAreaEditorKit.SelectLineAction();
+								}
+								a = selectLine;
+							}
+							a.actionPerformed(new ActionEvent(textArea,
+										ActionEvent.ACTION_PERFORMED,
+										null, e.getWhen(), e.getModifiers()));
+					}
+				}
+			}
+
+			else if (SwingUtilities.isMiddleMouseButton(e)) {
+				if (nclicks == 1 && textArea.isEditable() && textArea.isEnabled()) {
+					// Paste the system selection, if it exists (e.g., on UNIX
+					// platforms, the user can select text, the middle-mouse click
+					// to paste it; this doesn't work on Windows).  If the system
+					// doesn't support system selection, just do a normal paste.
+					JTextComponent c = (JTextComponent) e.getSource();
+					if (c != null) {
+						try {
+							Toolkit tk = c.getToolkit();
+							Clipboard buffer = tk.getSystemSelection();
+							// If the system supports system selections, (e.g. UNIX),
+							// try to do it.
+							if (buffer != null) {
+								adjustCaret(e);
+								TransferHandler th = c.getTransferHandler();
+								if (th != null) {
+									Transferable trans = buffer.getContents(null);
+									if (trans != null)
+										th.importData(c, trans);
+								}
+								adjustFocus(true);
+							}
+							// If the system doesn't support system selections
+							// (e.g. Windows), just do a normal paste.
+							else {
+								textArea.paste();
+							}
+						} catch (HeadlessException he) {
+							// do nothing... there is no system clipboard
+						}
+					} // if (c!=null)
+				} // if (nclicks == 1 && component.isEditable() && component.isEnabled())
+			} // else if (SwingUtilities.isMiddleMouseButton(e))
+
+		} // if (!c.isConsumed())
+
+	}
+
+
+	/**
+	 * Overridden to also focus the text component on right mouse clicks.
+	 *
+	 * @param e The mouse event.
+	 */
+	public void mousePressed(MouseEvent e) {
+		super.mousePressed(e);
+		if (!e.isConsumed() && SwingUtilities.isRightMouseButton(e)) {
+			JTextComponent c = getComponent();
+			if (c!=null && c.isEnabled() && c.isRequestFocusEnabled()) {
+				c.requestFocusInWindow();
+			}
+		}
+	}
+
+
+	/**
+	 * Paints the cursor.
+	 *
+	 * @param g The graphics context in which to paint.
+	 */
+	public void paint(Graphics g) {
+
+		// If the cursor is currently visible...
+		if (isVisible()) {
+
+			try {
+
+				RTextArea textArea = getTextArea();
+				g.setColor(textArea.getCaretColor());
+				TextUI mapper = textArea.getUI();
+				Rectangle r = mapper.modelToView(textArea, getDot());
+
+				// "Correct" the value of rect.width (takes into
+				// account caret being at EOL (and thus rect.width==1),
+				// etc.
+				// We do this even for LINE_STYLE because
+				// if they change from that caret to block/underline,
+				// the first time they do so width==1, so it will take
+				// one caret flash to paint correctly (wider).  If we
+				// do this every time, then it's painted correctly the
+				// first blink.
+				validateWidth(r);
+
+				// This condition is most commonly hit when code folding is
+				// enabled and the user collapses a fold above the caret
+				// position.  If our cached x/y/w/h aren't updated, this caret
+				// appears to stop blinking because the wrong line range gets
+				// damaged.  This check keeps us in sync.
+				if (width>0 && height>0 &&
+						!contains(r.x, r.y, r.width, r.height)) {
+					Rectangle clip = g.getClipBounds();
+					if (clip != null && !clip.contains(this)) {
+						// Clip doesn't contain the old location, force it
+						// to be repainted lest we leave a caret around.
+						repaint();
+					}
+					// This will potentially cause a repaint of something
+					// we're already repainting, but without changing the
+					// semantics of damage we can't really get around this.
+					damage(r);
+				}
+
+				// Need to subtract 2 from height, otherwise
+				// the caret will expand too far vertically.
+				r.height -= 2;
+
+				switch (style) {
+
+					// Draw a big rectangle, and xor the foreground color.
+					case BLOCK_STYLE:
+						Color textAreaBg = textArea.getBackground();
+						if (textAreaBg==null) {
+							textAreaBg = Color.white;
+						}
+						g.setXORMode(textAreaBg);
+						// fills x==r.x to x==(r.x+(r.width)-1), inclusive.
+						g.fillRect(r.x,r.y, r.width,r.height);
+						break;
+
+					// Draw a rectangular border.
+					case BLOCK_BORDER_STYLE:
+						// fills x==r.x to x==(r.x+(r.width-1)), inclusive.
+						g.drawRect(r.x,r.y, r.width-1,r.height);
+						break;
+
+					// Draw an "underline" below the current position.
+					case UNDERLINE_STYLE:
+						textAreaBg = textArea.getBackground();
+						if (textAreaBg==null) {
+							textAreaBg = Color.white;
+						}
+						g.setXORMode(textAreaBg);
+						int y = r.y + r.height;
+						g.drawLine(r.x,y, r.x+r.width-1,y);
+						break;
+
+					// Draw a vertical line.
+					default:
+					case VERTICAL_LINE_STYLE:
+						g.drawLine(r.x,r.y, r.x,r.y+r.height);
+						break;
+
+					// A thicker vertical line.
+					case THICK_VERTICAL_LINE_STYLE:
+						g.drawLine(r.x,r.y, r.x,r.y+r.height);
+						r.x++;
+						g.drawLine(r.x,r.y, r.x,r.y+r.height);
+						break;
+
+				} // End of switch (style).
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			}
+
+		} // End of if (isVisible()).
+
+	}
+
+
+	/**
+	 * Deserializes a caret.  This is overridden to read the caret's style.
+	 *
+	 * @param s The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream s)
+						throws ClassNotFoundException, IOException {
+		s.defaultReadObject();
+		setStyle(s.readInt());
+		seg = new Segment();
+	}
+
+
+	/**
+	 * Selects word based on the MouseEvent
+	 */
+	private void selectWord(MouseEvent e) {
+		if (selectedWordEvent != null
+				&& selectedWordEvent.getX() == e.getX()
+				&& selectedWordEvent.getY() == e.getY()) {
+			// We've already the done selection for this.
+			return;
+		}
+		Action a = null;
+		RTextArea textArea = getTextArea();
+		ActionMap map = textArea.getActionMap();
+		if (map != null) {
+			a = map.get(RTextAreaEditorKit.selectWordAction);
+		}
+		if (a == null) {
+			if (selectWord == null) {
+				selectWord = new RTextAreaEditorKit.SelectWordAction();
+			}
+			a = selectWord;
+		}
+		a.actionPerformed(new ActionEvent(textArea,
+							ActionEvent.ACTION_PERFORMED,
+							null, e.getWhen(), e.getModifiers()));
+		selectedWordEvent = e;
+	}
+
+
+	/**
+	 * Sets whether this caret's selection should have rounded edges.
+	 *
+	 * @param rounded Whether it should have rounded edges.
+	 * @see #getRoundedSelectionEdges()
+	 */
+	public void setRoundedSelectionEdges(boolean rounded) {
+		((ChangeableHighlightPainter)getSelectionPainter()).
+								setRoundedEdges(rounded);
+	}
+
+
+	/**
+	 * Overridden to always render the selection, even when the text component
+	 * loses focus.
+	 *
+	 * @param visible Whether the selection should be visible.  This parameter
+	 *        is ignored.
+	 */
+	public void setSelectionVisible(boolean visible) {
+		super.setSelectionVisible(true);
+	}
+
+
+	/**
+	 * Sets the style used when painting the caret.
+	 *
+	 * @param style The style to use.  If this isn't one of
+	 *        <code>VERTICAL_LINE_STYLE</code>, <code>UNDERLINE_STYLE</code>,
+	 *        or <code>BLOCK_STYLE</code>, then
+	 *        <code>VERTICAL_LINE_STYLE</code> is used.
+	 * @see #getStyle()
+	 */
+	public void setStyle(int style) {
+		if (style<MIN_STYLE || style>MAX_STYLE)
+			style = VERTICAL_LINE_STYLE;
+		this.style = style;
+		repaint();
+	}
+
+
+	/**
+	 * Helper function used by the block and underline carets to ensure the
+	 * width of the painted caret is valid.  This is done for the following
+	 * reasons:
+	 *
+	 * <ul>
+	 *   <li>The <code>View</code> classes in the javax.swing.text package
+	 *       always return a width of "1" when <code>modelToView</code> is
+	 *       called.  We'll be needing the actual width.</li>
+	 *   <li>Even in smart views, such as <code>RSyntaxTextArea</code>'s
+	 *       <code>SyntaxView</code> and <code>WrappedSyntaxView</code> that
+	 *       return the width of the current character, if the caret is at the
+	 *       end of a line for example, the width returned from
+	 *       <code>modelToView</code> will be 0 (as the width of unprintable
+	 *       characters such as '\n' is calculated as 0).  In this case, we'll
+	 *       use a default width value.</li>
+	 * </ul>
+	 *
+	 * @param rect The rectangle returned by the current
+	 *        <code>View</code>'s <code>modelToView</code>
+	 *        method for the caret position.
+	 */
+	private void validateWidth(Rectangle rect) {
+
+		// If the width value > 1, we assume the View is
+		// a "smart" view that returned the proper width.
+		// So only worry about this stuff if width <= 1.
+		if (rect!=null && rect.width<=1) {
+
+			// The width is either 1 (most likely, we're using a "dumb" view
+			// like those in javax.swing.text) or 0 (most likely, we're using
+			// a "smart" view like org.fife.ui.rsyntaxtextarea.SyntaxView,
+			// we're at the end of a line, and the width of '\n' is being
+			// computed as 0).
+
+			try {
+
+				// Try to get a width for the character at the caret
+				// position.  We use the text area's font instead of g's
+				// because g's may vary in an RSyntaxTextArea.
+				RTextArea textArea = getTextArea();
+				textArea.getDocument().getText(getDot(),1, seg);
+				Font font = textArea.getFont();
+				FontMetrics fm = textArea.getFontMetrics(font);
+				rect.width = fm.charWidth(seg.array[seg.offset]);
+
+				// This width being returned 0 likely means that it is an
+				// unprintable character (which is almost 100% to be a
+				// newline char, i.e., we're at the end of a line).  So,
+				// just use the width of a space.
+				if (rect.width==0) {
+					rect.width = fm.charWidth(' ');
+				}
+
+			} catch (BadLocationException ble) {
+				// This shouldn't ever happen.
+				ble.printStackTrace();
+				rect.width = 8;
+			}
+
+		} // End of if (rect!=null && rect.width<=1).
+
+	}
+
+
+	/**
+	 * Serializes this caret.  This is overridden to write the style of the
+	 * caret.
+	 *
+	 * @param s The stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void writeObject(ObjectOutputStream s) throws IOException {
+		s.defaultWriteObject();
+		s.writeInt(getStyle());
+	}
+
+
+	/**
+	 * Keeps the caret out of folded regions in edge cases where it doesn't
+	 * happen automatically, for example, when the caret moves automatically in
+	 * response to Document.insert() and Document.remove() calls.  Most keyboard
+	 * shortcuts already take folding into account, as do viewToModel() and
+	 * modelToView(), so this filter usually does not do anything.<p>
+	 *
+	 * Common cases: backspacing to visible line of collapsed region.
+	 */
+	private class FoldAwareNavigationFilter extends NavigationFilter {
+
+	    public void setDot(FilterBypass fb, int dot, Position.Bias bias) {
+
+	    	RTextArea textArea = getTextArea();
+	        if (textArea instanceof RSyntaxTextArea) {
+
+	        	RSyntaxTextArea rsta = (RSyntaxTextArea)getTextArea();
+	        	if (rsta.isCodeFoldingEnabled()) {
+
+	        		int lastDot = getDot();
+	        		FoldManager fm = rsta.getFoldManager();
+	        		int line = 0;
+	        		try {
+	        			line = textArea.getLineOfOffset(dot);
+	        		} catch (Exception e) {
+	        			e.printStackTrace();
+	        		}
+
+	        		if (fm.isLineHidden(line)) {
+
+	        			//System.out.println("filterBypass: avoiding hidden line");
+	        			try {
+		        			if (dot>lastDot) { // Moving to further line
+		        				int lineCount = textArea.getLineCount();
+		        				while (++line<lineCount &&
+		        						fm.isLineHidden(line));
+		            			if (line<lineCount) {
+		            				dot = textArea.getLineStartOffset(line);
+		            			}
+		            			else { // No lower lines visible 
+		            				UIManager.getLookAndFeel().
+		            						provideErrorFeedback(textArea);
+		            				return;
+		            			}
+		        			}
+		        			else if (dot<lastDot) { // Moving to earlier line
+		        				while (--line>=0 && fm.isLineHidden(line));
+		        				if (line>=0) {
+		        					dot = textArea.getLineEndOffset(line) - 1;
+		        				}
+		        			}
+						} catch (Exception e) {
+							e.printStackTrace();
+							return;
+						}
+
+	        		}
+
+	        	}
+
+	        }
+
+	        super.setDot(fb, dot, bias);
+
+	    }
+
+	    public void moveDot(FilterBypass fb, int dot, Position.Bias bias) {
+	        super.moveDot(fb, dot, bias);
+	    }
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/FoldIndicator.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/FoldIndicator.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/FoldIndicator.java	(revision 25584)
@@ -0,0 +1,668 @@
+/*
+ * 10/08/2011
+ *
+ * FoldIndicator.java - Gutter component allowing the user to expand and
+ * collapse folds.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.Icon;
+import javax.swing.JToolTip;
+import javax.swing.ToolTipManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.MouseInputAdapter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.focusabletip.TipUtil;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * Component in the gutter that displays +/- icons to expand and collapse
+ * fold regions in the editor.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldIndicator extends AbstractGutterComponent {
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Insets textAreaInsets;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Rectangle visibleRect;
+
+	/**
+	 * The fold to show the outline line for.
+	 */
+	private Fold foldWithOutlineShowing;
+
+	/**
+	 * The color to use for fold icon backgrounds, if the default icons
+	 * are used.
+	 */
+	private Color foldIconBackground;
+
+	/**
+	 * The icon used for collapsed folds.
+	 */
+	private Icon collapsedFoldIcon;
+
+	/**
+	 * The icon used for expanded folds.
+	 */
+	private Icon expandedFoldIcon;
+
+	/**
+	 * Whether tool tips are displayed showing the contents of collapsed
+	 * fold regions.
+	 */
+	private boolean showFoldRegionTips;
+
+	/**
+	 * The color used to paint fold outlines.
+	 */
+	static final Color DEFAULT_FOREGROUND = Color.gray;
+
+	/**
+	 * The default color used to paint the "inside" of fold icons.
+	 */
+	static final Color DEFAULT_FOLD_BACKGROUND = Color.white;
+
+	/**
+	 * Listens for events in this component.
+	 */
+	private Listener listener;
+
+	/**
+	 * Width of this component.
+	 */
+	private static final int WIDTH = 12;
+
+
+	public FoldIndicator(RTextArea textArea) {
+		super(textArea);
+		setForeground(DEFAULT_FOREGROUND);
+		setFoldIconBackground(DEFAULT_FOLD_BACKGROUND);
+		collapsedFoldIcon = new FoldIcon(true);
+		expandedFoldIcon = new FoldIcon(false);
+		listener = new Listener(this);
+		visibleRect = new Rectangle();
+		setShowCollapsedRegionToolTips(true);
+	}
+
+
+	/**
+	 * Overridden to use the editor's background if it's detected that the
+	 * user isn't using white as the editor bg, but the system's tool tip
+	 * background is yellow-ish.
+	 *
+	 * @return The tool tip.
+	 */
+	public JToolTip createToolTip() {
+		JToolTip tip = super.createToolTip();
+		Color textAreaBG = textArea.getBackground();
+		if (textAreaBG!=null && !Color.white.equals(textAreaBG)) {
+			Color bg = TipUtil.getToolTipBackground();
+			// If current L&F's tool tip color is close enough to "yellow",
+			// and we're not using the default text background of white, use
+			// the editor background as the tool tip background.
+			if (bg.getRed()>=240 && bg.getGreen()>=240 && bg.getBlue()>=200) {
+				tip.setBackground(textAreaBG);
+			}
+		}
+		return tip;
+	}
+
+
+	private Fold findOpenFoldClosestTo(Point p) {
+
+		Fold fold = null;
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (rsta.isCodeFoldingEnabled()) { // Should always be true
+			int offs = rsta.viewToModel(p); // TODO: Optimize me
+			if (offs>-1) {
+				try {
+					int line = rsta.getLineOfOffset(offs);
+					FoldManager fm = rsta.getFoldManager();
+					fold = fm.getFoldForLine(line);
+					if (fold==null) {
+						fold = fm.getDeepestOpenFoldContaining(offs);
+					}
+				} catch (BadLocationException ble) {
+					ble.printStackTrace(); // Never happens
+				}
+			}
+		}
+	
+		return fold;
+
+	}
+
+
+	/**
+	 * Returns the color to use for the "background" of fold icons.  This
+	 * is be ignored if custom icons are used.
+	 *
+	 * @return The background color.
+	 * @see #setFoldIconBackground(Color)
+	 */
+	public Color getFoldIconBackground() {
+		return foldIconBackground;
+	}
+
+
+	public Dimension getPreferredSize() {
+		int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+		return new Dimension(WIDTH, h);
+	}
+
+
+	/**
+	 * Returns whether tool tips are displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @return Whether these tool tips are displayed.
+	 * @see #setShowCollapsedRegionToolTips(boolean)
+	 */
+	public boolean getShowCollapsedRegionToolTips() {
+		return showFoldRegionTips;
+	}
+
+
+	/**
+	 * Positions tool tips to be aligned in the text component, so that the
+	 * displayed content is shown (almost) exactly where it would be in the
+	 * editor.
+	 *
+	 * @param e The mouse location.
+	 */
+	public Point getToolTipLocation(MouseEvent e) {
+		//return super.getToolTipLocation(e);
+		Point p = e.getPoint();
+		p.y = (p.y/textArea.getLineHeight()) * textArea.getLineHeight();
+		p.x = getWidth();
+		return p;
+	}
+
+
+	/**
+	 * Overridden to show the content of a collapsed fold on mouse-overs.
+	 *
+	 * @param e The mouse location.
+	 */
+	public String getToolTipText(MouseEvent e) {
+
+		String text = null;
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (rsta.isCodeFoldingEnabled()) {
+			FoldManager fm = rsta.getFoldManager();
+			int pos = rsta.viewToModel(new Point(0, e.getY()));
+			if (pos>=0) { // Not -1
+				int line = 0;
+				try {
+					line = rsta.getLineOfOffset(pos);
+				} catch (BadLocationException ble) {
+					ble.printStackTrace(); // Never happens
+					return null;
+				}
+				Fold fold = fm.getFoldForLine(line);
+				if (fold!=null && fold.isCollapsed()) {
+
+					int endLine = fold.getEndLine();
+					if (fold.getLineCount()>25) { // Not too big
+						endLine = fold.getStartLine() + 25;
+					}
+
+					StringBuffer sb = new StringBuffer("<html><nobr>");
+					while (line<=endLine && line<rsta.getLineCount()) { // Sanity
+						Token t = rsta.getTokenListForLine(line);
+						while (t!=null && t.isPaintable()) {
+							t.appendHTMLRepresentation(sb, rsta, true, true);
+							t = t.getNextToken();
+						}
+						sb.append("<br>");
+						line++;
+					}
+
+					text = sb.toString();
+
+				}
+			}
+		}
+
+		return text;
+
+	}
+
+
+	void handleDocumentEvent(DocumentEvent e) {
+		int newLineCount = textArea.getLineCount();
+		if (newLineCount!=currentLineCount) {
+			currentLineCount = newLineCount;
+			repaint();
+		}
+	}
+
+
+	void lineHeightsChanged() {
+		// TODO Auto-generated method stub
+	}
+
+
+	protected void paintComponent(Graphics g) {
+
+		if (textArea==null) {
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("IconRowHeader repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		Color bg = getBackground();
+		if (getGutter()!=null) { // Should always be true
+			bg = getGutter().getBackground();
+		}
+		g.setColor(bg);
+		g.fillRect(0,visibleRect.y, getWidth(),visibleRect.height);
+
+		RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+		if (!rsta.isCodeFoldingEnabled()) { 
+			return; // We should be hidden in this case, but still...
+		}
+
+		if (textArea.getLineWrap()) {
+			paintComponentWrapped(g);
+			return;
+		}
+
+		// Get where to start painting (top of the row).
+		// We need to be "scrolled up" up just enough for the missing part of
+		// the first line.
+		int cellHeight = textArea.getLineHeight();
+		int topLine = visibleRect.y/cellHeight;
+		int y = topLine*cellHeight +
+			(cellHeight-collapsedFoldIcon.getIconHeight())/2;
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+		if (textAreaInsets!=null) {
+			y += textAreaInsets.top;
+		}
+
+		// Get the first and last lines to paint.
+		FoldManager fm = rsta.getFoldManager();
+		topLine += fm.getHiddenLineCountAbove(topLine, true);
+
+		int width = getWidth();
+		int x = width - 10;
+		int line = topLine;
+		boolean paintingOutlineLine = foldWithOutlineShowing!=null &&
+				foldWithOutlineShowing.containsLine(line);
+
+		while (y<visibleRect.y+visibleRect.height) {
+			if (paintingOutlineLine) {
+				g.setColor(getForeground());
+				int w2 = width/2;
+				if (line==foldWithOutlineShowing.getEndLine()) {
+					int y2 = y+cellHeight/2;
+					g.drawLine(w2,y, w2,y2);
+					g.drawLine(w2,y2, width-2,y2);
+					paintingOutlineLine = false;
+				}
+				else {
+					g.drawLine(w2,y, w2,y+cellHeight);
+				}
+			}
+			Fold fold = fm.getFoldForLine(line);
+			if (fold!=null) {
+				if (fold==foldWithOutlineShowing && !fold.isCollapsed()) {
+					g.setColor(getForeground());
+					int w2 = width/2;
+					g.drawLine(w2,y+cellHeight/2, w2,y+cellHeight);
+					paintingOutlineLine = true;
+				}
+				if (fold.isCollapsed()) {
+					collapsedFoldIcon.paintIcon(this, g, x, y);
+					// Skip to next line to paint, taking extra care for lines with
+					// block ends and begins together, e.g. "} else {"
+					do {
+						int hiddenLineCount = fold.getLineCount();
+						if (hiddenLineCount==0) {
+							// Fold parser identified a zero-line fold region.
+							// This is really a bug, but we'll be graceful here
+							// and avoid an infinite loop.
+							break;
+						}
+						line += hiddenLineCount;
+						fold = fm.getFoldForLine(line);
+					} while (fold!=null && fold.isCollapsed());
+				}
+				else {
+					expandedFoldIcon.paintIcon(this, g, x, y);
+				}
+			}
+			line++;
+			y += cellHeight;
+		}
+
+	}
+
+
+	/**
+	 * Paints folding icons when line wrapping is enabled.
+	 *
+	 * @param g The graphics context.
+	 */
+	private void paintComponentWrapped(Graphics g) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+		// - offset (<=0) is the y-coordinate at which we begin painting when
+		// we begin painting with the first logical line.  This can be
+		// negative, signifying that we've scrolled past the actual topmost
+		// part of this line.
+
+		// The algorithm is as follows:
+		// - Get the starting y-coordinate at which to paint.  This may be
+		//   above the first visible y-coordinate as we're in line-wrapping
+		//   mode, but we always paint entire logical lines.
+		// - Paint that line's indicator, if appropriate.  Increment y to be
+		//   just below the are we just painted (i.e., the beginning of the
+		//   next logical line's view area).
+		// - Get the ending visual position for that line.  We can now loop
+		//   back, paint this line, and continue until our y-coordinate is
+		//   past the last visible y-value.
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		// Some variables we'll be using.
+		int width = getWidth();
+
+		RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+		View v = ui.getRootView(textArea).getView(0);
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+		int cellHeight = textArea.getLineHeight();
+		FoldManager fm = ((RSyntaxTextArea)textArea).getFoldManager();
+
+		// Compute the y at which to begin painting text, taking into account
+		// that 1 logical line => at least 1 physical line, so it may be that
+		// y<0.  The computed y-value is the y-value of the top of the first
+		// (possibly) partially-visible view.
+		Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+		Rectangle r = LineNumberList.getChildViewBounds(v, topLine,
+												visibleEditorRect);
+		int y = r.y;
+		y += (cellHeight-collapsedFoldIcon.getIconHeight())/2;
+
+		int visibleBottom = visibleRect.y + visibleRect.height;
+		int x = width - 10;
+		int line = topLine;
+		boolean paintingOutlineLine = foldWithOutlineShowing!=null &&
+				foldWithOutlineShowing.containsLine(line);
+		int lineCount = root.getElementCount();
+
+		while (y<visibleBottom && line<lineCount) {
+
+			int curLineH = LineNumberList.getChildViewBounds(v, line,
+					visibleEditorRect).height;
+
+			if (paintingOutlineLine) {
+				g.setColor(getForeground());
+				int w2 = width/2;
+				if (line==foldWithOutlineShowing.getEndLine()) {
+					int y2 = y + curLineH - cellHeight/2;
+					g.drawLine(w2,y, w2,y2);
+					g.drawLine(w2,y2, width-2,y2);
+					paintingOutlineLine = false;
+				}
+				else {
+					g.drawLine(w2,y, w2,y+curLineH);
+				}
+			}
+			Fold fold = fm.getFoldForLine(line);
+			if (fold!=null) {
+				if (fold==foldWithOutlineShowing && !fold.isCollapsed()) {
+					g.setColor(getForeground());
+					int w2 = width/2;
+					g.drawLine(w2,y+cellHeight/2, w2,y+curLineH);
+					paintingOutlineLine = true;
+				}
+				if (fold.isCollapsed()) {
+					collapsedFoldIcon.paintIcon(this, g, x, y);
+					y += LineNumberList.getChildViewBounds(v, line,
+								visibleEditorRect).height;
+					line += fold.getLineCount() + 1;
+				}
+				else {
+					expandedFoldIcon.paintIcon(this, g, x, y);
+					y += curLineH;
+					line++;
+				}
+			}
+			else {
+				y += curLineH;
+				line++;
+			}
+		}
+
+	}
+
+
+	private int rowAtPoint(Point p) {
+
+		int line = 0;
+
+		try {
+			int offs = textArea.viewToModel(p);
+			if (offs>-1) {
+				line = textArea.getLineOfOffset(offs);
+			}
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Never happens
+		}
+
+		return line;
+
+	}
+
+
+	/**
+	 * Sets the color to use for the "background" of fold icons.  This will
+	 * be ignored if custom icons are used.
+	 *
+	 * @param bg The new background color.
+	 * @see #getFoldIconBackground()
+	 */
+	public void setFoldIconBackground(Color bg) {
+		foldIconBackground = bg;
+	}
+
+
+	/**
+	 * Sets the icons to use to represent collapsed and expanded folds.
+	 *
+	 * @param collapsedIcon The collapsed fold icon.  This cannot be
+	 *        <code>null</code>.
+	 * @param expandedIcon The expanded fold icon.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public void setFoldIcons(Icon collapsedIcon, Icon expandedIcon) {
+		this.collapsedFoldIcon = collapsedIcon;
+		this.expandedFoldIcon = expandedIcon;
+		revalidate(); // Icons may be different sizes.
+		repaint();
+	}
+
+
+	/**
+	 * Toggles whether tool tips should be displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @param show Whether to show these tool tips.
+	 * @see #getShowCollapsedRegionToolTips()
+	 */
+	public void setShowCollapsedRegionToolTips(boolean show) {
+		if (show!=showFoldRegionTips) {
+			if (show) {
+				ToolTipManager.sharedInstance().registerComponent(this);
+			}
+			else {
+				ToolTipManager.sharedInstance().unregisterComponent(this);
+			}
+			showFoldRegionTips = show;
+		}
+	}
+
+
+	/**
+	 * Overridden so we can track when code folding is enabled/disabled.
+	 */
+	public void setTextArea(RTextArea textArea) {
+		if (this.textArea!=null) {
+			this.textArea.removePropertyChangeListener(
+					RSyntaxTextArea.CODE_FOLDING_PROPERTY, listener);
+		}
+		super.setTextArea(textArea);
+		if (this.textArea!=null) {
+			this.textArea.addPropertyChangeListener(
+					RSyntaxTextArea.CODE_FOLDING_PROPERTY, listener);
+		}
+	}
+
+
+	/**
+	 * The default +/- icon for expanding and collapsing folds.
+	 */
+	private class FoldIcon implements Icon {
+
+		private boolean collapsed;
+
+		public FoldIcon(boolean collapsed) {
+			this.collapsed = collapsed;
+		}
+
+		public int getIconHeight() {
+			return 8;
+		}
+
+		public int getIconWidth() {
+			return 8;
+		}
+
+		public void paintIcon(Component c, Graphics g, int x, int y) {
+			g.setColor(foldIconBackground);
+			g.fillRect(x,y, 8,8);
+			g.setColor(getForeground());
+			g.drawRect(x,y, 8,8);
+			g.drawLine(x+2,y+4, x+2+4,y+4);
+			if (collapsed) {
+				g.drawLine(x+4,y+2, x+4,y+6);
+			}
+		}
+		
+	}
+
+
+	/**
+	 * Listens for events in this component.
+	 */
+	private class Listener extends MouseInputAdapter
+			implements PropertyChangeListener {
+
+		public Listener(FoldIndicator fgc) {
+			fgc.addMouseListener(this);
+			fgc.addMouseMotionListener(this);
+		}
+
+		public void mouseClicked(MouseEvent e) {
+
+//			// TODO: Implement code folding with word wrap enabled
+//			if (textArea.getLineWrap()) {
+//				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+//				return;
+//			}
+
+			Point p = e.getPoint();
+			int line = rowAtPoint(p);
+
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			FoldManager fm = rsta.getFoldManager();
+
+			Fold fold = fm.getFoldForLine(line);
+			if (fold!=null) {
+				fold.toggleCollapsedState();
+				getGutter().repaint();
+				textArea.repaint();
+			}
+
+		}
+
+		public void mouseExited(MouseEvent e) {
+			if (foldWithOutlineShowing!=null) {
+				foldWithOutlineShowing = null;
+				repaint();
+			}
+		}
+
+		public void mouseMoved(MouseEvent e) {
+			Fold newSelectedFold = findOpenFoldClosestTo(e.getPoint());
+			if (newSelectedFold!=foldWithOutlineShowing) {
+				foldWithOutlineShowing = newSelectedFold;
+				repaint();
+			}
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+			// Whether folding is enabled in the editor has changed.
+			repaint();
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/Gutter.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/Gutter.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/Gutter.java	(revision 25584)
@@ -0,0 +1,848 @@
+/*
+ * 02/17/2009
+ *
+ * Gutter.java - Manages line numbers, icons, etc. on the left-hand side of
+ * an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.event.ComponentAdapter;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.Icon;
+import javax.swing.JPanel;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.ActiveLineRangeEvent;
+import org.fife.ui.rsyntaxtextarea.ActiveLineRangeListener;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The gutter is the component on the left-hand side of the text area that
+ * displays optional information such as line numbers, fold regions, and icons
+ * (for bookmarks, debugging breakpoints, error markers, etc.).<p>
+ *
+ * Icons can be added on a per-line basis to visually mark syntax errors, lines
+ * with breakpoints set on them, etc.  To add icons to the gutter, you must
+ * first call {@link RTextScrollPane#setIconRowHeaderEnabled(boolean)} on the
+ * parent scroll pane, to make the icon area visible.  Then, you can add icons
+ * that track either lines in the document, or offsets, via
+ * {@link #addLineTrackingIcon(int, Icon)} and
+ * {@link #addOffsetTrackingIcon(int, Icon)}, respectively.  To remove an
+ * icon you've added, use {@link #removeTrackingIcon(GutterIconInfo)}.<p>
+ *
+ * In addition to support for arbitrary per-line icons, this component also
+ * has built-in support for displaying icons representing "bookmarks;" that is,
+ * lines a user can cycle through via F2 and Shift+F2.  Bookmarked lines are
+ * toggled via Ctrl+F2.  In order to enable bookmarking, you must first assign
+ * an icon to represent a bookmarked line, then actually enable the feature:
+ * 
+ * <pre>
+ * Gutter gutter = scrollPane.getGutter();
+ * gutter.setBookmarkIcon(new ImageIcon("bookmark.png"));
+ * gutter.setBookmarkingEnabled(true);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see GutterIconInfo
+ */
+public class Gutter extends JPanel {
+
+	/**
+	 * The color used to highlight active line ranges if none is specified.
+	 */
+	public static final Color DEFAULT_ACTIVE_LINE_RANGE_COLOR =
+												new Color(51, 153, 255);
+
+	/**
+	 * The text area.
+	 */
+	private RTextArea textArea;
+
+	/**
+	 * Renders line numbers.
+	 */
+	private LineNumberList lineNumberList;
+
+	/**
+	 * Renders bookmark icons, breakpoints, error icons, etc.
+	 */
+	private IconRowHeader iconArea;
+
+	/**
+	 * Shows lines that are code-foldable.
+	 */
+	private FoldIndicator foldIndicator;
+
+	/**
+	 * Listens for events in our text area.
+	 */
+	private TextAreaListener listener;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.  If this is
+	 *        <code>null</code>, you must call {@link #setTextArea(RTextArea)}.
+	 */
+	public Gutter(RTextArea textArea) {
+
+		listener = new TextAreaListener();
+		setTextArea(textArea);
+		setLayout(new BorderLayout());
+		if (this.textArea!=null) {
+			// Enable line numbers our first time through if they give us
+			// a text area.
+			setLineNumbersEnabled(true);
+			if (this.textArea instanceof RSyntaxTextArea) {
+				RSyntaxTextArea rsta = (RSyntaxTextArea)this.textArea;
+				setFoldIndicatorEnabled(rsta.isCodeFoldingEnabled());
+			}
+		}
+
+		setBorder(new GutterBorder(0, 0, 0, 1)); // Assume ltr
+
+		Color bg = null;
+		if (textArea!=null) {
+			bg = textArea.getBackground(); // May return null if image bg
+		}
+		setBackground(bg!=null ? bg : Color.WHITE);
+
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param line The line to track (zero-based).
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @return A tag for this icon.  This can later be used in a call to
+	 *         {@link #removeTrackingIcon(GutterIconInfo)} to remove this
+	 *         icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 */
+	public GutterIconInfo addLineTrackingIcon(int line, Icon icon)
+											throws BadLocationException {
+		int offs = textArea.getLineStartOffset(line);
+		return addOffsetTrackingIcon(offs, icon);
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param offs The offset to track.
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @return A tag for this icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #addLineTrackingIcon(int, Icon)
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 */
+	public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon)
+												throws BadLocationException {
+		return iconArea.addOffsetTrackingIcon(offs, icon);
+	}
+
+
+	/**
+	 * Clears the active line range.
+	 *
+	 * @see #setActiveLineRange(int, int)
+	 */
+	private void clearActiveLineRange() {
+		iconArea.clearActiveLineRange();
+	}
+
+
+	/**
+	 * Returns the color used to paint the active line range, if any.
+	 *
+	 * @return The color.
+	 * @see #setActiveLineRangeColor(Color)
+	 */
+	public Color getActiveLineRangeColor() {
+		return iconArea.getActiveLineRangeColor();
+	}
+
+
+	/**
+	 * Returns the icon to use for bookmarks.
+	 *
+	 * @return The icon to use for bookmarks.  If this is <code>null</code>,
+	 *         bookmarking is effectively disabled.
+	 * @see #setBookmarkIcon(Icon)
+	 * @see #isBookmarkingEnabled()
+	 */
+	public Icon getBookmarkIcon() {
+		return iconArea.getBookmarkIcon();
+	}
+
+
+	/**
+	 * Returns the bookmarks known to this gutter.
+	 *
+	 * @return The bookmarks.  If there are no bookmarks, an empty array is
+	 *         returned.
+	 */
+	public GutterIconInfo[] getBookmarks() {
+		return iconArea.getBookmarks();
+	}
+
+
+	/**
+	 * Returns the color of the "border" line.
+	 *
+	 * @return The color.
+	 * @see #setBorderColor(Color)
+	 */
+	public Color getBorderColor() {
+		return ((GutterBorder)getBorder()).getColor();
+	}
+
+
+	/**
+	 * Returns the background color used by the (default) fold icons.
+	 *
+	 * @return The background color.
+	 * @see #setFoldBackground(Color)
+	 */
+	public Color getFoldBackground() {
+		return foldIndicator.getFoldIconBackground();
+	}
+
+
+	/**
+	 * Returns the foreground color of the fold indicator.
+	 *
+	 * @return The foreground color of the fold indicator.
+	 * @see #setFoldIndicatorForeground(Color)
+	 */
+	public Color getFoldIndicatorForeground() {
+		return foldIndicator.getForeground();
+	}
+
+
+	/**
+	 * Returns the color to use to paint line numbers.
+	 *
+	 * @return The color used when painting line numbers.
+	 * @see #setLineNumberColor(Color)
+	 */
+	public Color getLineNumberColor() {
+		return lineNumberList.getForeground();
+	}
+
+
+	/**
+	 * Returns the font used for line numbers.
+	 *
+	 * @return The font used for line numbers.
+	 * @see #setLineNumberFont(Font)
+	 */
+	public Font getLineNumberFont() {
+		return lineNumberList.getFont();
+	}
+
+
+	/**
+	 * Returns the starting line's line number.  The default value is
+	 * <code>1</code>.
+	 *
+	 * @return The index
+	 * @see #setLineNumberingStartIndex(int)
+	 */
+	public int getLineNumberingStartIndex() {
+		return lineNumberList.getLineNumberingStartIndex();
+	}
+
+
+	/**
+	 * Returns <code>true</code> if the line numbers are enabled and visible.
+	 *
+	 * @return Whether or not line numbers are visible.
+	 */
+	public boolean getLineNumbersEnabled() {
+		for (int i=0; i<getComponentCount(); i++) {
+			if (getComponent(i)==lineNumberList) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether tool tips are displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @return Whether these tool tips are displayed.
+	 * @see #setShowCollapsedRegionToolTips(boolean)
+	 */
+	public boolean getShowCollapsedRegionToolTips() {
+		return foldIndicator.getShowCollapsedRegionToolTips();
+	}
+
+
+	/**
+	 * Returns the tracking icons at the specified view position.
+	 *
+	 * @param p The view position.
+	 * @return The tracking icons at that position.  If there are no tracking
+	 *         icons there, this will be an empty array.
+	 * @throws BadLocationException If <code>p</code> is invalid.
+	 */
+	public Object[] getTrackingIcons(Point p) throws BadLocationException {
+		int offs = textArea.viewToModel(new Point(0, p.y));
+		int line = textArea.getLineOfOffset(offs);
+		return iconArea.getTrackingIcons(line);
+	}
+
+
+	/**
+	 * Returns whether the fold indicator is enabled.
+	 *
+	 * @return Whether the fold indicator is enabled.
+	 * @see #setFoldIndicatorEnabled(boolean)
+	 */
+	public boolean isFoldIndicatorEnabled() {
+		for (int i=0; i<getComponentCount(); i++) {
+			if (getComponent(i)==foldIndicator) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns whether bookmarking is enabled.
+	 *
+	 * @return Whether bookmarking is enabled.
+	 * @see #setBookmarkingEnabled(boolean)
+	 */
+	public boolean isBookmarkingEnabled() {
+		return iconArea.isBookmarkingEnabled();
+	}
+
+
+	/**
+	 * Returns whether the icon row header is enabled.
+	 *
+	 * @return Whether the icon row header is enabled.
+	 */
+	public boolean isIconRowHeaderEnabled() {
+		for (int i=0; i<getComponentCount(); i++) {
+			if (getComponent(i)==iconArea) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Removes the specified tracking icon.
+	 *
+	 * @param tag A tag for an icon in the gutter, as returned from either
+	 *        {@link #addLineTrackingIcon(int, Icon)} or
+	 *        {@link #addOffsetTrackingIcon(int, Icon)}.
+	 * @see #removeAllTrackingIcons()
+	 * @see #addLineTrackingIcon(int, Icon)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeTrackingIcon(GutterIconInfo tag) {
+		iconArea.removeTrackingIcon(tag);
+	}
+
+
+	/**
+	 * Removes all tracking icons.
+	 *
+	 * @see #removeTrackingIcon(GutterIconInfo)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeAllTrackingIcons() {
+		iconArea.removeAllTrackingIcons();
+	}
+
+
+	/**
+	 * Sets the color to use to render active line ranges.
+	 *
+	 * @param color The color to use.  If this is null, then the default
+	 *        color is used.
+	 * @see #getActiveLineRangeColor()
+	 * @see #DEFAULT_ACTIVE_LINE_RANGE_COLOR
+	 */
+	public void setActiveLineRangeColor(Color color) {
+		iconArea.setActiveLineRangeColor(color);
+	}
+
+
+	/**
+	 * Highlights a range of lines in the icon area.  This, of course, will
+	 * only be visible if the icon area is visible.
+	 *
+	 * @param startLine The start of the line range.
+	 * @param endLine The end of the line range.
+	 * @see #clearActiveLineRange()
+	 */
+	private void setActiveLineRange(int startLine, int endLine) {
+		iconArea.setActiveLineRange(startLine, endLine);
+	}
+
+
+	/**
+	 * Sets the icon to use for bookmarks.
+	 *
+	 * @param icon The new bookmark icon.  If this is <code>null</code>,
+	 *        bookmarking is effectively disabled.
+	 * @see #getBookmarkIcon()
+	 * @see #isBookmarkingEnabled()
+	 */
+	public void setBookmarkIcon(Icon icon) {
+		iconArea.setBookmarkIcon(icon);
+	}
+
+
+	/**
+	 * Sets whether bookmarking is enabled.  Note that a bookmarking icon
+	 * must be set via {@link #setBookmarkIcon(Icon)} before bookmarks are
+	 * truly enabled.
+	 *
+	 * @param enabled Whether bookmarking is enabled.
+	 * @see #isBookmarkingEnabled()
+	 * @see #setBookmarkIcon(Icon)
+	 */
+	public void setBookmarkingEnabled(boolean enabled) {
+		iconArea.setBookmarkingEnabled(enabled);
+		if (enabled && !isIconRowHeaderEnabled()) {
+			setIconRowHeaderEnabled(true);
+		}
+	}
+
+
+	/**
+	 * Sets the color for the "border" line.
+	 *
+	 * @param color The new color.
+	 * @see #getBorderColor()
+	 */
+	public void setBorderColor(Color color) {
+		((GutterBorder)getBorder()).setColor(color);
+		repaint();
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setComponentOrientation(ComponentOrientation o) {
+		// Reuse the border to preserve its color.
+		if (o.isLeftToRight()) {
+			((GutterBorder)getBorder()).setEdges(0, 0, 0, 1);
+		}
+		else {
+			((GutterBorder)getBorder()).setEdges(0, 1, 0, 0);
+		}
+		super.setComponentOrientation(o);
+	}
+
+
+	/**
+	 * Sets the icons to use to represent collapsed and expanded folds.
+	 *
+	 * @param collapsedIcon The collapsed fold icon.  This cannot be
+	 *        <code>null</code>.
+	 * @param expandedIcon The expanded fold icon.  This cannot be
+	 *        <code>null</code>.
+	 */
+	public void setFoldIcons(Icon collapsedIcon, Icon expandedIcon) {
+		if (foldIndicator!=null) {
+			foldIndicator.setFoldIcons(collapsedIcon, expandedIcon);
+		}
+	}
+
+
+	/**
+	 * Toggles whether the fold indicator is enabled.
+	 *
+	 * @param enabled Whether the fold indicator should be enabled.
+	 * @see #isFoldIndicatorEnabled()
+	 */
+	public void setFoldIndicatorEnabled(boolean enabled) {
+		if (foldIndicator!=null) {
+			if (enabled) {
+				add(foldIndicator, BorderLayout.LINE_END);
+			}
+			else {
+				remove(foldIndicator);
+			}
+			revalidate();
+		}
+	}
+
+
+	/**
+	 * Sets the background color used by the (default) fold icons.
+	 *
+	 * @param bg The new background color.
+	 * @see #getFoldBackground()
+	 */
+	public void setFoldBackground(Color bg) {
+		if (bg==null) {
+			bg = FoldIndicator.DEFAULT_FOLD_BACKGROUND;
+		}
+		foldIndicator.setFoldIconBackground(bg);
+	}
+
+
+	/**
+	 * Sets the foreground color used by the fold indicator.
+	 *
+	 * @param fg The new fold indicator foreground.
+	 * @see #getFoldIndicatorForeground()
+	 */
+	public void setFoldIndicatorForeground(Color fg) {
+		if (fg==null) {
+			fg = FoldIndicator.DEFAULT_FOREGROUND;
+		}
+		foldIndicator.setForeground(fg);
+	}
+
+
+	/**
+	 * Toggles whether the icon row header (used for breakpoints, bookmarks,
+	 * etc.) is enabled.
+	 *
+	 * @param enabled Whether the icon row header is enabled.
+	 * @see #isIconRowHeaderEnabled()
+	 */
+	void setIconRowHeaderEnabled(boolean enabled) {
+		if (iconArea!=null) {
+			if (enabled) {
+				add(iconArea, BorderLayout.LINE_START);
+			}
+			else {
+				remove(iconArea);
+			}
+			revalidate();
+		}
+	}
+
+
+	/**
+	 * Sets the color to use to paint line numbers.
+	 *
+	 * @param color The color to use when painting line numbers.
+	 * @see #getLineNumberColor()
+	 */
+	public void setLineNumberColor(Color color) {
+		lineNumberList.setForeground(color);
+	}
+
+
+	/**
+	 * Sets the font used for line numbers.
+	 *
+	 * @param font The font to use.  This cannot be <code>null</code>.
+	 * @see #getLineNumberFont()
+	 */
+	public void setLineNumberFont(Font font) {
+		if (font==null) {
+			throw new IllegalArgumentException("font cannot be null");
+		}
+		lineNumberList.setFont(font);
+	}
+
+
+	/**
+	 * Sets the starting line's line number.  The default value is
+	 * <code>1</code>.  Applications can call this method to change this value
+	 * if they are displaying a subset of lines in a file, for example.
+	 *
+	 * @param index The new index.
+	 * @see #getLineNumberingStartIndex()
+	 */
+	public void setLineNumberingStartIndex(int index) {
+		lineNumberList.setLineNumberingStartIndex(index);
+	}
+
+
+	/**
+	 * Toggles whether or not line numbers are visible.
+	 *
+	 * @param enabled Whether or not line numbers should be visible.
+	 * @see #getLineNumbersEnabled()
+	 */
+	void setLineNumbersEnabled(boolean enabled) {
+		if (lineNumberList!=null) {
+			if (enabled) {
+				add(lineNumberList);
+			}
+			else {
+				remove(lineNumberList);
+			}
+			revalidate();
+		}
+	}
+
+
+	/**
+	 * Toggles whether tool tips should be displayed showing the contents of
+	 * collapsed fold regions when the mouse hovers over a +/- icon.
+	 *
+	 * @param show Whether to show these tool tips.
+	 * @see #getShowCollapsedRegionToolTips()
+	 */
+	public void setShowCollapsedRegionToolTips(boolean show) {
+		if (foldIndicator!=null) {
+			foldIndicator.setShowCollapsedRegionToolTips(show);
+		}
+	}
+
+
+	/**
+	 * Sets the text area being displayed.  This will clear any tracking
+	 * icons currently displayed.
+	 *
+	 * @param textArea The text area.
+	 */
+	void setTextArea(RTextArea textArea) {
+
+		if (this.textArea!=null) {
+			listener.uninstall();
+		}
+
+		if (textArea!=null) {
+
+			RTextAreaEditorKit kit = (RTextAreaEditorKit)textArea.getUI().
+					getEditorKit(textArea);
+
+			if (lineNumberList==null) {
+				lineNumberList = kit.createLineNumberList(textArea);
+			}
+			else {
+				lineNumberList.setTextArea(textArea);
+			}
+			if (iconArea==null) {
+				iconArea = kit.createIconRowHeader(textArea);
+			}
+			else {
+				iconArea.setTextArea(textArea);
+			}
+			if (foldIndicator==null) {
+				foldIndicator = new FoldIndicator(textArea);
+			}
+			else {
+				foldIndicator.setTextArea(textArea);
+			}
+
+			listener.install(textArea);
+
+		}
+
+		this.textArea = textArea;
+
+	}
+
+
+	/**
+	 * Programatically toggles whether there is a bookmark for the specified
+	 * line.  If bookmarking is not enabled, this method does nothing.
+	 *
+	 * @param line The line.
+	 * @return Whether a bookmark is now at the specified line.
+	 * @throws BadLocationException If <code>line</code> is an invalid line
+	 *         number in the text area.
+	 */
+	public boolean toggleBookmark(int line) throws BadLocationException {
+		return iconArea.toggleBookmark(line);
+	}
+
+
+	/**
+	 * The border used by the gutter.
+	 */
+	private static class GutterBorder extends EmptyBorder {
+
+		private Color color;
+
+		public GutterBorder(int top, int left, int bottom, int right) {
+			super(top, left, bottom, right);
+			color = new Color(221, 221, 221);
+		}
+
+		public Color getColor() {
+			return color;
+		}
+
+		public void paintBorder(Component c, Graphics g, int x, int y,
+								int width, int height) {
+			g.setColor(color);
+			if (left==1) {
+				g.drawLine(0,0, 0,height);
+			}
+			else {
+				g.drawLine(width-1,0, width-1,height);
+			}
+		}
+
+		public void setColor(Color color) {
+			this.color = color;
+		}
+
+		public void setEdges(int top, int left, int bottom, int right) {
+			this.top = top;
+			this.left = left;
+			this.bottom = bottom;
+			this.right = right;
+		}
+
+	}
+
+
+	/**
+	 * Listens for the text area resizing.
+	 */
+	/*
+	 * This is necessary to keep child components the same height as the text
+	 * area.  The worse case is when the user toggles word-wrap and it changes
+	 * the height of the text area. In that case, if we listen for the
+	 * "lineWrap" property change, we get notified BEFORE the text area
+	 * decides on its new size, thus we cannot resize properly.  We listen
+	 * instead for ComponentEvents so we change size after the text area has
+	 * resized.
+	 */
+	private class TextAreaListener extends ComponentAdapter
+						implements DocumentListener, PropertyChangeListener,
+						ActiveLineRangeListener {
+
+		private boolean installed;
+
+		/**
+		 * Modifies the "active line range" that is painted in this component.
+		 *
+		 * @param e Information about the new "active line range."
+		 */
+		public void activeLineRangeChanged(ActiveLineRangeEvent e) {
+			if (e.getMin()==-1) {
+				clearActiveLineRange();
+			}
+			else {
+				setActiveLineRange(e.getMin(), e.getMax());
+			}
+		}
+
+		public void changedUpdate(DocumentEvent e) {}
+
+		public void componentResized(java.awt.event.ComponentEvent e) {
+			revalidate();
+		}
+
+		protected void handleDocumentEvent(DocumentEvent e) {
+			for (int i=0; i<getComponentCount(); i++) {
+				AbstractGutterComponent agc =
+							(AbstractGutterComponent)getComponent(i);
+				agc.handleDocumentEvent(e);
+			}
+		}
+
+		public void insertUpdate(DocumentEvent e) {
+			handleDocumentEvent(e);
+		}
+
+		public void install(RTextArea textArea) {
+			if (installed) {
+				uninstall();
+			}
+			textArea.addComponentListener(this);
+			textArea.getDocument().addDocumentListener(this);
+			textArea.addPropertyChangeListener(this);
+			if (textArea instanceof RSyntaxTextArea) {
+				RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+				rsta.addActiveLineRangeListener(this);
+				rsta.getFoldManager().addPropertyChangeListener(this);
+			}
+			installed = true;
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+
+			String name = e.getPropertyName();
+
+			// If they change the text area's font, we need to update cell
+			// heights to match the font's height.
+			if ("font".equals(name) ||
+					RSyntaxTextArea.SYNTAX_SCHEME_PROPERTY.equals(name)) {
+				for (int i=0; i<getComponentCount(); i++) {
+					AbstractGutterComponent agc =
+								(AbstractGutterComponent)getComponent(i);
+					agc.lineHeightsChanged();
+				}
+			}
+
+			// If they toggle whether code folding is enabled...
+			else if (RSyntaxTextArea.CODE_FOLDING_PROPERTY.equals(name)) {
+				boolean foldingEnabled = ((Boolean)e.getNewValue()).
+															booleanValue();
+				if (lineNumberList!=null) { // Its size depends on folding
+					//lineNumberList.revalidate();
+					lineNumberList.updateCellWidths();
+				}
+				setFoldIndicatorEnabled(foldingEnabled);
+			}
+
+			// If code folds are updated...
+			else if (FoldManager.PROPERTY_FOLDS_UPDATED.equals(name)) {
+				repaint();
+			}
+
+		}
+
+		public void removeUpdate(DocumentEvent e) {
+			handleDocumentEvent(e);
+		}
+
+		public void uninstall() {
+			if (installed) {
+				textArea.removeComponentListener(this);
+				textArea.getDocument().removeDocumentListener(this);
+				if (textArea instanceof RSyntaxTextArea) {
+					RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+					rsta.removeActiveLineRangeListener(this);
+					rsta.getFoldManager().removePropertyChangeListener(this);
+				}
+				installed = false;
+			}
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/GutterIconInfo.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/GutterIconInfo.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/GutterIconInfo.java	(revision 25584)
@@ -0,0 +1,45 @@
+/*
+ * 02/19/2009
+ *
+ * GutterIconInfo.java - Information about an Icon in a Gutter.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import javax.swing.Icon;
+
+
+/**
+ * Information about an icon displayed in a {@link Gutter}.  Instances of this
+ * class are returned by {@link Gutter#addLineTrackingIcon(int, Icon)} and
+ * {@link Gutter#addOffsetTrackingIcon(int, Icon)}.  They can later be used
+ * in calls to {@link Gutter#removeTrackingIcon(GutterIconInfo)} to be
+ * individually removed.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Gutter
+ */
+public interface GutterIconInfo {
+
+
+	/**
+	 * Returns the icon being rendered.
+	 *
+	 * @return The icon being rendered.
+	 */
+	public Icon getIcon();
+
+
+	/**
+	 * Returns the offset that is being tracked.  The line of this offset is
+	 * where the icon is rendered.  This offset may change as the user types
+	 * to track the new location of the marked offset.
+	 *
+	 * @return The offset being tracked.
+	 */
+	public int getMarkedOffset();
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/IconGroup.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/IconGroup.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/IconGroup.java	(revision 25584)
@@ -0,0 +1,239 @@
+/*
+ * 09/05/2004
+ *
+ * IconGroup.java - Class encapsulating images used for RTextArea actions.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import javax.imageio.ImageIO;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+
+/**
+ * This class encapsulates the location, properties, etc. of an icon set used
+ * for an instance of <code>RTextArea</code>.  If the location of the icon
+ * group is invalid in any way, any attempt to retrieve icons from an icon
+ * group will return <code>null</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class IconGroup {
+
+	private String path;
+	private boolean separateLargeIcons;
+	private String largeIconSubDir;
+	private String extension;
+	private String name;
+	private String jarFile;
+
+	private static final String DEFAULT_EXTENSION	= "gif";
+
+
+	/**
+	 * Creates an icon set without "large versions" of the icons.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 */
+	public IconGroup(String name, String path) {
+		this(name, path, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 * @param largeIconSubDir The subdirectory containing "large versions" of
+	 *        the icons.  If no subdirectory exists, pass in <code>null</code>.
+	 */
+	public IconGroup(String name, String path, String largeIconSubDir) {
+		this(name, path, largeIconSubDir, DEFAULT_EXTENSION);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 * @param largeIconSubDir The subdirectory containing "large versions" of
+	 *        the icons.  If no subdirectory exists, pass in <code>null</code>.
+	 * @param extension The extension of the icons (one of <code>gif</code>,
+	 *        <code>jpg</code>, or <code>png</code>).
+	 */
+	public IconGroup(String name, String path, String largeIconSubDir,
+											String extension) {
+		this(name, path, largeIconSubDir, extension, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the icon group.
+	 * @param path The directory containing the icon group.
+	 * @param largeIconSubDir The subdirectory containing "large versions" of
+	 *        the icons.  If no subdirectory exists, pass in <code>null</code>.
+	 * @param extension The extension of the icons (one of <code>gif</code>,
+	 *        <code>jpg</code>, or <code>png</code>).
+	 * @param jar The Jar file containing the icons, or <code>null</code> if
+	 *        the icons are on the local file system.  If a Jar is specified,
+	 *        the value of <code>path</code> must be a path in the Jar file.
+	 *        If this is not a valid Jar file, then no Jar file will be used,
+	 *        meaning all icons returned from this icon group will be
+	 *        <code>null</code>.
+	 */
+	public IconGroup(String name, String path, String largeIconSubDir,
+					String extension, String jar) {
+		this.name = name;
+		this.path = path;
+		this.separateLargeIcons = (largeIconSubDir!=null);
+		this.largeIconSubDir = largeIconSubDir;
+		this.extension = extension!=null ? extension : DEFAULT_EXTENSION;
+		this.jarFile = jar;
+	}
+
+
+	/**
+	 * Returns whether two icon groups are equal.
+	 *
+	 * @param o2 The object to check against.
+	 * @return Whether <code>o2</code> represents the same icons as this icon
+	 *         group.
+	 */
+	public boolean equals(Object o2) {
+		if (o2!=null && o2 instanceof IconGroup) {
+			IconGroup ig2 = (IconGroup)o2;
+			if (ig2.getName().equals(getName()) &&
+					separateLargeIcons==ig2.hasSeparateLargeIcons()) {
+				if (separateLargeIcons) {
+					if (!largeIconSubDir.equals(ig2.largeIconSubDir))
+						return false;
+				}
+				return path.equals(ig2.path);
+			}
+			// If we got here, separateLargeIcons values weren't equal.
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns the icon from this icon group with the specified name.
+	 *
+	 * @param name The name of the icon.  For example, if you want the icon
+	 * specified in <code>new.gif</code>, this value should be
+	 * <code>new</code>.
+	 * @return The icon, or <code>null</code> if it could not be found or
+	 *         loaded.
+	 * @see #getLargeIcon
+	 */
+	public Icon getIcon(String name) {
+		Icon icon = getIconImpl(path + name + "." + extension);
+		// JDK 6.0 b74 returns icons with width/height==-1 in certain error
+		// cases (new ImageIcon(url) where url is not resolved?).  We'll
+		// just return null in this case as Swing AbstractButtons throw
+		// exceptions when expected to paint an icon with width or height
+		// is less than 1.
+		if (icon!=null && (icon.getIconWidth()<1 || icon.getIconHeight()<1)) {
+			icon = null;
+		}
+		return icon;
+	}
+
+
+	/**
+	 * Does the dirty work of loading an image.
+	 *
+	 * @param iconFullPath The full path to the icon, either on the local
+	 *        file system or in the Jar file, if this icon group represents
+	 *        icons in a Jar file.
+	 * @return The icon.
+	 */
+	private Icon getIconImpl(String iconFullPath) {
+		try {
+			if (jarFile==null) {
+				// First see if it's on our classpath (e.g. an icon in
+				// RText.jar, so we'd need to use the class loader).
+				URL url = getClass().getClassLoader().
+										getResource(iconFullPath);
+				if (url!=null)
+					return new ImageIcon(url);
+				// If not, see if it's a plain file on disk.
+				BufferedImage image = ImageIO.read(new File(iconFullPath));
+				return image!=null ? new ImageIcon(image) : null;
+			}
+			else { // If it's in a Jar, create a URL and grab it.
+				URL url = new URL("jar:file:///" +
+									jarFile + "!/" + iconFullPath);
+				//System.err.println("***** " + url.toString());
+				return new ImageIcon(url);
+			}
+		} catch (IOException ioe) {
+			return null;
+		}
+	}
+
+
+	/**
+	 * Returns the large icon from this icon group with the specified name.
+	 * If this icon group does not have large icons, <code>null</code> is
+	 * returned.
+	 *
+	 * @param name The name of the icon.  For example, if you want the icon
+	 *        specified in <code>new.gif</code>, this value should be
+	 *        <code>new</code>.
+	 * @return The icon, or <code>null</code> if it could not be found or
+	 *         loaded.
+	 * @see #getLargeIcon
+	 */
+	public Icon getLargeIcon(String name) {
+		return getIconImpl(path + largeIconSubDir + "/" +
+						name + "." + extension);
+	}
+
+
+	/**
+	 * Returns the name of this icon group.
+	 *
+	 * @return This icon group's name.
+	 */
+	public String getName() {
+		return name;
+	}
+
+
+	/**
+	 * Returns whether a separate directory for the large icons exists.
+	 *
+	 * @return Whether a directory containing "large versions" ov the icons
+	 *         exists.
+	 * @see #getLargeIcon(String)
+	 */
+	public boolean hasSeparateLargeIcons() {
+		return separateLargeIcons;
+	}
+
+
+	/**
+	 * Overridden since we also override {@link #equals(Object)}, to honor
+	 * the invariant that equal objects must have equal hashcodes.  This also
+	 * keeps FindBugs happy.
+	 */
+	public int hashCode() {
+		return getName().hashCode();
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/IconRowHeader.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/IconRowHeader.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/IconRowHeader.java	(revision 25584)
@@ -0,0 +1,802 @@
+/*
+ * 02/17/2009
+ *
+ * IconRowHeader.java - Renders icons in the gutter.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.Icon;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * Renders icons in the {@link Gutter}.  This can be used to visually mark
+ * lines containing syntax errors, lines with breakpoints set on them, etc.<p>
+ *
+ * This component has built-in support for displaying icons representing
+ * "bookmarks;" that is, lines a user can cycle through via F2 and Shift+F2.
+ * Bookmarked lines are toggled via Ctrl+F2, or by clicking in the icon area
+ * at the line to bookmark.  In order to enable bookmarking, you must first
+ * assign an icon to represent a bookmarked line, then actually enable the
+ * feature.  This is actually done on the parent {@link Gutter} component:<p>
+ * 
+ * <pre>
+ * Gutter gutter = scrollPane.getGutter();
+ * gutter.setBookmarkIcon(new ImageIcon("bookmark.png"));
+ * gutter.setBookmarkingEnabled(true);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class IconRowHeader extends AbstractGutterComponent implements MouseListener {
+
+	/**
+	 * The icons to render.
+	 */
+	protected List trackingIcons;
+
+	/**
+	 * The width of this component.
+	 */
+	protected int width;
+
+	/**
+	 * Whether this component listens for mouse clicks and toggles "bookmark"
+	 * icons on them.
+	 */
+	private boolean bookmarkingEnabled;
+
+	/**
+	 * The icon to use for bookmarks.
+	 */
+	private Icon bookmarkIcon;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	protected Rectangle visibleRect;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	protected Insets textAreaInsets;
+
+	/**
+	 * The first line in the active line range.
+	 */
+	protected int activeLineRangeStart;
+
+	/**
+	 * The end line in the active line range.
+	 */
+	protected int activeLineRangeEnd;
+
+	/**
+	 * The color used to highlight the active code block.
+	 */
+	private Color activeLineRangeColor;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public IconRowHeader(RTextArea textArea) {
+
+		super(textArea);
+		visibleRect = new Rectangle();
+		width = 16;
+		addMouseListener(this);
+		activeLineRangeStart = activeLineRangeEnd = -1;
+		setActiveLineRangeColor(null);
+
+		// Must explicitly set our background color, otherwise we inherit that
+		// of the parent Gutter.
+		updateBackground();
+
+	}
+
+
+	/**
+	 * Adds an icon that tracks an offset in the document, and is displayed
+	 * adjacent to the line numbers.  This is useful for marking things such
+	 * as source code errors.
+	 *
+	 * @param offs The offset to track.
+	 * @param icon The icon to display.  This should be small (say 16x16).
+	 * @return A tag for this icon.
+	 * @throws BadLocationException If <code>offs</code> is an invalid offset
+	 *         into the text area.
+	 * @see #removeTrackingIcon(Object)
+	 */
+	public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon)
+												throws BadLocationException {
+		Position pos = textArea.getDocument().createPosition(offs);
+		GutterIconImpl ti = new GutterIconImpl(icon, pos);
+		if (trackingIcons==null) {
+			trackingIcons = new ArrayList(1); // Usually small
+		}
+		int index = Collections.binarySearch(trackingIcons, ti);
+		if (index<0) {
+			index = -(index+1);
+		}
+		trackingIcons.add(index, ti);
+		repaint();
+		return ti;
+	}
+
+
+	/**
+	 * Clears the active line range.
+	 *
+	 * @see #setActiveLineRange(int, int)
+	 */
+	public void clearActiveLineRange() {
+		if (activeLineRangeStart!=-1 || activeLineRangeEnd!=-1) {
+			activeLineRangeStart = activeLineRangeEnd = -1;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Returns the color used to paint the active line range, if any.
+	 *
+	 * @return The color.
+	 * @see #setActiveLineRangeColor(Color)
+	 */
+	public Color getActiveLineRangeColor() {
+		return activeLineRangeColor;
+	}
+
+
+	/**
+	 * Returns the icon to use for bookmarks.
+	 *
+	 * @return The icon to use for bookmarks.  If this is <code>null</code>,
+	 *         bookmarking is effectively disabled.
+	 * @see #setBookmarkIcon(Icon)
+	 * @see #isBookmarkingEnabled()
+	 */
+	public Icon getBookmarkIcon() {
+		return bookmarkIcon;
+	}
+
+
+	/**
+	 * Returns the bookmarks known to this gutter.
+	 *
+	 * @return The bookmarks.  If there are no bookmarks, an empty array is
+	 *         returned.
+	 */
+	public GutterIconInfo[] getBookmarks() {
+
+		List retVal = new ArrayList(1);
+
+		if (trackingIcons!=null) {
+			for (int i=0; i<trackingIcons.size(); i++) {
+				GutterIconImpl ti = getTrackingIcon(i);
+				if (ti.getIcon()==bookmarkIcon) {
+					retVal.add(ti);
+				}
+			}
+		}
+
+		GutterIconInfo[] array = new GutterIconInfo[retVal.size()];
+		return (GutterIconInfo[])retVal.toArray(array);
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void handleDocumentEvent(DocumentEvent e) {
+		int newLineCount = textArea.getLineCount();
+		if (newLineCount!=currentLineCount) {
+			currentLineCount = newLineCount;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Dimension getPreferredSize() {
+		int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+		return new Dimension(width, h);
+	}
+
+
+	protected GutterIconImpl getTrackingIcon(int index) {
+		return (GutterIconImpl)trackingIcons.get(index);
+	}
+
+
+	/**
+	 * Returns the tracking icons at the specified line.
+	 *
+	 * @param line The line.
+	 * @return The tracking icons at that line.  If there are no tracking
+	 *         icons there, this will be an empty array.
+	 * @throws BadLocationException If <code>line</code> is invalid.
+	 */
+	public GutterIconInfo[] getTrackingIcons(int line)
+								throws BadLocationException {
+
+		List retVal = new ArrayList(1);
+
+		if (trackingIcons!=null) {
+			int start = textArea.getLineStartOffset(line);
+			int end = textArea.getLineEndOffset(line);
+			if (line==textArea.getLineCount()-1) {
+				end++; // Hack
+			}
+			for (int i=0; i<trackingIcons.size(); i++) {
+				GutterIconImpl ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=start && offs<end) {
+					retVal.add(ti);
+				}
+				else if (offs>=end) {
+					break; // Quit early
+				}
+			}
+		}
+
+		GutterIconInfo[] array = new GutterIconInfo[retVal.size()];
+		return (GutterIconInfo[])retVal.toArray(array);
+
+	}
+
+
+	/**
+	 * Returns whether bookmarking is enabled.
+	 *
+	 * @return Whether bookmarking is enabled.
+	 * @see #setBookmarkingEnabled(boolean)
+	 */
+	public boolean isBookmarkingEnabled() {
+		return bookmarkingEnabled;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void lineHeightsChanged() {
+		repaint();
+	}
+
+
+	public void mouseClicked(MouseEvent e) {
+	}
+
+
+	public void mouseEntered(MouseEvent e) {
+	}
+
+
+	public void mouseExited(MouseEvent e) {
+	}
+
+
+	public void mousePressed(MouseEvent e) {
+		if (bookmarkingEnabled && bookmarkIcon!=null) {
+			try {
+				int offs = textArea.viewToModel(e.getPoint());
+				if (offs>-1) {
+					int line = textArea.getLineOfOffset(offs);
+					toggleBookmark(line);
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+	}
+
+
+	public void mouseReleased(MouseEvent e) {
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void paintComponent(Graphics g) {
+
+		if (textArea==null) {
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("IconRowHeader repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		g.setColor(getBackground());
+		g.fillRect(0,visibleRect.y, width,visibleRect.height);
+
+		if (textArea.getLineWrap()) {
+			paintComponentWrapped(g);
+			return;
+		}
+
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+
+		// Get the first and last lines to paint.
+		int cellHeight = textArea.getLineHeight();
+		int topLine = (visibleRect.y-textAreaInsets.top)/cellHeight;
+		int bottomLine = Math.min(topLine+visibleRect.height/cellHeight+1,
+							root.getElementCount());
+
+		// Get where to start painting (top of the row).
+		// We need to be "scrolled up" up just enough for the missing part of
+		// the first line.
+		int y = topLine*cellHeight + textAreaInsets.top;
+
+		if ((activeLineRangeStart>=topLine&&activeLineRangeStart<=bottomLine) ||
+			(activeLineRangeEnd>=topLine && activeLineRangeEnd<=bottomLine) ||
+			(activeLineRangeStart<=topLine && activeLineRangeEnd>=bottomLine)) {
+
+			g.setColor(activeLineRangeColor);
+			int firstLine = Math.max(activeLineRangeStart, topLine);
+			int y1 = firstLine * cellHeight + textAreaInsets.top;
+			int lastLine = Math.min(activeLineRangeEnd, bottomLine);
+			int y2 = (lastLine+1) * cellHeight + textAreaInsets.top - 1;
+
+			int j = y1;
+			while (j<=y2) {
+				int yEnd = Math.min(y2, j+getWidth());
+				int xEnd = yEnd-j;
+				g.drawLine(0,j, xEnd,yEnd);
+				j += 2;
+			}
+
+			int i = 2;
+			while (i<getWidth()) {
+				int yEnd = y1 + getWidth() - i;
+				g.drawLine(i,y1, getWidth(),yEnd);
+				i += 2;
+			}
+
+			if (firstLine==activeLineRangeStart) {
+				g.drawLine(0,y1, getWidth(),y1);
+			}
+			if (lastLine==activeLineRangeEnd) {
+				g.drawLine(0,y2, getWidth(),y2);
+			}
+
+		}
+
+		if (trackingIcons!=null) {
+			int lastLine = bottomLine;
+			for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+				GutterIconInfo ti = getTrackingIcon(i);
+				int offs = ti.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line<=lastLine && line>=topLine) {
+						Icon icon = ti.getIcon();
+						if (icon!=null) {
+							int y2 = y + (line-topLine)*cellHeight;
+							y2 += (cellHeight-icon.getIconHeight())/2;
+							ti.getIcon().paintIcon(this, g, 0, y2);
+							lastLine = line-1; // Paint only 1 icon per line
+						}
+					}
+					else if (line<topLine) {
+						break;
+					}
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Paints icons when line wrapping is enabled.
+	 *
+	 * @param g The graphics context.
+	 */
+	private void paintComponentWrapped(Graphics g) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+		// - offset (<=0) is the y-coordinate at which we begin painting when
+		// we begin painting with the first logical line.  This can be
+		// negative, signifying that we've scrolled past the actual topmost
+		// part of this line.
+
+		// The algorithm is as follows:
+		// - Get the starting y-coordinate at which to paint.  This may be
+		//   above the first visible y-coordinate as we're in line-wrapping
+		//   mode, but we always paint entire logical lines.
+		// - Paint that line's line number and highlight, if appropriate.
+		//   Increment y to be just below the are we just painted (i.e., the
+		//   beginning of the next logical line's view area).
+		// - Get the ending visual position for that line.  We can now loop
+		//   back, paint this line, and continue until our y-coordinate is
+		//   past the last visible y-value.
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+		View v = ui.getRootView(textArea).getView(0);
+//		boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int lineCount = root.getElementCount();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+
+		// Compute the y at which to begin painting text, taking into account
+		// that 1 logical line => at least 1 physical line, so it may be that
+		// y<0.  The computed y-value is the y-value of the top of the first
+		// (possibly) partially-visible view.
+		Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+		Rectangle r = IconRowHeader.getChildViewBounds(v, topLine,
+												visibleEditorRect);
+		int y = r.y;
+
+		int visibleBottom = visibleRect.y + visibleRect.height;
+
+		// Get the first possibly visible icon index.
+		int currentIcon = -1;
+		if (trackingIcons!=null) {
+			for (int i=0; i<trackingIcons.size(); i++) {
+				GutterIconImpl icon = getTrackingIcon(i);
+				int offs = icon.getMarkedOffset();
+				if (offs>=0 && offs<=doc.getLength()) {
+					int line = root.getElementIndex(offs);
+					if (line>=topLine) {
+						currentIcon = i;
+						break;
+					}
+				}
+			}
+		}
+
+		// Keep painting lines until our y-coordinate is past the visible
+		// end of the text area.
+		g.setColor(getForeground());
+		int cellHeight = textArea.getLineHeight();
+		while (y < visibleBottom) {
+
+			r = getChildViewBounds(v, topLine, visibleEditorRect);
+//			int lineEndY = r.y+r.height;
+
+			/*
+			// Highlight the current line's line number, if desired.
+			if (currentLineHighlighted && topLine==currentLine) {
+				g.setColor(textArea.getCurrentLineHighlightColor());
+				g.fillRect(0,y, width,lineEndY-y);
+				g.setColor(getForeground());
+			}
+			*/
+
+			// Possibly paint an icon.
+			if (currentIcon>-1) {
+				// We want to paint the last icon added for this line.
+				GutterIconImpl toPaint = null;
+				while (currentIcon<trackingIcons.size()) {
+					GutterIconImpl ti = getTrackingIcon(currentIcon);
+					int offs = ti.getMarkedOffset();
+					if (offs>=0 && offs<=doc.getLength()) {
+						int line = root.getElementIndex(offs);
+						if (line==topLine) {
+							toPaint = ti;
+						}
+						else if (line>topLine) {
+							break;
+						}
+					}
+					currentIcon++;
+				}
+				if (toPaint!=null) {
+					Icon icon = toPaint.getIcon();
+					if (icon!=null) {
+						int y2 = y + (cellHeight-icon.getIconHeight())/2;
+						icon.paintIcon(this, g, 0, y2);
+					}
+				}
+			}
+
+			// The next possible y-coordinate is just after the last line
+			// painted.
+			y += r.height;
+
+			// Update topLine (we're actually using it for our "current line"
+			// variable now).
+			topLine++;
+			if (topLine>=lineCount)
+				break;
+
+		}
+
+	}
+
+
+	/**
+	 * Removes the specified tracking icon.
+	 *
+	 * @param tag A tag for a tracking icon.
+	 * @see #removeAllTrackingIcons()
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeTrackingIcon(Object tag) {
+		if (trackingIcons!=null && trackingIcons.remove(tag)) {
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Removes all tracking icons.
+	 *
+	 * @see #removeTrackingIcon(Object)
+	 * @see #addOffsetTrackingIcon(int, Icon)
+	 */
+	public void removeAllTrackingIcons() {
+		if (trackingIcons!=null && trackingIcons.size()>0) {
+			trackingIcons.clear();
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Removes all bookmark tracking icons.
+	 */
+	private void removeBookmarkTrackingIcons() {
+		if (trackingIcons!=null) {
+			for (Iterator i=trackingIcons.iterator(); i.hasNext(); ) {
+				GutterIconImpl ti = (GutterIconImpl)i.next();
+				if (ti.getIcon()==bookmarkIcon) {
+					i.remove();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Highlights a range of lines in the icon area.
+	 *
+	 * @param startLine The start of the line range.
+	 * @param endLine The end of the line range.
+	 * @see #clearActiveLineRange()
+	 */
+	public void setActiveLineRange(int startLine, int endLine) {
+		if (startLine!=activeLineRangeStart ||
+				endLine!=activeLineRangeEnd) {
+			activeLineRangeStart = startLine;
+			activeLineRangeEnd = endLine;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the color to use to render active line ranges.
+	 *
+	 * @param color The color to use.  If this is null, then the default
+	 *        color is used.
+	 * @see #getActiveLineRangeColor()
+	 * @see Gutter#DEFAULT_ACTIVE_LINE_RANGE_COLOR
+	 */
+	public void setActiveLineRangeColor(Color color) {
+		if (color==null) {
+			color = Gutter.DEFAULT_ACTIVE_LINE_RANGE_COLOR;
+		}
+		if (!color.equals(activeLineRangeColor)) {
+			activeLineRangeColor = color;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the icon to use for bookmarks.  Any previous bookmark icons
+	 * are removed.
+	 *
+	 * @param icon The new bookmark icon.  If this is <code>null</code>,
+	 *        bookmarking is effectively disabled.
+	 * @see #getBookmarkIcon()
+	 * @see #isBookmarkingEnabled()
+	 */
+	public void setBookmarkIcon(Icon icon) {
+		removeBookmarkTrackingIcons();
+		bookmarkIcon = icon;
+		repaint();
+	}
+
+
+	/**
+	 * Sets whether bookmarking is enabled.  Note that a bookmarking icon
+	 * must be set via {@link #setBookmarkIcon(Icon)} before bookmarks are
+	 * truly enabled.
+	 *
+	 * @param enabled Whether bookmarking is enabled.  If this is
+	 *        <code>false</code>, any bookmark icons are removed.
+	 * @see #isBookmarkingEnabled()
+	 * @see #setBookmarkIcon(Icon)
+	 */
+	public void setBookmarkingEnabled(boolean enabled) {
+		if (enabled!=bookmarkingEnabled) {
+			bookmarkingEnabled = enabled;
+			if (!enabled) {
+				removeBookmarkTrackingIcons();
+			}
+			repaint();
+		}
+	}
+
+
+	/**
+	 * Sets the text area being displayed.  This will clear any tracking
+	 * icons currently displayed.
+	 *
+	 * @param textArea The text area.
+	 */
+	public void setTextArea(RTextArea textArea) {
+		removeAllTrackingIcons();
+		super.setTextArea(textArea);
+	}
+
+
+	/**
+	 * Programatically toggles whether there is a bookmark for the specified
+	 * line.  If bookmarking is not enabled, this method does nothing.
+	 *
+	 * @param line The line.
+	 * @return Whether a bookmark is now at the specified line.
+	 * @throws BadLocationException If <code>line</code> is an invalid line
+	 *         number in the text area.
+	 */
+	public boolean toggleBookmark(int line) throws BadLocationException {
+
+		if (!isBookmarkingEnabled() || getBookmarkIcon()==null) {
+			return false;
+		}
+
+		GutterIconInfo[] icons = getTrackingIcons(line);
+		if (icons.length==0) {
+			int offs = textArea.getLineStartOffset(line);
+			addOffsetTrackingIcon(offs, bookmarkIcon);
+			return true;
+		}
+
+		boolean found = false;
+		for (int i=0; i<icons.length; i++) {
+			if (icons[i].getIcon()==bookmarkIcon) {
+				removeTrackingIcon(icons[i]);
+				found = true;
+				// Don't quit, in case they manipulate the document so > 1
+				// bookmark is on a single line (kind of flaky, but it
+				// works...).  If they delete all chars in the document,
+				// AbstractDocument gets a little flaky with the returned line
+				// number for viewToModel(), so this is just us trying to save
+				// face a little.
+			}
+		}
+		if (!found) {
+			int offs = textArea.getLineStartOffset(line);
+			addOffsetTrackingIcon(offs, bookmarkIcon);
+		}
+
+		return !found;
+
+	}
+
+
+	/**
+	 * Sets our background color to that of standard "panels" in this
+	 * LookAndFeel.  This is necessary because, otherwise, we'd inherit the
+	 * background color of our parent component (the Gutter).
+	 */
+	private void updateBackground() {
+		Color bg = UIManager.getColor("Panel.background");
+		if (bg==null) { // UIManager properties aren't guaranteed to exist
+			bg = new JPanel().getBackground();
+		}
+		setBackground(bg);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void updateUI() {
+		super.updateUI(); // Does nothing
+		updateBackground();
+	}
+
+
+	/**
+	 * Implementation of the icons rendered.
+	 *
+	 * @author Robert Futrell
+	 * @version 1.0
+	 */
+	private static class GutterIconImpl implements GutterIconInfo, Comparable {
+
+		private Icon icon;
+		private Position pos;
+
+		public GutterIconImpl(Icon icon, Position pos) {
+			this.icon = icon;
+			this.pos = pos;
+		}
+
+		public int compareTo(Object o) {
+			if (o instanceof GutterIconImpl) {
+				return pos.getOffset() - ((GutterIconImpl)o).getMarkedOffset();
+			}
+			return -1;
+		}
+
+		public boolean equals(Object o) {
+			return o==this;
+		}
+
+		public Icon getIcon() {
+			return icon;
+		}
+
+		public int getMarkedOffset() {
+			return pos.getOffset();
+		}
+
+		public int hashCode() {
+			return icon.hashCode(); // FindBugs
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java	(revision 25584)
@@ -0,0 +1,171 @@
+/*
+ * 01/22/2005
+ *
+ * ImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.MediaTracker;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import javax.imageio.ImageIO;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image.  The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.BufferedImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.VolatileImageBackgroundPainterStrategy
+ */
+public abstract class ImageBackgroundPainterStrategy
+					implements BackgroundPainterStrategy {
+
+	protected MediaTracker tracker;
+
+	private RTextAreaBase textArea;
+	private Image master;
+	private int oldWidth, oldHeight;
+	private int scalingHint;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The text area using this image as its background.
+	 */
+	public ImageBackgroundPainterStrategy(RTextAreaBase textArea) {
+		this.textArea = textArea;
+		tracker = new MediaTracker(textArea);
+		scalingHint = Image.SCALE_FAST;
+	}
+
+
+	/**
+	 * Returns the text area using this strategy.
+	 *
+	 * @return The text area.
+	 */
+	public RTextAreaBase getRTextAreaBase() {
+		return textArea;
+	}
+
+
+	/**
+	 * Returns the "master" image; that is, the original, unscaled image.
+	 * When the image needs to be rescaled, scaling should be done from
+	 * this image, to prevent repeated scaling from distorting the image.
+	 *
+	 * @return The master image.
+	 */
+	public Image getMasterImage() {
+		return master;
+	}
+
+
+	/**
+	 * Returns the scaling hint being used.
+	 *
+	 * @return The scaling hint to use when scaling an image.
+	 * @see #setScalingHint
+	 */
+	public int getScalingHint() {
+		return scalingHint;
+	}
+
+
+	/**
+	 * Paints the image at the specified location and at the specified size.
+	 *
+	 * @param g The graphics context.
+	 * @param bounds The bounds in which to paint the image.  The image
+	 *        will be scaled to fit exactly in these bounds if necessary.
+	 */
+	public final void paint(Graphics g, Rectangle bounds) {
+		if (bounds.width!=oldWidth || bounds.height!=oldHeight) {
+			rescaleImage(bounds.width, bounds.height, getScalingHint());
+			oldWidth = bounds.width;
+			oldHeight = bounds.height;
+		}
+		paintImage(g, bounds.x,bounds.y);
+	}
+
+
+	/**
+	 * Paints the image at the specified location.  This method assumes
+	 * scaling has already been done, and simply paints the background
+	 * image "as-is."
+	 *
+	 * @param g The graphics context.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 */
+	protected abstract void paintImage(Graphics g, int x, int y);
+
+
+	/**
+	 * Rescales the displayed image to be the specified size.
+	 *
+	 * @param width The new width of the image.
+	 * @param height The new height of the image.
+	 * @param hint The scaling hint to use.
+	 */
+	protected abstract void rescaleImage(int width, int height,
+								int hint);
+
+
+	/**
+	 * Sets the image this background painter displays.
+	 *
+	 * @param imageURL URL of a file containing the image to display.
+	 */
+	public void setImage(URL imageURL) {
+		BufferedImage image = null;
+		try {
+			image = ImageIO.read(imageURL);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		setImage(image);
+	}
+
+	/**
+	 * Sets the image this background painter displays.
+	 *
+	 * @param image The new image to use for the background.
+	 */
+	public void setImage(Image image) {
+		master = image;
+		oldWidth = -1; // To trick us into fixing bgImage.
+	}
+
+
+	/**
+	 * Sets the scaling hint to use when scaling the image.
+	 *
+	 * @param hint The hint to apply; e.g. <code>Image.SCALE_DEFAULT</code>.
+	 * @see #getScalingHint
+	 */
+	public void setScalingHint(int hint) {
+		this.scalingHint = hint;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/LineHighlightManager.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/LineHighlightManager.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/LineHighlightManager.java	(revision 25584)
@@ -0,0 +1,210 @@
+/*
+ * 02/10/2009
+ *
+ * LineHighlightManager - Manages line highlights.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Position;
+
+
+/**
+ * Manages line highlights in an <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class LineHighlightManager {
+
+	private RTextArea textArea;
+	private List lineHighlights;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public LineHighlightManager(RTextArea textArea) {
+		this.textArea = textArea;
+	}
+
+
+	/**
+	 * Highlights the specified line.
+	 *
+	 * @param line The line to highlight.
+	 * @param color The color to highlight with.
+	 * @return A tag for the highlight.
+	 * @throws BadLocationException If <code>line</code> is not a valid line
+	 *         number.
+	 * @see #removeLineHighlight(Object)
+	 */
+	public Object addLineHighlight(int line, Color color)
+									throws BadLocationException {
+		int offs = textArea.getLineStartOffset(line);
+		LineHighlightInfo lhi = new LineHighlightInfo(
+						textArea.getDocument().createPosition(offs), color);
+		if (lineHighlights==null) {
+			lineHighlights = new ArrayList(1);
+		}
+		int index = Collections.binarySearch(lineHighlights, lhi);
+		if (index<0) { // Common case
+			index = -(index+1);
+		}
+		lineHighlights.add(index, lhi);
+		repaintLine(lhi);
+		return lhi;
+	}
+
+
+	/**
+	 * Paints any highlighted lines in the specified line range.
+	 *
+	 * @param g The graphics context.
+	 */
+	public void paintLineHighlights(Graphics g) {
+
+		int count = lineHighlights==null ? 0 : lineHighlights.size();
+		if (count>0) {
+
+			int docLen = textArea.getDocument().getLength();
+			Rectangle vr = textArea.getVisibleRect();
+			int lineHeight = textArea.getLineHeight();
+
+			try {
+
+				for (int i=0; i<count; i++) {
+					LineHighlightInfo lhi =(LineHighlightInfo)
+													lineHighlights.get(i);
+					int offs = lhi.getOffset();
+					if (offs>=0 && offs<=docLen) {
+						int y = textArea.yForLineContaining(offs);
+						if (y>vr.y-lineHeight) {
+							if (y<vr.y+vr.height) {
+								g.setColor(lhi.getColor());
+								g.fillRect(0,y, textArea.getWidth(),lineHeight);
+							}
+							else {
+								break; // Out of visible rect
+							}
+						}
+					}
+				}
+
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+			}
+		}
+
+	}
+
+
+	/**
+	 * Removes all line highlights.
+	 *
+	 * @see #removeLineHighlight(Object)
+	 */
+	public void removeAllLineHighlights() {
+		if (lineHighlights!=null) {
+			lineHighlights.clear();
+			textArea.repaint();
+		}
+	}
+
+
+	/**
+	 * Removes a line highlight.
+	 *
+	 * @param tag The tag of the line highlight to remove.
+	 * @see #addLineHighlight(int, Color)
+	 */
+	public void removeLineHighlight(Object tag) {
+		if (tag instanceof LineHighlightInfo) {
+			lineHighlights.remove(tag);
+			repaintLine((LineHighlightInfo)tag);
+		}
+	}
+
+
+	/**
+	 * Repaints the line pointed to by the specified highlight information.
+	 *
+	 * @param lhi The highlight information.
+	 */
+	private void repaintLine(LineHighlightInfo lhi) {
+		int offs = lhi.getOffset();
+		// May be > length if they deleted text including the highlight
+		if (offs>=0 && offs<=textArea.getDocument().getLength()) {
+			try {
+				int y = textArea.yForLineContaining(offs);
+				if (y>-1) {
+					textArea.repaint(0, y,
+								textArea.getWidth(), textArea.getLineHeight());
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+		}
+	}
+
+
+	/**
+	 * Information about a line highlight.
+	 *
+	 * @author Robert Futrell
+	 * @version 1.0
+	 */
+	private static class LineHighlightInfo implements Comparable {
+
+		private Position offs;
+		private Color color;
+
+		public LineHighlightInfo(Position offs, Color c) {
+			this.offs = offs;
+			this.color = c;
+		}
+
+		public int compareTo(Object o) {
+			if (o instanceof LineHighlightInfo) {
+				return offs.getOffset() - ((LineHighlightInfo)o).getOffset();
+			}
+			return -1;
+		}
+
+		public boolean equals(Object o) {
+			if (o==this) {
+				return true;
+			}
+			if (o instanceof LineHighlightInfo) {
+				return offs.getOffset()==((LineHighlightInfo)o).getOffset();
+			}
+			return false;
+		}
+
+		public Color getColor() {
+			return color;
+		}
+
+		public int getOffset() {
+			return offs.getOffset();
+		}
+
+		public int hashCode() {
+			return getOffset();
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/LineNumberList.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/LineNumberList.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/LineNumberList.java	(revision 25584)
@@ -0,0 +1,689 @@
+/*
+ * 02/11/2009
+ *
+ * LineNumberList.java - Renders line numbers in an RTextScrollPane.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Map;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.MouseInputListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * Renders line numbers in the gutter.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LineNumberList extends AbstractGutterComponent
+								implements MouseInputListener {
+
+	private int currentLine;	// The last line the caret was on.
+	private int lastY = -1;		// Used to check if caret changes lines when line wrap is enabled.
+
+	private int cellHeight;		// Height of a line number "cell" when word wrap is off.
+	private int cellWidth;		// The width used for all line number cells.
+	private int ascent;			// The ascent to use when painting line numbers.
+
+	private Map aaHints;
+
+	private int mouseDragStartOffset;
+
+	/**
+	 * Listens for events from the current text area.
+	 */
+	private Listener l;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Insets textAreaInsets;
+
+	/**
+	 * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+	 * each paint.
+	 */
+	private Rectangle visibleRect;
+
+	/**
+	 * The index at which line numbering should start.  The default value is
+	 * <code>1</code>, but applications can change this if, for example, they
+	 * are displaying a subset of lines in a file.
+	 */
+	private int lineNumberingStartIndex;
+
+
+	/**
+	 * Constructs a new <code>LineNumberList</code> using default values for
+	 * line number color (gray) and highlighting the current line.
+	 *
+	 * @param textArea The text component for which line numbers will be
+	 *        displayed.
+	 */
+	public LineNumberList(RTextArea textArea) {
+		this(textArea, null);
+	}
+
+
+	/**
+	 * Constructs a new <code>LineNumberList</code>.
+	 *
+	 * @param textArea The text component for which line numbers will be
+	 *        displayed.
+	 * @param numberColor The color to use for the line numbers.  If this is
+	 *        <code>null</code>, gray will be used.
+	 */
+	public LineNumberList(RTextArea textArea, Color numberColor) {
+
+		super(textArea);
+
+		if (numberColor!=null) {
+			setForeground(numberColor);
+		}
+		else {
+			setForeground(Color.GRAY);
+		}
+
+		// Initialize currentLine; otherwise, the current line won't start
+		// off as highlighted.
+		currentLine = 0;
+		setLineNumberingStartIndex(1);
+
+		visibleRect = new Rectangle(); // Must be initialized
+
+		addMouseListener(this);
+		addMouseMotionListener(this);
+
+		aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+
+	}
+
+
+	/**
+	 * Overridden to set width of this component correctly when we are first
+	 * displayed (as keying off of the RTextArea gives us (0,0) when it isn't
+	 * yet displayed.
+	 */
+	public void addNotify() {
+		super.addNotify();
+		if (textArea!=null) {
+			l.install(textArea); // Won't double-install
+		}
+		updateCellWidths();
+		updateCellHeights();
+	}
+
+
+	/**
+	 * Returns the starting line's line number.  The default value is
+	 * <code>1</code>.
+	 *
+	 * @return The index
+	 * @see #setLineNumberingStartIndex(int)
+	 */
+	public int getLineNumberingStartIndex() {
+		return lineNumberingStartIndex;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Dimension getPreferredSize() {
+		int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+		return new Dimension(cellWidth, h);
+	}
+
+
+	/**
+	 * Returns the width of the empty border on this component's right-hand
+	 * side (or left-hand side, if the orientation is RTL).
+	 *
+	 * @return The border width.
+	 */
+	private int getRhsBorderWidth() {
+		int w = 4;
+		if (textArea instanceof RSyntaxTextArea) {
+			if (((RSyntaxTextArea)textArea).isCodeFoldingEnabled()) {
+				w = 0;
+			}
+		}
+		return w;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void handleDocumentEvent(DocumentEvent e) {
+		int newLineCount = textArea!=null ? textArea.getLineCount() : 0;
+		if (newLineCount!=currentLineCount) {
+			// Adjust the amount of space the line numbers take up,
+			// if necessary.
+			if (newLineCount/10 != currentLineCount/10) {
+				updateCellWidths();
+			}
+			currentLineCount = newLineCount;
+			repaint();
+		}
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	void lineHeightsChanged() {
+		updateCellHeights();
+	}
+
+
+	public void mouseClicked(MouseEvent e) {
+	}
+
+
+	public void mouseDragged(MouseEvent e) {
+		if (mouseDragStartOffset>-1) {
+			int pos = textArea.viewToModel(new Point(0, e.getY()));
+			if (pos>=0) { // Not -1
+				textArea.setCaretPosition(mouseDragStartOffset);
+				textArea.moveCaretPosition(pos);
+			}
+		}
+	}
+
+
+	public void mouseEntered(MouseEvent e) {
+	}
+
+
+	public void mouseExited(MouseEvent e) {
+	}
+
+
+	public void mouseMoved(MouseEvent e) {
+	}
+
+
+	public void mousePressed(MouseEvent e) {
+		if (textArea==null) {
+			return;
+		}
+		if (e.getButton()==MouseEvent.BUTTON1) {
+			int pos = textArea.viewToModel(new Point(0, e.getY()));
+			if (pos>=0) { // Not -1
+				textArea.setCaretPosition(pos);
+			}
+			mouseDragStartOffset = pos;
+		}
+		else {
+			mouseDragStartOffset = -1;
+		}
+	}
+
+
+	public void mouseReleased(MouseEvent e) {
+	}
+
+
+	/**
+	 * Paints this component.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintComponent(Graphics g) {
+
+		if (textArea==null) {
+			return;
+		}
+
+		visibleRect = g.getClipBounds(visibleRect);
+		if (visibleRect==null) { // ???
+			visibleRect = getVisibleRect();
+		}
+		//System.out.println("LineNumberList repainting: " + visibleRect);
+		if (visibleRect==null) {
+			return;
+		}
+
+		Color bg = getBackground();
+		if (getGutter()!=null) { // Should always be true
+			bg = getGutter().getBackground();
+		}
+		g.setColor(bg);
+		g.fillRect(0,visibleRect.y, cellWidth,visibleRect.height);
+		g.setFont(getFont());
+		if (aaHints!=null) {
+			((Graphics2D)g).addRenderingHints(aaHints);
+		}
+
+		if (textArea.getLineWrap()) {
+			paintWrappedLineNumbers(g, visibleRect);
+			return;
+		}
+
+		// Get where to start painting (top of the row), and where to paint
+		// the line number (drawString expects y==baseline).
+		// We need to be "scrolled up" just enough for the missing part of
+		// the first line.
+		int topLine = visibleRect.y/cellHeight;
+		int actualTopY = topLine*cellHeight;
+		textAreaInsets = textArea.getInsets(textAreaInsets);
+		actualTopY += textAreaInsets.top;
+		int y = actualTopY + ascent;
+
+		// Get the actual first line to paint, taking into account folding.
+		FoldManager fm = null;
+		if (textArea instanceof RSyntaxTextArea) {
+			fm = ((RSyntaxTextArea)textArea).getFoldManager();
+			topLine += fm.getHiddenLineCountAbove(topLine, true);
+		}
+		final int RHS_BORDER_WIDTH = getRhsBorderWidth();
+
+/*
+		// Highlight the current line's line number, if desired.
+		if (textArea.getHighlightCurrentLine() && currentLine>=topLine &&
+				currentLine<=bottomLine) {
+			g.setColor(textArea.getCurrentLineHighlightColor());
+			g.fillRect(0,actualTopY+(currentLine-topLine)*cellHeight,
+						cellWidth,cellHeight);
+		}
+*/
+
+		// Paint line numbers
+		g.setColor(getForeground());
+		boolean ltr = getComponentOrientation().isLeftToRight();
+		if (ltr) {
+			FontMetrics metrics = g.getFontMetrics();
+			int rhs = getWidth() - RHS_BORDER_WIDTH;
+			int line = topLine + 1;
+			while (y<visibleRect.y+visibleRect.height+ascent && line<=textArea.getLineCount()) {
+				String number = Integer.toString(line + getLineNumberingStartIndex() - 1);
+				int width = metrics.stringWidth(number);
+				g.drawString(number, rhs-width,y);
+				y += cellHeight;
+				Fold fold = fm.getFoldForLine(line-1);
+				// Skip to next line to paint, taking extra care for lines with
+				// block ends and begins together, e.g. "} else {"
+				while (fold!=null && fold.isCollapsed()) {
+					int hiddenLineCount = fold.getLineCount();
+					if (hiddenLineCount==0) {
+						// Fold parser identified a 0-line fold region... This
+						// is really a bug, but we'll handle it gracefully.
+						break;
+					}
+					line += hiddenLineCount;
+					fold = fm.getFoldForLine(line-1);
+				}
+				line++;
+			}
+		}
+		else { // rtl
+			int line = topLine + 1;
+			while (y<visibleRect.y+visibleRect.height && line<textArea.getLineCount()) {
+				String number = Integer.toString(line + getLineNumberingStartIndex() - 1);
+				g.drawString(number, RHS_BORDER_WIDTH, y);
+				y += cellHeight;
+				Fold fold = fm.getFoldForLine(line-1);
+				// Skip to next line to paint, taking extra care for lines with
+				// block ends and begins together, e.g. "} else {"
+				while (fold!=null && fold.isCollapsed()) {
+					line += fold.getLineCount();
+					fold = fm.getFoldForLine(line);
+				}
+				line++;
+			}
+		}
+
+	}
+
+
+	/**
+	 * Paints line numbers for text areas with line wrap enabled.
+	 *
+	 * @param g The graphics context.
+	 * @param visibleRect The visible rectangle of these line numbers.
+	 */
+	private void paintWrappedLineNumbers(Graphics g, Rectangle visibleRect) {
+
+		// The variables we use are as follows:
+		// - visibleRect is the "visible" area of the text area; e.g.
+		// [0,100, 300,100+(lineCount*cellHeight)-1].
+		// actualTop.y is the topmost-pixel in the first logical line we
+		// paint.  Note that we may well not paint this part of the logical
+		// line, as it may be broken into many physical lines, with the first
+		// few physical lines scrolled past.  Note also that this is NOT the
+		// visible rect of this line number list; this line number list has
+		// visible rect == [0,0, insets.left-1,visibleRect.height-1].
+		// - offset (<=0) is the y-coordinate at which we begin painting when
+		// we begin painting with the first logical line.  This can be
+		// negative, signifying that we've scrolled past the actual topmost
+		// part of this line.
+
+		// The algorithm is as follows:
+		// - Get the starting y-coordinate at which to paint.  This may be
+		//   above the first visible y-coordinate as we're in line-wrapping
+		//   mode, but we always paint entire logical lines.
+		// - Paint that line's line number and highlight, if appropriate.
+		//   Increment y to be just below the are we just painted (i.e., the
+		//   beginning of the next logical line's view area).
+		// - Get the ending visual position for that line.  We can now loop
+		//   back, paint this line, and continue until our y-coordinate is
+		//   past the last visible y-value.
+
+		// We avoid using modelToView/viewToModel where possible, as these
+		// methods trigger a parsing of the line into syntax tokens, which is
+		// costly.  It's cheaper to just grab the child views' bounds.
+
+		// Some variables we'll be using.
+		int width = getWidth();
+
+		RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+		View v = ui.getRootView(textArea).getView(0);
+		//boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+		Document doc = textArea.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int lineCount = root.getElementCount();
+		int topPosition = textArea.viewToModel(
+								new Point(visibleRect.x,visibleRect.y));
+		int topLine = root.getElementIndex(topPosition);
+		FoldManager fm = ((RSyntaxTextArea)textArea).getFoldManager();
+
+		// Compute the y at which to begin painting text, taking into account
+		// that 1 logical line => at least 1 physical line, so it may be that
+		// y<0.  The computed y-value is the y-value of the top of the first
+		// (possibly) partially-visible view.
+		Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+		Rectangle r = LineNumberList.getChildViewBounds(v, topLine,
+												visibleEditorRect);
+		int y = r.y;
+		final int RHS_BORDER_WIDTH = getRhsBorderWidth();
+		int rhs;
+		boolean ltr = getComponentOrientation().isLeftToRight();
+		if (ltr) {
+			rhs = width - RHS_BORDER_WIDTH;
+		}
+		else { // rtl
+			rhs = RHS_BORDER_WIDTH;
+		}
+		int visibleBottom = visibleRect.y + visibleRect.height;
+		FontMetrics metrics = g.getFontMetrics();
+
+		// Keep painting lines until our y-coordinate is past the visible
+		// end of the text area.
+		g.setColor(getForeground());
+
+		while (y < visibleBottom) {
+
+			r = LineNumberList.getChildViewBounds(v, topLine, visibleEditorRect);
+
+			/*
+			// Highlight the current line's line number, if desired.
+			if (currentLineHighlighted && topLine==currentLine) {
+				g.setColor(textArea.getCurrentLineHighlightColor());
+				g.fillRect(0,y, width,(r.y+r.height)-y);
+				g.setColor(getForeground());
+			}
+			*/
+
+			// Paint the line number.
+			int index = (topLine+1) + getLineNumberingStartIndex() - 1;
+			String number = Integer.toString(index);
+			if (ltr) {
+				int strWidth = metrics.stringWidth(number);
+				g.drawString(number, rhs-strWidth,y+ascent);
+			}
+			else {
+				int x = RHS_BORDER_WIDTH;
+				g.drawString(number, x, y+ascent);
+			}
+
+			// The next possible y-coordinate is just after the last line
+			// painted.
+			y += r.height;
+
+			// Update topLine (we're actually using it for our "current line"
+			// variable now).
+			Fold fold = fm.getFoldForLine(topLine);
+			if (fold!=null && fold.isCollapsed()) {
+				topLine += fold.getCollapsedLineCount();
+			}
+			topLine++;
+			if (topLine>=lineCount)
+				break;
+
+		}
+
+	}
+
+
+	/**
+	 * Called when this component is removed from the view hierarchy.
+	 */
+	public void removeNotify() {
+		super.removeNotify();
+		if (textArea!=null) {
+			l.uninstall(textArea);
+		}
+	}
+
+
+	/**
+	 * Repaints a single line in this list.
+	 *
+	 * @param line The line to repaint.
+	 */
+	private void repaintLine(int line) {
+		int y = textArea.getInsets().top;
+		y += line*cellHeight;
+		repaint(0,y, cellWidth,cellHeight);
+	}
+
+
+	/**
+	 * Overridden to ensure line number cell sizes are updated with the
+	 * font size change.
+	 *
+	 * @param font The new font to use for line numbers.
+	 */
+	public void setFont(Font font) {
+		super.setFont(font);
+		updateCellWidths();
+		updateCellHeights();
+	}
+
+
+	/**
+	 * Sets the starting line's line number.  The default value is
+	 * <code>1</code>.  Applications can call this method to change this value
+	 * if they are displaying a subset of lines in a file, for example.
+	 *
+	 * @param index The new index.
+	 * @see #getLineNumberingStartIndex()
+	 */
+	public void setLineNumberingStartIndex(int index) {
+		lineNumberingStartIndex = index;
+	}
+
+
+	/**
+	 * Sets the text area being displayed.
+	 *
+	 * @param textArea The text area.
+	 */
+	public void setTextArea(RTextArea textArea) {
+
+		if (l==null) {
+			l = new Listener();
+		}
+
+		if (this.textArea!=null) {
+			l.uninstall(textArea);
+		}
+
+		super.setTextArea(textArea);
+
+		if (textArea!=null) {
+			l.install(textArea); // Won't double-install
+			updateCellHeights();
+			updateCellWidths();
+		}
+
+	}
+
+
+	/**
+	 * Changes the height of the cells in the JList so that they are as tall as
+	 * font. This function should be called whenever the user changes the Font
+	 * of <code>textArea</code>.
+	 */
+	private void updateCellHeights() {
+		if (textArea!=null) {
+			cellHeight = textArea.getLineHeight();
+			ascent = textArea.getMaxAscent();
+		}
+		else {
+			cellHeight = 20; // Arbitrary number.
+			ascent = 5; // Also arbitrary
+		}
+		repaint();
+	}
+
+
+	/**
+	 * Changes the width of the cells in the JList so you can see every digit
+	 * of each.
+	 */
+	void updateCellWidths() {
+
+		int oldCellWidth = cellWidth;
+		cellWidth = getRhsBorderWidth();
+
+		// Adjust the amount of space the line numbers take up, if necessary.
+		if (textArea!=null) {
+			Font font = getFont();
+			if (font!=null) {
+				FontMetrics fontMetrics = getFontMetrics(font);
+				int count = 0;
+				int lineCount = textArea.getLineCount();
+				do {
+					lineCount = lineCount/10;
+					count++;
+				} while (lineCount >= 10);
+				cellWidth += fontMetrics.charWidth('9')*(count+1) + 3;
+			}
+		}
+
+		if (cellWidth!=oldCellWidth) { // Always true
+			revalidate();
+		}
+
+	}
+
+
+	/**
+	 * Listens for events in the text area we're interested in.
+	 */
+	private class Listener implements CaretListener, PropertyChangeListener {
+
+		private boolean installed;
+
+		public void caretUpdate(CaretEvent e) {
+
+			int dot = textArea.getCaretPosition();
+
+			// We separate the line wrap/no line wrap cases because word wrap
+			// can make a single line from the model (document) be on multiple
+			// lines on the screen (in the view); thus, we have to enhance the
+			// logic for that case a bit - we check the actual y-coordinate of
+			// the caret when line wrap is enabled.  For the no-line-wrap case,
+			// getting the line number of the caret suffices.  This increases
+			// efficiency in the no-line-wrap case.
+
+			if (textArea.getLineWrap()==false) {
+				int line = textArea.getDocument().getDefaultRootElement().
+										getElementIndex(dot);
+				if (currentLine!=line) {
+					repaintLine(line);
+					repaintLine(currentLine);
+					currentLine = line;
+				}
+			}
+			else { // lineWrap enabled; must check actual y position of caret
+				try {
+					int y = textArea.yForLineContaining(dot);
+					if (y!=lastY) {
+						lastY = y;
+						currentLine = textArea.getDocument().
+								getDefaultRootElement().getElementIndex(dot);
+						repaint(); // *Could* be optimized...
+					}
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+				}
+			}
+
+		}
+
+		public void install(RTextArea textArea) {
+			if (!installed) {
+				//System.out.println("Installing");
+				textArea.addCaretListener(this);
+				textArea.addPropertyChangeListener(this);
+				caretUpdate(null); // Force current line highlight repaint
+				installed = true;
+			}
+		}
+
+		public void propertyChange(PropertyChangeEvent e) {
+
+			String name = e.getPropertyName();
+
+			// If they change the current line highlight in any way...
+			if (RTextArea.HIGHLIGHT_CURRENT_LINE_PROPERTY.equals(name) ||
+				RTextArea.CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY.equals(name)) {
+				repaintLine(currentLine);
+			}
+
+		}
+
+		public void uninstall(RTextArea textArea) {
+			if (installed) {
+				//System.out.println("Uninstalling");
+				textArea.removeCaretListener(this);
+				textArea.removePropertyChangeListener(this);
+				installed = false;
+			}
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/Macro.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/Macro.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/Macro.java	(revision 25584)
@@ -0,0 +1,392 @@
+/*
+ * 09/16/2004
+ *
+ * Macro.java - A macro as recorded/played back by an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.stream.*;
+import org.w3c.dom.*;
+import org.xml.sax.InputSource;
+
+import org.fife.io.UnicodeReader;
+
+
+/**
+ * A macro as recorded/played back by an <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class Macro {
+
+	private String name;
+	private ArrayList macroRecords;
+
+	private static final String ROOT_ELEMENT			= "macro";
+	private static final String MACRO_NAME				= "macroName";
+	private static final String ACTION					= "action";
+	private static final String ID					= "id";
+
+	private static final String UNTITLED_MACRO_NAME		= "<Untitled>";
+
+	private static final String FILE_ENCODING			= "UTF-8";
+
+
+	/**
+	 * Constructor.
+	 */
+	public Macro() {
+		this(UNTITLED_MACRO_NAME);
+	}
+
+
+	/**
+	 * Loads a macro from a file on disk.
+	 *
+	 * @param file The file from which to load the macro.
+	 * @throws java.io.EOFException If an EOF is reached unexpectedly (i.e.,
+	 *         the file is corrupt).
+	 * @throws FileNotFoundException If the specified file does not exist, is
+	 *         a directory instead of a regular file, or otherwise cannot be
+	 *         opened.
+	 * @throws IOException If an I/O exception occurs while reading the file.
+	 * @see #saveToFile
+	 */
+	public Macro(File file) throws EOFException, FileNotFoundException,
+								IOException {
+
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		DocumentBuilder db = null;
+		Document doc = null;
+		try {
+			db = dbf.newDocumentBuilder();
+			//InputSource is = new InputSource(new FileReader(file));
+			InputSource is = new InputSource(new UnicodeReader(
+								new FileInputStream(file), FILE_ENCODING));
+			is.setEncoding(FILE_ENCODING);
+			doc = db.parse(is);//db.parse(file);
+		} catch (Exception e) {
+			e.printStackTrace();
+			String desc = e.getMessage();
+			if (desc==null) {
+				desc = e.toString();
+			}
+			throw new IOException("Error parsing XML: " + desc);
+		}
+
+		macroRecords = new ArrayList();
+
+		// Traverse the XML tree.
+		boolean parsedOK = initializeFromXMLFile(doc.getDocumentElement());
+		if (parsedOK==false) {
+			name = null;
+			macroRecords.clear();
+			macroRecords = null;
+			throw new IOException("Error parsing XML!");
+		}
+
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the macro.
+	 */
+	public Macro(String name) {
+		this(name, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name The name of the macro.
+	 * @param records The initial records of the macro.
+	 */
+	public Macro(String name, List records) {
+		
+		this.name = name;
+
+		if (records!=null) {
+			macroRecords = new ArrayList(records.size());
+			Iterator i = records.iterator();
+			while (i.hasNext()) {
+				MacroRecord record = (MacroRecord)i.next();
+				macroRecords.add(record);
+			}
+		}
+		else {
+			macroRecords = new ArrayList(10);
+		}
+	
+	}
+
+
+	/**
+	 * Adds a macro record to this macro.
+	 *
+	 * @param record The record to add.  If <code>null</code>, nothing happens.
+	 * @see #getMacroRecords
+	 */
+	public void addMacroRecord(MacroRecord record) {
+		if (record!=null)
+			macroRecords.add(record);
+	}
+
+
+	/**
+	 * Returns the macro records that make up this macro.
+	 *
+	 * @return The macro records.
+	 * @see #addMacroRecord
+	 */
+	public List getMacroRecords() {
+		return macroRecords;
+	}
+
+
+	/**
+	 * Returns the name of this macro.
+	 *
+	 * @return The macro's name.
+	 * @see #setName
+	 */
+	public String getName() {
+		return name;
+	}
+
+
+	/**
+	 * Used in parsing an XML document containing a macro.  This method
+	 * initializes this macro with the data contained in the passed-in node.
+	 *
+	 * @param node The root node of the parsed XML document.
+	 * @return <code>true</code> if the macro initialization went okay;
+	 *         <code>false</code> if an error occurred.
+	 */
+	private boolean initializeFromXMLFile(Element root) {
+
+		/*
+		 * This method expects the XML document to be in the following format:
+		 *
+		 * <?xml version="1.0" encoding="UTF-8" ?>
+		 * <macro>
+		 *    <macroName>test</macroName>
+		 *    <action id="default-typed">abcdefg</action>
+		 *    [<action id=...>...</action>]
+		 *    ...
+		 * </macro>
+		 *
+		 */
+
+		NodeList childNodes = root.getChildNodes();
+		int count = childNodes.getLength();
+
+		for (int i=0; i<count; i++) {
+
+			Node node = childNodes.item(i);
+			int type = node.getNodeType();
+			switch (type) {
+
+				// Handle element nodes.
+				case Node.ELEMENT_NODE:
+
+					String nodeName = node.getNodeName();
+
+					if (nodeName.equals(MACRO_NAME)) {
+						NodeList childNodes2 = node.getChildNodes();
+						name = UNTITLED_MACRO_NAME;
+						if (childNodes2.getLength()>0) {
+							node = childNodes2.item(0);
+							int type2 = node.getNodeType();
+							if (type2!=Node.CDATA_SECTION_NODE &&
+									type2!=Node.TEXT_NODE) {
+								return false;
+							}
+							name = node.getNodeValue().trim();
+						}
+						//System.err.println("Macro name==" + name);
+					}
+
+					else if (nodeName.equals(ACTION)) {
+						NamedNodeMap attributes = node.getAttributes();
+						if (attributes==null || attributes.getLength()!=1)
+							return false;
+						Node node2 = attributes.item(0);
+						MacroRecord macroRecord = new MacroRecord();
+						if (!node2.getNodeName().equals(ID)) {
+							return false;
+						}
+						macroRecord.id = node2.getNodeValue();
+						NodeList childNodes2 = node.getChildNodes();
+						int length = childNodes2.getLength();
+						if (length==0) { // Could be empty "" command.
+							//System.err.println("... empty actionCommand");
+							macroRecord.actionCommand = "";
+							//System.err.println("... adding action: " + macroRecord);
+							macroRecords.add(macroRecord);
+							break;
+						}
+						else {
+							node = childNodes2.item(0);
+							int type2 = node.getNodeType();
+							if (type2!=Node.CDATA_SECTION_NODE &&
+									type2!=Node.TEXT_NODE) {
+								return false;
+							}
+							macroRecord.actionCommand = node.getNodeValue();
+							macroRecords.add(macroRecord);
+						}
+
+					}
+					break;
+
+				default:
+					break; // Skip whitespace nodes, etc.
+
+			}
+
+		}
+
+		// Everything went okay.
+		return true;
+
+	}
+
+
+	/**
+	 * Saves this macro to a text file.  This file can later be read in by
+	 * the constructor taking a <code>File</code> parameter; this is the
+	 * mechanism for saving macros.
+	 *
+	 * @param fileName The name of the file in which to save the macro.
+	 * @throws IOException If an error occurs while generating the XML for
+	 *         the output file.
+	 */
+	public void saveToFile(String fileName) throws IOException {
+
+		/*
+		 * This method writes the XML document in the following format:
+		 *
+		 * <?xml version="1.0" encoding="UTF-8" ?>
+		 * <macro>
+		 *    <macroName>test</macroName>
+		 *    <action id="default-typed">abcdefg</action>
+		 *    [<action id=...>...</action>]
+		 *    ...
+		 * </macro>
+		 *
+		 */
+
+		try {
+
+			DocumentBuilder db = DocumentBuilderFactory.newInstance().
+											newDocumentBuilder();
+			DOMImplementation impl = db.getDOMImplementation();
+
+			Document doc = impl.createDocument(null, ROOT_ELEMENT, null);
+			Element rootElement = doc.getDocumentElement();
+
+			// Write the name of the macro.
+			Element nameElement = doc.createElement(MACRO_NAME);
+			rootElement.appendChild(nameElement);
+
+			// Write all actions (the meat) in the macro.
+			int numActions = macroRecords.size();
+			for (int i=0; i<numActions; i++) {
+				MacroRecord record = (MacroRecord)macroRecords.get(i);
+				Element actionElement = doc.createElement(ACTION);
+				actionElement.setAttribute(ID, record.id);
+				if (record.actionCommand!=null &&
+						record.actionCommand.length()>0) {
+					// Remove illegal characters.  I'm no XML expert, but
+					// I'm not sure what I'm doing wrong.  If we don't
+					// strip out chars with Unicode value < 32, our
+					// generator will insert '&#<value>', which will cause
+					// our parser to barf when reading the macro back in
+					// (it says "Invalid XML character").  But why doesn't
+					// our generator tell us the character is invalid too?
+					String command = record.actionCommand;
+					for (int j=0; j<command.length(); j++) {
+						if (command.charAt(j)<32) {
+							command = command.substring(0,j);
+							if (j<command.length()-1)
+								command += command.substring(j+1);
+						}
+					}
+					Node n = doc.createCDATASection(command);
+					actionElement.appendChild(n);
+				}
+				rootElement.appendChild(actionElement);
+			}
+
+			// Dump the XML out to the file.
+			StreamResult result = new StreamResult(new File(fileName));
+			DOMSource source = new DOMSource(doc);
+			TransformerFactory transFac = TransformerFactory.newInstance();
+			Transformer transformer = transFac.newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+			transformer.setOutputProperty(OutputKeys.ENCODING, FILE_ENCODING);
+			transformer.transform(source, result);
+
+		} catch (RuntimeException re) {
+			throw re; // Keep FindBugs happy.
+		} catch (Exception e) {
+			throw new IOException("Error generating XML!");
+		}
+
+	}
+
+
+	/**
+	 * Sets the name of this macro.
+	 *
+	 * @param name The new name for the macro.
+	 * @see #getName
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+	/**
+	 * A "record" of a macro is a single action in the macro (corresponding to
+	 * a key type and some action in the editor, such as a letter inserted into
+	 * the document, scrolling one page down, selecting the current line,
+	 * etc.).
+	 */
+	static class MacroRecord {
+
+		public String id;
+		public String actionCommand;
+
+		public MacroRecord() {
+			this(null, null);
+		}
+
+		public MacroRecord(String id, String actionCommand) {
+			this.id = id;
+			this.actionCommand = actionCommand;
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTADefaultInputMap.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTADefaultInputMap.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTADefaultInputMap.java	(revision 25584)
@@ -0,0 +1,151 @@
+/*
+ * 08/19/2004
+ *
+ * RTADefaultInputMap.java - The default input map for RTextAreas.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Toolkit;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.InputMap;
+import javax.swing.KeyStroke;
+import javax.swing.text.DefaultEditorKit;
+
+
+/**
+ * The default input map for an <code>RTextArea</code>.  For the most part it is
+ * exactly that the one for a <code>JTextArea</code>, but it adds a few things.
+ * Currently, the new key bindings include:
+ * <ul>
+ *   <li>HOME key toggles between first character on line and first non-
+ *       whitespace character on line.
+ *   <li>INSERT key toggles between insert and overwrite modes.
+ *   <li>Ctrl+DELETE key deletes all text between the caret and the end of the
+ *       current line.
+ *   <li>Ctrl+Shift+Up and Ctrl+Shift+Down move the current line up and
+ *       down, respectively.
+ *   <li>Ctrl+J joins lines.
+ *   <li>Ctrl+Z is undo and Ctrl+Y is redo.
+ *   <li>Ctrl+Up and Ctrl+Down shift the visible area of the text area up and
+ *       down one line, respectively.
+ *   <li>F2 and Shift+F2 moves to the next and previous bookmarks,
+ *       respectively.
+ *   <li>Ctrl+F2 toggles whether a bookmark is on the current line.
+ *   <li>etc.
+ * </ul>
+ */
+public class RTADefaultInputMap extends InputMap {
+
+
+	/**
+	 * Constructs the default input map for an <code>RTextArea</code>.
+	 */
+	public RTADefaultInputMap() {
+
+		super();
+
+		int defaultModifier = getDefaultModifier();
+		//int ctrl = InputEvent.CTRL_MASK;
+		int alt = InputEvent.ALT_MASK;
+		int shift = InputEvent.SHIFT_MASK;
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   0),					DefaultEditorKit.beginLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   shift),					DefaultEditorKit.selectionBeginLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   defaultModifier),			DefaultEditorKit.beginAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,   defaultModifier|shift),	DefaultEditorKit.selectionBeginAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    0),					DefaultEditorKit.endLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    shift),					DefaultEditorKit.selectionEndLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    defaultModifier),			DefaultEditorKit.endAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_END,    defaultModifier|shift),	DefaultEditorKit.selectionEndAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   0),					DefaultEditorKit.backwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   shift),					DefaultEditorKit.selectionBackwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   defaultModifier),			DefaultEditorKit.previousWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,   defaultModifier|shift),	DefaultEditorKit.selectionPreviousWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   0),					DefaultEditorKit.downAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   shift),					DefaultEditorKit.selectionDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   defaultModifier),			RTextAreaEditorKit.rtaScrollDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,   alt),	RTextAreaEditorKit.rtaLineDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  0),					DefaultEditorKit.forwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  shift),					DefaultEditorKit.selectionForwardAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  defaultModifier),			DefaultEditorKit.nextWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,  defaultModifier|shift),	DefaultEditorKit.selectionNextWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     0),					DefaultEditorKit.upAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     shift),					DefaultEditorKit.selectionUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     defaultModifier),			RTextAreaEditorKit.rtaScrollUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,     alt),	RTextAreaEditorKit.rtaLineUpAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0),					DefaultEditorKit.pageUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,shift),					RTextAreaEditorKit.rtaSelectionPageUpAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,defaultModifier|shift), 	RTextAreaEditorKit.rtaSelectionPageLeftAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,0),					DefaultEditorKit.pageDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,shift),				RTextAreaEditorKit.rtaSelectionPageDownAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,defaultModifier|shift),	RTextAreaEditorKit.rtaSelectionPageRightAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_CUT,    0),					DefaultEditorKit.cutAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_COPY,   0),					DefaultEditorKit.copyAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_PASTE,  0),					DefaultEditorKit.pasteAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_X,      defaultModifier),			DefaultEditorKit.cutAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_C,      defaultModifier),			DefaultEditorKit.copyAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_V,      defaultModifier),			DefaultEditorKit.pasteAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0),					DefaultEditorKit.deleteNextCharAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, shift),					DefaultEditorKit.cutAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, defaultModifier),			RTextAreaEditorKit.rtaDeleteRestOfLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0),					RTextAreaEditorKit.rtaToggleTextModeAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, shift),					DefaultEditorKit.pasteAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, defaultModifier),			DefaultEditorKit.copyAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_A,      defaultModifier),			DefaultEditorKit.selectAllAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_D,      defaultModifier),			RTextAreaEditorKit.rtaDeleteLineAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_J,      defaultModifier),			RTextAreaEditorKit.rtaJoinLinesAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, shift),				DefaultEditorKit.deletePrevCharAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, defaultModifier),		RTextAreaEditorKit.rtaDeletePrevWordAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,    0),					DefaultEditorKit.insertTabAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,  0),					DefaultEditorKit.insertBreakAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,  shift),					DefaultEditorKit.insertBreakAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, defaultModifier),		RTextAreaEditorKit.rtaDumbCompleteWordAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_Z,      defaultModifier),			RTextAreaEditorKit.rtaUndoAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_Y,      defaultModifier),			RTextAreaEditorKit.rtaRedoAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,		0),							RTextAreaEditorKit.rtaNextBookmarkAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,		shift),						RTextAreaEditorKit.rtaPrevBookmarkAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,		defaultModifier),			RTextAreaEditorKit.rtaToggleBookmarkAction);
+
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_K,		defaultModifier|shift),		RTextAreaEditorKit.rtaPrevOccurrenceAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_K,		defaultModifier),			RTextAreaEditorKit.rtaNextOccurrenceAction);
+
+		/* NOTE:  Currently, macros aren't part of the default input map for */
+		/* RTextArea, as they display their own popup windows, etc. which    */
+		/* may or may not clash with the application in which the RTextArea  */
+		/* resides.  You can add the macro actions yourself into an          */
+		/* application if you want.  They may become standard in the future  */
+		/* if I can find a way to implement them that I like.                */
+		/*
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_R,      defaultModifier|shift),	RTextAreaEditorKit.rtaBeginRecordingMacroAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_S,      defaultModifier|shift),	RTextAreaEditorKit.rtaEndRecordingMacroAction);
+		put(KeyStroke.getKeyStroke(KeyEvent.VK_M,      defaultModifier|shift),	RTextAreaEditorKit.rtaPlaybackLastMacroAction);
+		*/
+
+	}
+
+
+	/**
+	 * Returns the default modifier key for a system.  For example, on Windows
+	 * this would be the CTRL key (<code>InputEvent.CTRL_MASK</code>).
+	 *
+	 * @return The default modifier key.
+	 */
+	protected static final int getDefaultModifier() {
+		return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+	}
+
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTATextTransferHandler.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTATextTransferHandler.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTATextTransferHandler.java	(revision 25584)
@@ -0,0 +1,480 @@
+/*
+ * 07/29/2004
+ *
+ * RTATextTransferHandler.java - Handles the transfer of data to/from an
+ * RTextArea via drag-and-drop.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.datatransfer.*;
+import java.awt.im.InputContext;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringBufferInputStream;
+import java.io.StringReader;
+import javax.swing.*;
+import javax.swing.text.*;
+
+
+/**
+ * Handles the transfer of data to/from an <code>RTextArea</code> via
+ * drag-and-drop.  This class is pretty much ripped off from a subclass of
+ * <code>BasicTextUI</code>.  In the future, it will include the ability to
+ * drag-and-drop files into <code>RTextArea</code>s (i.e., the text will be
+ * inserted into the text area).<p>
+ * 
+ * The main reason this class is kept around is so we can subclass it.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RTATextTransferHandler extends TransferHandler {
+
+	private JTextComponent exportComp;
+	private boolean shouldRemove;
+	private int p0;
+	private int p1;
+	private boolean withinSameComponent;
+
+
+	/**
+	 * Try to find a flavor that can be used to import a Transferable to a
+	 * specified text component.  
+	 * The set of usable flavors are tried in the following order:
+	 * <ol>
+	 *     <li>First, an attempt is made to find a flavor matching the content
+	 *         tyep of the EditorKit for the component.
+	 *     <li>Second, an attempt to find a text/plain flavor is made.
+	 *     <li>Third, an attempt to find a flavor representing a String
+	 *         reference in the same VM is made.
+	 *     <li>Lastly, DataFlavor.stringFlavor is searched for.
+	 * </ol>
+	 *
+	 * @param flavors The flavors to check if c will accept them.
+	 * @param c The text component to see whether it will accept any of the
+	 *        specified data flavors as input.
+	 */
+	 protected DataFlavor getImportFlavor(DataFlavor[] flavors,
+	 								JTextComponent c) {
+
+		DataFlavor refFlavor = null;
+		DataFlavor stringFlavor = null;
+            
+		for (int i = 0; i < flavors.length; i++) {
+
+			String mime = flavors[i].getMimeType();
+			if (mime.startsWith("text/plain")) {
+				return flavors[i];
+			}
+			else if (refFlavor == null
+				&& mime.startsWith("application/x-java-jvm-local-objectref")
+				&& flavors[i].getRepresentationClass() == String.class)
+			{
+				refFlavor = flavors[i];
+			}
+			else if (stringFlavor==null &&
+				flavors[i].equals(DataFlavor.stringFlavor))
+			{
+				stringFlavor = flavors[i];
+			}
+
+		}
+
+		if (refFlavor != null)
+			return refFlavor;
+		else if (stringFlavor != null)
+			return stringFlavor;
+
+		return null;
+
+	}
+
+
+	/**
+	 * Import the given stream data into the text component.
+	 */
+	protected void handleReaderImport(Reader in, JTextComponent c)
+							throws BadLocationException, IOException {
+
+		char[] buff = new char[1024];
+		int nch;
+		boolean lastWasCR = false;
+		int last;
+		StringBuffer sbuff = null;
+                
+		// Read in a block at a time, mapping \r\n to \n, as well as single
+		// \r to \n.
+		while ((nch = in.read(buff, 0, buff.length)) != -1) {
+
+			if (sbuff == null) {
+				sbuff = new StringBuffer(nch);
+                   }
+			last = 0;
+
+			for (int counter = 0; counter < nch; counter++) {
+
+				switch (buff[counter]) {
+					case '\r':
+						if (lastWasCR) {
+							if (counter == 0)
+								sbuff.append('\n');
+							else
+								buff[counter - 1] = '\n';
+						}
+						else
+							lastWasCR = true;
+						break;
+					case '\n':
+						if (lastWasCR) {
+							if (counter > (last + 1))
+								sbuff.append(buff, last, counter - last - 1);
+							// else nothing to do, can skip \r, next write will
+							// write \n
+							lastWasCR = false;
+							last = counter;
+						}
+						break;
+					default:
+						if (lastWasCR) {
+							if (counter == 0)
+								sbuff.append('\n');
+							else
+								buff[counter - 1] = '\n';
+							lastWasCR = false;
+						}
+						break;
+
+				} // End fo switch (buff[counter]).
+
+			} // End of for (int counter = 0; counter < nch; counter++).
+
+			if (last < nch) {
+				if (lastWasCR) {
+					if (last < (nch - 1))
+						sbuff.append(buff, last, nch - last - 1);
+				}
+					else
+					sbuff.append(buff, last, nch - last);
+			}
+
+		} // End of while ((nch = in.read(buff, 0, buff.length)) != -1).
+
+		if (withinSameComponent) {
+			((RTextArea)c).beginAtomicEdit();
+		}
+
+		if (lastWasCR)
+			sbuff.append('\n');
+		c.replaceSelection(sbuff != null ? sbuff.toString() : "");
+
+	}
+
+
+	/**
+	 * This is the type of transfer actions supported by the source.  Some
+	 * models are not mutable, so a transfer operation of COPY only should
+	 * be advertised in that case.
+	 * 
+	 * @param c  The component holding the data to be transfered.  This
+	 *  argument is provided to enable sharing of TransferHandlers by
+	 *  multiple components.
+	 * @return If the text component is editable, COPY_OR_MOVE is returned,
+	 *         otherwise just COPY is allowed.
+	 */
+	public int getSourceActions(JComponent c) {
+		if (((JTextComponent)c).isEditable())
+			return COPY_OR_MOVE;
+		else
+			return COPY;
+	}
+
+
+	/**
+	 * Create a Transferable to use as the source for a data transfer.
+	 *
+	 * @param comp  The component holding the data to be transfered.  This
+	 *  argument is provided to enable sharing of TransferHandlers by
+	 *  multiple components.
+	 * @return  The representation of the data to be transfered. 
+	 *  
+	 */
+	protected Transferable createTransferable(JComponent comp) {
+		exportComp = (JTextComponent)comp;
+		shouldRemove = true;
+		p0 = exportComp.getSelectionStart();
+		p1 = exportComp.getSelectionEnd();
+		return (p0 != p1) ? (new TextTransferable(exportComp, p0, p1)) : null;
+	}
+
+
+	/**
+	 * This method is called after data has been exported.  This method should
+	 * remove the data that was transfered if the action was MOVE.
+	 *
+	 * @param source The component that was the source of the data.
+	 * @param data   The data that was transferred or possibly null
+     *               if the action is <code>NONE</code>.
+	 * @param action The actual action that was performed.  
+	 */
+	protected void exportDone(JComponent source, Transferable data, int action) {
+		// only remove the text if shouldRemove has not been set to
+		// false by importData and only if the action is a move
+		if (shouldRemove && action == MOVE) {
+			TextTransferable t = (TextTransferable)data;
+			t.removeText();
+			if (withinSameComponent) {
+				((RTextArea)source).endAtomicEdit();
+				withinSameComponent = false;
+			}
+		}
+		exportComp = null;
+	}
+
+
+	/**
+	 * This method causes a transfer to a component from a clipboard or a 
+	 * DND drop operation.  The Transferable represents the data to be
+	 * imported into the component.  
+	 *
+	 * @param comp  The component to receive the transfer.  This
+	 *  argument is provided to enable sharing of TransferHandlers by
+	 *  multiple components.
+	 * @param t The data to import
+	 * @return <code>true</code> iff the data was inserted into the component.
+	 */
+	public boolean importData(JComponent comp, Transferable t) {
+
+		JTextComponent c = (JTextComponent)comp;
+		withinSameComponent = c==exportComp;
+
+		// if we are importing to the same component that we exported from
+		// then don't actually do anything if the drop location is inside
+		// the drag location and set shouldRemove to false so that exportDone
+		// knows not to remove any data
+		if (withinSameComponent && c.getCaretPosition()>=p0 && c.getCaretPosition()<=p1) {
+			shouldRemove = false;
+			return true;
+		}
+
+		boolean imported = false;
+		DataFlavor importFlavor = getImportFlavor(t.getTransferDataFlavors(), c);
+		if (importFlavor != null) {
+			try {
+				InputContext ic = c.getInputContext();
+				if (ic != null)
+					ic.endComposition();
+				Reader r = importFlavor.getReaderForText(t);
+				handleReaderImport(r, c);
+				imported = true;
+			} catch (UnsupportedFlavorException ufe) {
+				ufe.printStackTrace();
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			} catch (IOException ioe) {
+				ioe.printStackTrace();
+			}
+		}
+
+		return imported;
+
+	}
+
+	/**
+	 * This method indicates if a component would accept an import of the
+	 * given set of data flavors prior to actually attempting to import it. 
+	 *
+	 * @param comp The component to receive the transfer.  This argument is
+	 *        provided to enable sharing of TransferHandlers by multiple
+	 *        components.
+	 * @param flavors The data formats available.
+	 * @return <code>true</code> iff the data can be inserted.
+	 */
+	public boolean canImport(JComponent comp, DataFlavor[] flavors) {
+		JTextComponent c = (JTextComponent)comp;
+		if (!(c.isEditable() && c.isEnabled()))
+			return false;
+		return (getImportFlavor(flavors, c) != null);
+	}
+
+
+	/**
+	 * A possible implementation of the Transferable interface for RTextAreas.
+	 */
+	static class TextTransferable implements Transferable {
+
+		Position p0;
+		Position p1;
+		JTextComponent c;
+
+		protected String plainData;
+
+		private static DataFlavor[] stringFlavors;
+		private static DataFlavor[] plainFlavors;
+
+		TextTransferable(JTextComponent c, int start, int end) {
+			this.c = c;
+			Document doc = c.getDocument();
+			try {
+				p0 = doc.createPosition(start);
+				p1 = doc.createPosition(end);
+				plainData = c.getSelectedText();
+			} catch (BadLocationException ble) {
+			}
+		}
+
+		/**
+		 * Fetch the data in a text/plain format.
+		 */
+		protected String getPlainData() {
+			return plainData;
+		}
+
+		/**
+		 * Returns an object which represents the data to be transferred.  The class 
+		 * of the object returned is defined by the representation class of the flavor.
+		 *
+		 * @param flavor the requested flavor for the data
+		 * @see DataFlavor#getRepresentationClass
+		 * @exception IOException                if the data is no longer available
+		 *              in the requested flavor.
+		 * @exception UnsupportedFlavorException if the requested data flavor is
+		 *              not supported.
+		 */
+		public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+			if (isPlainFlavor(flavor)) {
+				String data = getPlainData();
+				data = (data == null) ? "" : data;
+				if (String.class.equals(flavor.getRepresentationClass())) {
+					return data;
+				} else if (Reader.class.equals(flavor.getRepresentationClass())) {
+					return new StringReader(data);
+				} else if (InputStream.class.equals(flavor.getRepresentationClass())) {
+					return new StringBufferInputStream(data);
+				}
+				// fall through to unsupported
+			} else if (isStringFlavor(flavor)) {
+				String data = getPlainData();
+				data = (data == null) ? "" : data;
+				return data;
+			}
+			throw new UnsupportedFlavorException(flavor);
+		}
+
+		/**
+		 * Returns an array of DataFlavor objects indicating the flavors the data 
+		 * can be provided in.  The array should be ordered according to preference
+		 * for providing the data (from most richly descriptive to least descriptive).
+		 *
+		 * @return an array of data flavors in which this data can be transferred
+		 */
+		public DataFlavor[] getTransferDataFlavors() {
+
+			int plainCount = (isPlainSupported()) ? plainFlavors.length: 0;
+			int stringCount = (isPlainSupported()) ? stringFlavors.length : 0;
+			int totalCount = plainCount + stringCount;
+			DataFlavor[] flavors = new DataFlavor[totalCount];
+	
+			// fill in the array
+			int pos = 0;
+			if (plainCount > 0) {
+				System.arraycopy(plainFlavors, 0, flavors, pos, plainCount);
+				pos += plainCount;
+			}
+			if (stringCount > 0) {
+				System.arraycopy(stringFlavors, 0, flavors, pos, stringCount);
+				//pos += stringCount;
+			}
+
+			return flavors;
+
+		}
+
+		/**
+		 * Returns whether or not the specified data flavor is supported for
+		 * this object.
+		 * @param flavor the requested flavor for the data
+		 * @return boolean indicating whether or not the data flavor is supported
+		 */
+		public boolean isDataFlavorSupported(DataFlavor flavor) {
+			DataFlavor[] flavors = getTransferDataFlavors();
+			for (int i = 0; i < flavors.length; i++) {
+				if (flavors[i].equals(flavor))
+					return true;
+			}
+			return false;
+		}
+
+		/**
+		 * Returns whether or not the specified data flavor is an plain flavor that
+		 * is supported.
+		 * @param flavor the requested flavor for the data
+		 * @return boolean indicating whether or not the data flavor is supported
+		 */
+		protected boolean isPlainFlavor(DataFlavor flavor) {
+			DataFlavor[] flavors = plainFlavors;
+			for (int i = 0; i < flavors.length; i++) {
+				if (flavors[i].equals(flavor))
+					return true;
+			}
+			return false;
+		}
+
+		/**
+		 * Should the plain text flavors be offered?  If so, the method
+		 * getPlainData should be implemented to provide something reasonable.
+		 */
+		protected boolean isPlainSupported() {
+			return plainData != null;
+		}
+
+		/**
+		 * Returns whether or not the specified data flavor is a String flavor that
+		 * is supported.
+		 * @param flavor the requested flavor for the data
+		 * @return boolean indicating whether or not the data flavor is supported
+		 */
+		protected boolean isStringFlavor(DataFlavor flavor) {
+			DataFlavor[] flavors = stringFlavors;
+			for (int i = 0; i < flavors.length; i++) {
+				if (flavors[i].equals(flavor))
+					return true;
+			}
+			return false;
+		}
+
+		void removeText() {
+			if ((p0 != null) && (p1 != null) && (p0.getOffset() != p1.getOffset())) {
+				try {
+					Document doc = c.getDocument();
+					doc.remove(p0.getOffset(), p1.getOffset() - p0.getOffset());
+				} catch (BadLocationException e) {
+				}
+			}
+		}
+
+		// Initialization of supported flavors.
+		static {
+			try {
+
+				plainFlavors = new DataFlavor[3];
+				plainFlavors[0] = new DataFlavor("text/plain;class=java.lang.String");
+				plainFlavors[1] = new DataFlavor("text/plain;class=java.io.Reader");
+				plainFlavors[2] = new DataFlavor("text/plain;charset=unicode;class=java.io.InputStream");
+
+				stringFlavors = new DataFlavor[2];
+				stringFlavors[0] = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType+";class=java.lang.String");
+				stringFlavors[1] = DataFlavor.stringFlavor;
+ 
+			} catch (ClassNotFoundException cle) {
+				System.err.println("Error initializing org.fife.ui.RTATextTransferHandler");
+			}
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextArea.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextArea.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextArea.java	(revision 25584)
@@ -0,0 +1,1617 @@
+/*
+ * 11/14/2003
+ *
+ * RTextArea.java - An extension of JTextArea that adds many features.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Graphics;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.InputMap;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.fife.print.RPrintUtilities;
+import org.fife.ui.rtextarea.Macro.MacroRecord;
+
+
+/**
+ * An extension of <code>JTextArea</code> that adds the following features:
+ * <ul>
+ *    <li>Insert/Overwrite modes (can be toggled via the Insert key)
+ *    <li>A right-click popup menu with standard editing options
+ *    <li>Macro support
+ *    <li>"Mark all" functionality.
+ *    <li>A way to change the background to an image (gif/png/jpg)
+ *    <li>Highlight the current line (can be toggled)
+ *    <li>An easy way to print its text (implements Printable)
+ *    <li>Hard/soft (emulated with spaces) tabs
+ *    <li>Fixes a bug with setTabSize
+ *    <li>Other handy new methods
+ * </ul>
+ * NOTE:  If the background for an <code>RTextArea</code> is set to a color,
+ * its opaque property is set to <code>true</code> for performance reasons.  If
+ * the background is set to an image, then the opaque property is set to
+ * <code>false</code>.  This slows things down a little, but if it didn't happen
+ * then we would see garbage on-screen when the user scrolled through a document
+ * using the arrow keys (not the page-up/down keys though).  You should never
+ * have to set the opaque property yourself; it is always done for you.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RTextArea extends RTextAreaBase
+								implements Printable, Serializable {
+
+	/**
+	 * Constant representing insert mode.
+	 *
+	 * @see #setCaretStyle(int, int)
+	 */
+	public static final int INSERT_MODE				= 0;
+
+	/**
+	 * Constant representing overwrite mode.
+	 *
+	 * @see #setCaretStyle(int, int)
+	 */
+	public static final int OVERWRITE_MODE				= 1;
+
+	/**
+	 * The property fired when the "mark all" color changes.
+	 */
+	public static final String MARK_ALL_COLOR_PROPERTY	= "RTA.markAllColor";
+
+	/*
+	 * Constants for all actions.
+	 */
+	private static final int MIN_ACTION_CONSTANT	= 0;
+	public static final int COPY_ACTION				= 0;
+	public static final int CUT_ACTION				= 1;
+	public static final int DELETE_ACTION			= 2;
+	public static final int PASTE_ACTION			= 3;
+	public static final int REDO_ACTION				= 4;
+	public static final int SELECT_ALL_ACTION		= 5;
+	public static final int UNDO_ACTION				= 6;
+	private static final int MAX_ACTION_CONSTANT	= 6;
+
+	private static final Color DEFAULT_MARK_ALL_COLOR		= Color.ORANGE;
+
+	/**
+	 * The current text mode ({@link #INSERT_MODE} or {@link #OVERWRITE_MODE}).
+	 */
+	private int textMode;
+
+	// All macros are shared across all RTextAreas.
+	private static boolean recordingMacro;		// Whether we're recording a macro.
+	private static Macro currentMacro;
+
+	/**
+	 * This text area's popup menu.
+	 */
+	private JPopupMenu popupMenu;
+
+	/**
+	 * Whether the popup menu has been created.
+	 */
+	private boolean popupMenuCreated;
+
+	/**
+	 * The text last searched for via Ctrl+K or Ctrl+Shift+K.
+	 */
+	private static String selectedOccurrenceText;
+
+	/**
+	 * Can return tool tips for this text area.  Subclasses can install a
+	 * supplier as a means of adding custom tool tips without subclassing
+	 * <tt>RTextArea</tt>.  {@link #getToolTipText()} checks this supplier
+	 * before calling the super class's version.
+	 */
+	private ToolTipSupplier toolTipSupplier;
+
+	private static RecordableTextAction cutAction;
+	private static RecordableTextAction copyAction;
+	private static RecordableTextAction pasteAction;
+	private static RecordableTextAction deleteAction;
+	private static RecordableTextAction undoAction;
+	private static RecordableTextAction redoAction;
+	private static RecordableTextAction selectAllAction;
+
+	private static IconGroup iconGroup;		// Info on icons for actions.
+
+	private transient RUndoManager undoManager;
+
+	private transient LineHighlightManager lineHighlightManager;
+
+	private ArrayList markAllHighlights;		// Highlights from "mark all".
+	private String markedWord;				// Expression marked in "mark all."
+	private ChangeableHighlightPainter markAllHighlightPainter;
+
+	private int[] carets;		// Index 0=>insert caret, 1=>overwrite.
+
+	private static final String MSG	= "org.fife.ui.rtextarea.RTextArea";
+
+
+	/**
+	 * Constructor.
+	 */
+	public RTextArea() {
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 */
+	public RTextArea(AbstractDocument doc) {
+		super(doc);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 */
+	public RTextArea(String text) {
+		super(text);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextArea(int rows, int cols) {
+		super(rows, cols);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextArea(String text, int rows, int cols) {
+		super(text, rows, cols);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextArea(AbstractDocument doc, String text, int rows, int cols) {
+		super(doc, text, rows, cols);
+		init(INSERT_MODE);
+	}
+
+
+	/**
+	 * Creates a new <code>RTextArea</code>.
+	 *
+	 * @param textMode Either <code>INSERT_MODE</code> or
+	 *        <code>OVERWRITE_MODE</code>.
+	 */
+	public RTextArea(int textMode) {
+		init(textMode);
+	}
+
+
+	/**
+	 * Adds an action event to the current macro.  This shouldn't be called
+	 * directly, as it is called by the actions themselves.
+	 *
+	 * @param id The ID of the recordable text action.
+	 * @param actionCommand The "command" of the action event passed to it.
+	 */
+	static synchronized void addToCurrentMacro(String id,
+											String actionCommand) {
+		currentMacro.addMacroRecord(new Macro.MacroRecord(id, actionCommand));
+	}
+
+
+	/**
+	 * Adds a line highlight.
+	 *
+	 * @param line The line to highlight.  This is zero-based.
+	 * @param color The color to highlight the line with.
+	 * @throws BadLocationException If <code>line</code> is an invalid line
+	 *         number.
+	 * @see #removeLineHighlight(Object)
+	 * @see #removeAllLineHighlights()
+	 */
+	public Object addLineHighlight(int line, Color color)
+										throws BadLocationException {
+		if (lineHighlightManager==null) {
+			lineHighlightManager = new LineHighlightManager(this);
+		}
+		return lineHighlightManager.addLineHighlight(line, color);
+	}
+
+
+	/**
+	 * Begins an "atomic edit."  All text editing operations between this call
+	 * and the next call to <tt>endAtomicEdit()</tt> will be treated as a
+	 * single operation by the undo manager.<p>
+	 *
+	 * Using this method should be done with great care.  You should probably
+	 * wrap the call to <tt>endAtomicEdit()</tt> in a <tt>finally</tt> block:
+	 *
+	 * <pre>
+	 * textArea.beginAtomicEdit();
+	 * try {
+	 *    // Do editing
+	 * } finally {
+	 *    textArea.endAtomicEdit();
+	 * }
+	 * </pre>
+	 *
+	 * @see #endAtomicEdit()
+	 */
+	public void beginAtomicEdit() {
+		undoManager.beginInternalAtomicEdit();
+	}
+
+
+	/**
+	 * Begins recording a macro.  After this method is called, all input/caret
+	 * events, etc. are recorded until <code>endMacroRecording</code> is
+	 * called.  If this method is called but the text component is already
+	 * recording a macro, nothing happens (but the macro keeps recording).
+	 *
+	 * @see #isRecordingMacro()
+	 * @see #endRecordingMacro()
+	 */
+	public static synchronized void beginRecordingMacro() {
+		if (isRecordingMacro()) {
+			//System.err.println("Macro already being recorded!");
+			return;
+		}
+		//JOptionPane.showMessageDialog(this, "Now recording a macro");
+		if (currentMacro!=null)
+			currentMacro = null; // May help gc?
+		currentMacro = new Macro();
+		recordingMacro = true;
+	}
+
+
+	/**
+	 * Tells whether an undo is possible
+	 * 
+	 * @see #canRedo()
+	 * @see #undoLastAction()
+	 */
+	public boolean canUndo() {
+		return undoManager.canUndo();
+	}
+
+
+	/**
+	 * Tells whether a redo is possible
+	 * 
+	 * @see #canUndo()
+	 * @see #redoLastAction()
+	 */
+	public boolean canRedo() {
+		return undoManager.canRedo();
+	}
+
+
+	/**
+	 * Clears any "mark all" highlights, if any.
+	 *
+	 * @see #markAll
+	 * @see #getMarkAllHighlightColor
+	 * @see #setMarkAllHighlightColor
+	 */
+	public void clearMarkAllHighlights() {
+		Highlighter h = getHighlighter();
+		if (h!=null && markAllHighlights!=null) {
+			int count = markAllHighlights.size();
+			for (int i=0; i<count; i++)
+				h.removeHighlight(markAllHighlights.get(i));
+			markAllHighlights.clear();
+		}
+		markedWord = null;
+		repaint();
+	}
+
+
+	/**
+	 * Configures the popup menu for this text area.  This method is called
+	 * right before it is displayed, so a hosting application can do any
+	 * custom configuration (configuring actions, adding/removing items, etc.).
+	 * <p>
+	 *
+	 * The default implementation does nothing.<p>
+	 * 
+	 * If you set the popup menu via {@link #setPopupMenu(JPopupMenu)}, you
+	 * will want to override this method, especially if you removed any of the
+	 * menu items in the default popup menu.
+	 *
+	 * @param popupMenu The popup menu.  This will never be <code>null</code>.
+	 * @see #createPopupMenu()
+	 * @see #setPopupMenu(JPopupMenu)
+	 */
+	protected void configurePopupMenu(JPopupMenu popupMenu) {
+	}
+
+
+	/**
+	 * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+	 *
+	 * @return The caret event/mouse listener.
+	 */
+	protected RTAMouseListener createMouseListener() {
+		return new RTextAreaMutableCaretEvent(this);
+	}
+
+
+	/**
+	 * Creates the right-click popup menu. Subclasses can override this method
+	 * to replace or augment the popup menu returned.
+	 *
+	 * @return The popup menu.
+	 * @see #setPopupMenu(JPopupMenu)
+	 * @see #configurePopupMenu(JPopupMenu)
+	 * @see #createPopupMenuItem(Action)
+	 */
+	protected JPopupMenu createPopupMenu() {
+		JPopupMenu menu = new JPopupMenu();
+		menu.add(createPopupMenuItem(undoAction));
+		menu.add(createPopupMenuItem(redoAction));
+		menu.addSeparator();
+		menu.add(createPopupMenuItem(cutAction));
+		menu.add(createPopupMenuItem(copyAction));
+		menu.add(createPopupMenuItem(pasteAction));
+		menu.add(createPopupMenuItem(deleteAction));
+		menu.addSeparator();
+		menu.add(createPopupMenuItem(selectAllAction));
+		return menu;
+	}
+
+
+	/**
+	 * Creates the actions used in the popup menu and retrievable by
+	 * {@link #getAction(int)}.
+	 * TODO: Remove these horrible hacks and move localizing of actions into
+	 * the editor kits, where it should be!  The context menu should contain
+	 * actions from the editor kits.
+	 */
+	private static void createPopupMenuActions() {
+
+		// Create actions for right-click popup menu.
+		// 1.5.2004/pwy: Replaced the CTRL_MASK with the cross-platform version...
+		int mod = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+		ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+		cutAction = new RTextAreaEditorKit.CutAction();
+		cutAction.setProperties(msg, "Action.Cut");
+		cutAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, mod));
+		copyAction = new RTextAreaEditorKit.CopyAction();
+		copyAction.setProperties(msg, "Action.Copy");
+		copyAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, mod));
+		pasteAction = new RTextAreaEditorKit.PasteAction();
+		pasteAction.setProperties(msg, "Action.Paste");
+		pasteAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, mod));
+		deleteAction = new RTextAreaEditorKit.DeleteNextCharAction();
+		deleteAction.setProperties(msg, "Action.Delete");
+		deleteAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
+		undoAction = new RTextAreaEditorKit.UndoAction();
+		undoAction.setProperties(msg, "Action.Undo");
+		undoAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, mod));
+		redoAction = new RTextAreaEditorKit.RedoAction();
+		redoAction.setProperties(msg, "Action.Redo");
+		redoAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, mod));
+		selectAllAction = new RTextAreaEditorKit.SelectAllAction();
+		selectAllAction.setProperties(msg, "Action.SelectAll");
+		selectAllAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, mod));
+
+	}
+
+
+	/**
+	 * Creates and configures a menu item for used in the popup menu.
+	 *
+	 * @param a The action for the menu item.
+	 * @return The menu item.
+	 * @see #createPopupMenu()
+	 */
+	protected JMenuItem createPopupMenuItem(Action a) {
+		JMenuItem item = new JMenuItem(a) {
+			public void setToolTipText(String text) {
+				// Ignore!  Actions (e.g. undo/redo) set this when changing
+				// their text due to changing enabled state.
+			}
+		};
+		item.setAccelerator(null);
+		return item;
+	}
+
+
+	/**
+	 * Returns the a real UI to install on this text area.
+	 *
+	 * @return The UI.
+	 */
+	protected RTextAreaUI createRTextAreaUI() {
+		return new RTextAreaUI(this);
+	}
+
+
+	/**
+	 * Creates an undo manager for use in this text area.
+	 *
+	 * @return The undo manager.
+	 */
+	protected RUndoManager createUndoManager() {
+		return new RUndoManager(this);
+	}
+
+
+	/**
+	 * Removes all undoable edits from this document's undo manager.  This
+	 * method also makes the undo/redo actions disabled.
+	 */
+	/*
+	 * NOTE:  For some reason, it appears I have to create an entirely new
+	 *        <code>undoManager</code> for undo/redo to continue functioning
+	 *        properly; if I don't, it only ever lets you do one undo.  Not
+	 *        too sure why this is...
+	 */
+	public void discardAllEdits() {
+		undoManager.discardAllEdits();
+		getDocument().removeUndoableEditListener(undoManager);
+		undoManager = createUndoManager();
+		getDocument().addUndoableEditListener(undoManager);
+		undoManager.updateActions();
+	}
+
+
+	/**
+	 * Completes an "atomic" edit.
+	 *
+	 * @see #beginAtomicEdit()
+	 */
+	public void endAtomicEdit() {
+		undoManager.endInternalAtomicEdit();
+	}
+
+
+	/**
+	 * Ends recording a macro.  If this method is called but the text component
+	 * is not recording a macro, nothing happens.
+	 *
+	 * @see #isRecordingMacro()
+	 * @see #beginRecordingMacro()
+	 */
+	/*
+	 * FIXME:  This should throw an exception if we're not recording a macro.
+	 */
+	public static synchronized void endRecordingMacro() {
+		if (!isRecordingMacro()) {
+			//System.err.println("Not recording a macro!");
+			return;
+		}
+		recordingMacro = false;
+	}
+
+
+	/**
+	 * Notifies all listeners that a caret change has occurred.
+	 *
+	 * @param e The caret event.
+	 */
+	protected void fireCaretUpdate(CaretEvent e) {
+
+		// Decide whether we need to repaint the current line background.
+		possiblyUpdateCurrentLineHighlightLocation();
+
+		// Now, if there is a highlighted region of text, allow them to cut
+		// and copy.
+		if (e!=null && e.getDot()!=e.getMark()) {// && !cutAction.isEnabled()) {
+			cutAction.setEnabled(true);
+			copyAction.setEnabled(true);
+		}
+
+		// Otherwise, if there is no highlighted region, don't let them cut
+		// or copy.  The condition here should speed things up, because this
+		// way, we will only enable the actions the first time the selection
+		// becomes nothing.
+		else if (cutAction.isEnabled()) {
+			cutAction.setEnabled(false);
+			copyAction.setEnabled(false);
+		}
+
+		super.fireCaretUpdate(e);
+
+	}
+
+
+	/**
+	 * Removes the "Ctrl+H <=> Backspace" behavior that Java shows, for some
+	 * odd reason...
+	 */
+	private void fixCtrlH() {
+		InputMap inputMap = getInputMap();
+		KeyStroke char010 = KeyStroke.getKeyStroke("typed \010");
+		InputMap parent = inputMap;
+		while (parent != null) {
+			parent.remove(char010);
+			parent = parent.getParent();
+		}
+		KeyStroke backspace = KeyStroke.getKeyStroke("BACK_SPACE");
+		inputMap.put(backspace, DefaultEditorKit.deletePrevCharAction);
+	}
+
+
+	/**
+	 * Provides a way to gain access to the editor actions on the right-click
+	 * popup menu.  This way you can make toolbar/menu bar items use the actual
+	 * actions used by all <code>RTextArea</code>s, so that icons stay
+	 * synchronized and you don't have to worry about enabling/disabling them
+	 * yourself.<p>
+	 * Keep in mind that these actions are shared across all instances of
+	 * <code>RTextArea</code>, so a change to any action returned by this
+	 * method is global across all <code>RTextArea</code> editors in your
+	 * application.
+	 *
+	 * @param action The action to retrieve, such as {@link #CUT_ACTION}.
+	 *        If the action name is invalid, <code>null</code> is returned.
+	 * @return The action, or <code>null</code> if an invalid action is
+	 *         requested.
+	 */
+	public static RecordableTextAction getAction(int action) {
+		if (action<MIN_ACTION_CONSTANT || action>MAX_ACTION_CONSTANT)
+			return null;
+		switch (action) {
+			case COPY_ACTION:
+				return copyAction;
+			case CUT_ACTION:
+				return cutAction;
+			case DELETE_ACTION:
+				return deleteAction;
+			case PASTE_ACTION:
+				return pasteAction;
+			case REDO_ACTION:
+				return redoAction;
+			case SELECT_ALL_ACTION:
+				return selectAllAction;
+			case UNDO_ACTION:
+				return undoAction;
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the macro currently stored in this <code>RTextArea</code>.
+	 * Since macros are shared, all <code>RTextArea</code>s in the currently-
+	 * running application are using this macro.
+	 *
+	 * @return The current macro, or <code>null</code> if no macro has been
+	 *         recorded/loaded.
+	 * @see #loadMacro(Macro)
+	 */
+	public static synchronized Macro getCurrentMacro() {
+		return currentMacro;
+	}
+
+
+	/**
+	 * Returns the default color used for "mark all."
+	 *
+	 * @return The color.
+	 * @see #getMarkAllHighlightColor()
+	 * @see #setMarkAllHighlightColor(Color)
+	 */
+	public static final Color getDefaultMarkAllHighlightColor() {
+		return DEFAULT_MARK_ALL_COLOR;
+	}
+
+
+	/**
+	 * Returns the icon group being used for the actions of this text area.
+	 *
+	 * @return The icon group.
+	 * @see #setIconGroup(IconGroup)
+	 */
+	public static IconGroup getIconGroup() {
+		return iconGroup;
+	}
+
+
+	/**
+	 * Returns the line highlight manager.
+	 *
+	 * @return The line highlight manager.  This may be <code>null</code>.
+	 */
+	LineHighlightManager getLineHighlightManager() {
+		return lineHighlightManager;
+	}
+
+
+	/**
+	 * Returns the color used in "mark all."
+	 *
+	 * @return The color.
+	 * @see #setMarkAllHighlightColor(Color)
+	 */
+	public Color getMarkAllHighlightColor() {
+		return (Color)markAllHighlightPainter.getPaint();
+	}
+
+
+	/**
+	 * Returns the maximum ascent of all fonts used in this text area.  In
+	 * the case of a standard <code>RTextArea</code>, this is simply the
+	 * ascent of the current font.<p>
+	 *
+	 * This value could be useful, for example, to implement a line-numbering
+	 * scheme.
+	 *
+	 * @return The ascent of the current font.
+	 */
+	public int getMaxAscent() {
+		return getFontMetrics(getFont()).getAscent();
+	}
+
+
+	/**
+	 * Returns the popup menu for this component, lazily creating it if
+	 * necessary.
+	 *
+	 * @return The popup menu.
+	 * @see #createPopupMenu()
+	 * @see #setPopupMenu(JPopupMenu)
+	 */
+	public JPopupMenu getPopupMenu() {
+		if (!popupMenuCreated) {
+			popupMenu = createPopupMenu();
+			if (popupMenu!=null) {
+				ComponentOrientation orientation = ComponentOrientation.
+										getOrientation(Locale.getDefault());
+				popupMenu.applyComponentOrientation(orientation);
+			}
+			popupMenuCreated = true;
+		}
+		return popupMenu;
+	}
+
+
+	/**
+	 * Returns the text last selected and used in a Ctrl+K operation.
+	 *
+	 * @return The text, or <code>null</code> if none.
+	 * @see #setSelectedOccurrenceText(String)
+	 */
+	public static String getSelectedOccurrenceText() {
+		return selectedOccurrenceText;
+	}
+
+
+	/**
+	 * Returns the text mode this editor pane is currently in.
+	 *
+	 * @return Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+	 * @see #setTextMode(int)
+	 */
+	public final int getTextMode() {
+		return textMode;
+	}
+
+
+	/**
+	 * Returns the tool tip supplier.
+	 *
+	 * @return The tool tip supplier, or <code>null</code> if one isn't
+	 *         installed.
+	 * @see #setToolTipSupplier(ToolTipSupplier)
+	 */
+	public ToolTipSupplier getToolTipSupplier() {
+		return toolTipSupplier;
+	}
+
+
+	/**
+	 * Returns the tooltip to display for a mouse event at the given
+	 * location.  This method is overridden to check for a
+	 * {@link ToolTipSupplier}; if there is one installed, it is queried for
+	 * tool tip text before using the super class's implementation of this
+	 * method.
+	 *
+	 * @param e The mouse event.
+	 * @return The tool tip text, or <code>null</code> if none.
+	 * @see #getToolTipSupplier()
+	 * @see #setToolTipSupplier(ToolTipSupplier)
+	 */
+	public String getToolTipText(MouseEvent e) {
+		String tip = null;
+		if (getToolTipSupplier()!=null) {
+			tip = getToolTipSupplier().getToolTipText(this, e);
+		}
+		return tip!=null ? tip : super.getToolTipText();
+	}
+
+
+	/**
+	 * Does the actual dirty-work of replacing the selected text in this
+	 * text area (i.e., in its document).  This method provides a hook for
+	 * subclasses to handle this in a different way.
+	 *
+	 * @param content The content to add.
+	 */
+	protected void handleReplaceSelection(String content) {
+		// Call into super to handle composed text (1.5+ only though).
+		super.replaceSelection(content);
+	}
+
+
+	/**
+	 * Initializes this text area.
+	 *
+	 * @param textMode The text mode.
+	 */
+	private void init(int textMode) {
+
+		// NOTE: Our actions are created here instead of in a static block
+		// so they are only created when the first RTextArea is instantiated,
+		// not before.  There have been reports of users calling static getters
+		// (e.g. RSyntaxTextArea.getDefaultBracketMatchBGColor()) which would
+		// cause these actions to be created and (possibly) incorrectly
+		// localized, if they were in a static block.
+		if (cutAction==null) {
+			createPopupMenuActions();
+		}
+
+		// Install the undo manager.
+		undoManager = createUndoManager();
+		getDocument().addUndoableEditListener(undoManager);
+
+		// Set the defaults for various stuff.
+		Color markAllHighlightColor = getDefaultMarkAllHighlightColor();
+		markAllHighlightPainter = new ChangeableHighlightPainter(
+										markAllHighlightColor);
+		setMarkAllHighlightColor(markAllHighlightColor);
+		carets = new int[2];
+		setCaretStyle(INSERT_MODE, ConfigurableCaret.THICK_VERTICAL_LINE_STYLE);
+		setCaretStyle(OVERWRITE_MODE, ConfigurableCaret.BLOCK_STYLE);
+		setDragEnabled(true);			// Enable drag-and-drop.
+
+		// Set values for stuff the user passed in.
+		setTextMode(textMode); // carets array must be initialized first!
+
+		// Fix the odd "Ctrl+H <=> Backspace" Java behavior.
+		fixCtrlH();
+
+	}
+
+
+	/**
+	 * Returns whether or not a macro is being recorded.
+	 *
+	 * @return Whether or not a macro is being recorded.
+	 * @see #beginRecordingMacro()
+	 * @see #endRecordingMacro()
+	 */
+	public static synchronized boolean isRecordingMacro() {
+		return recordingMacro;
+	}
+
+
+	/**
+	 * Loads a macro to be used by all <code>RTextArea</code>s in the current
+	 * application.
+	 *
+	 * @param macro The macro to load.
+	 * @see #getCurrentMacro()
+	 */
+	public static synchronized void loadMacro(Macro macro) {
+		currentMacro = macro;
+	}
+
+
+	/**
+	 * Marks all instances of the specified text in this text area.
+	 *
+	 * @param toMark The text to mark.
+	 * @param matchCase Whether the match should be case-sensitive.
+	 * @param wholeWord Whether the matches should be surrounded by spaces
+	 *        or tabs.
+	 * @param regex Whether <code>toMark</code> is a Java regular expression.
+	 * @return The number of matches marked.
+	 * @see #clearMarkAllHighlights
+	 * @see #getMarkAllHighlightColor
+	 * @see #setMarkAllHighlightColor
+	 */
+	public int markAll(String toMark, boolean matchCase, boolean wholeWord,
+					boolean regex) {
+		Highlighter h = getHighlighter();
+		int numMarked = 0;
+		if (toMark!=null && !toMark.equals(markedWord) && h!=null) {
+			if (markAllHighlights!=null)
+				clearMarkAllHighlights();
+			else
+				markAllHighlights = new ArrayList(10);
+			int caretPos = getCaretPosition();
+			markedWord = toMark;
+			setCaretPosition(0);
+			SearchContext context = new SearchContext();
+			context.setSearchFor(toMark);
+			context.setMatchCase(matchCase);
+			context.setRegularExpression(regex);
+			context.setSearchForward(true);
+			context.setWholeWord(wholeWord);
+			boolean found = SearchEngine.find(this, context);
+			while (found) {
+				int start = getSelectionStart();
+				int end = getSelectionEnd();
+				try {
+					markAllHighlights.add(h.addHighlight(start, end,
+										markAllHighlightPainter));
+				} catch (BadLocationException ble) {
+					ble.printStackTrace();
+				}
+				numMarked++;
+				found = SearchEngine.find(this, context);
+			}
+			setCaretPosition(caretPos);
+			repaint();
+		}
+		return numMarked;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void paste() {
+		// Treat paste operations as atomic, otherwise the removal and
+		// insertion are treated as two separate undo-able operations.
+		beginAtomicEdit();
+		try {
+			super.paste();
+		} finally {
+			endAtomicEdit();
+		}
+	}
+
+
+	/**
+	 * "Plays back" the last recorded macro in this text area.
+	 */
+	public synchronized void playbackLastMacro() {
+		if (currentMacro!=null) {
+			Action[] actions = getActions();
+			int numActions = actions.length;
+			List macroRecords = currentMacro.getMacroRecords();
+			int num = macroRecords.size();
+			if (num>0) {
+				undoManager.beginInternalAtomicEdit();
+				try {
+					for (int i=0; i<num; i++) {
+						MacroRecord record = (MacroRecord)macroRecords.get(i);
+						for (int j=0; j<numActions; j++) {
+							if ((actions[j] instanceof RecordableTextAction) &&
+								record.id.equals(
+								((RecordableTextAction)actions[j]).getMacroID())) {
+								actions[j].actionPerformed(
+									new ActionEvent(this,
+												ActionEvent.ACTION_PERFORMED,
+												record.actionCommand));
+								break;
+							}
+						}
+					}
+				} finally {
+					undoManager.endInternalAtomicEdit();
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Method called when it's time to print this badboy (the old-school,
+	 * AWT way).
+	 *
+	 * @param g The context into which the page is drawn.
+	 * @param pageFormat The size and orientation of the page being drawn.
+	 * @param pageIndex The zero based index of the page to be drawn.
+	 */
+	public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
+		return RPrintUtilities.printDocumentWordWrap(g, this, getFont(), pageIndex, pageFormat, getTabSize());
+	}
+
+
+	/**
+	 * We override this method because the super version gives us an entirely
+	 * new <code>Document</code>, thus requiring us to re-attach our Undo
+	 * manager.  With this version we just replace the text.
+	 */
+	public void read(Reader in, Object desc) throws IOException {
+
+		RTextAreaEditorKit kit = (RTextAreaEditorKit)getUI().getEditorKit(this);
+		setText(null);
+		Document doc = getDocument();
+		if (desc != null)
+			doc.putProperty(Document.StreamDescriptionProperty, desc);
+		try {
+			// NOTE:  Resets the "line separator" property.
+			kit.read(in, doc, 0);
+		} catch (BadLocationException e) {
+			throw new IOException(e.getMessage());
+		}
+
+	}
+
+
+	/**
+	 * De-serializes a text area.
+	 *
+	 * @param s The stream to read from.
+	 * @throws ClassNotFoundException
+	 * @throws IOException
+	 */
+	private void readObject(ObjectInputStream s)
+						throws ClassNotFoundException, IOException {
+
+		s.defaultReadObject();
+
+		// UndoManagers cannot be serialized without Exceptions.  See
+		// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4275892
+		undoManager = createUndoManager();
+		getDocument().addUndoableEditListener(undoManager);
+
+		lineHighlightManager = null; // Keep FindBugs happy.
+
+	}
+
+
+	/**
+	 * Attempt to redo the last action.
+	 *
+	 * @see #undoLastAction()
+	 */
+	public void redoLastAction() {
+		// NOTE:  The try/catch block shouldn't be necessary...
+		try {
+			if (undoManager.canRedo())
+				undoManager.redo();
+		} catch (CannotRedoException cre) {
+			cre.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * Removes all line highlights.
+	 *
+	 * @see #removeLineHighlight(Object)
+	 */
+	public void removeAllLineHighlights() {
+		if (lineHighlightManager!=null) {
+			lineHighlightManager.removeAllLineHighlights();
+		}
+	}
+
+
+	/**
+	 * Removes a line highlight.
+	 *
+	 * @param tag The tag of the line highlight to remove.
+	 * @see #removeAllLineHighlights()
+	 * @see #addLineHighlight(int, Color)
+	 */
+	public void removeLineHighlight(Object tag) {
+		if (lineHighlightManager!=null) {
+			lineHighlightManager.removeLineHighlight(tag);
+		}
+	}
+
+
+	/**
+	 * Replaces text from the indicated start to end position with the
+	 * new text specified.  Does nothing if the model is null.  Simply
+	 * does a delete if the new string is null or empty.
+	 * <p>
+	 * This method is thread safe, although most Swing methods
+	 * are not.<p>
+	 * This method is overridden so that our Undo manager remembers it as a
+	 * single operation (it has trouble with this, especially for
+	 * <code>RSyntaxTextArea</code> and the "auto-indent" feature).
+	 *
+	 * @param str the text to use as the replacement
+	 * @param start the start position >= 0
+	 * @param end the end position >= start
+	 * @exception IllegalArgumentException  if part of the range is an
+	 *  invalid position in the model
+	 * @see #insert(String, int)
+	 * @see #replaceRange(String, int, int)
+	 */
+	public void replaceRange(String str, int start, int end) {
+		if (end < start)
+			throw new IllegalArgumentException("end before start");
+		Document doc = getDocument();
+		if (doc != null) {
+			try {
+				// Without this, in some cases we'll have to do two undos
+				// for one logical operation (for example, try editing a
+				// Java source file in an RSyntaxTextArea, and moving a line
+				// with text already on it down via Enter.  Without this
+				// line, doing a single "undo" moves all later text up,
+				// but the first line moved down isn't there!  Doing a
+				// second undo puts it back.
+				undoManager.beginInternalAtomicEdit();
+				((AbstractDocument)doc).replace(start, end - start,
+                               		                     str, null);
+			} catch (BadLocationException e) {
+				throw new IllegalArgumentException(e.getMessage());
+			} finally {
+				undoManager.endInternalAtomicEdit();
+			}
+		}
+    }
+
+
+	/**
+	 * This method overrides <code>JTextComponent</code>'s
+	 * <code>replaceSelection</code>, so that if <code>textMode</code> is
+	 * {@link #OVERWRITE_MODE}, it actually overwrites.
+	 *
+	 * @param text The content to replace the selection with.
+	 */
+	public void replaceSelection(String text) {
+
+		// It's legal for null to be used here...
+		if (text==null) {
+			handleReplaceSelection(text);
+			return;
+		}
+
+		if (getTabsEmulated() && text.indexOf('\t')>-1) {
+			text = replaceTabsWithSpaces(text);
+		}
+
+		// If the user wants to overwrite text...
+		if (textMode==OVERWRITE_MODE && !"\n".equals(text)) {
+
+			Caret caret = getCaret();
+			int caretPos = caret.getDot();
+			Document doc = getDocument();
+			Element map = doc.getDefaultRootElement();
+			int curLine = map.getElementIndex(caretPos);
+			int lastLine = map.getElementCount() - 1;
+
+			try {
+
+				// If we're not at the end of a line, select the characters
+				// that will be overwritten (otherwise JTextArea will simply
+				// insert in front of them).
+				int curLineEnd = getLineEndOffset(curLine);
+				if (caretPos==caret.getMark() && caretPos!=curLineEnd) {
+					if (curLine==lastLine)
+						caretPos = Math.min(caretPos+text.length(), curLineEnd);
+					else
+						caretPos = Math.min(caretPos+text.length(), curLineEnd-1);
+					caret.moveDot(caretPos);//moveCaretPosition(caretPos);
+				}
+
+			} catch (BadLocationException ble) { // Never happens
+				UIManager.getLookAndFeel().provideErrorFeedback(this);
+				ble.printStackTrace();
+			}
+
+		} // End of if (textMode==OVERWRITE_MODE).
+
+		// Now, actually do the inserting/replacing.  Our undoManager will
+		// take care of remembering the remove/insert as atomic if we are in
+		// overwrite mode.
+		handleReplaceSelection(text);
+
+	}
+
+
+	private StringBuffer repTabsSB;
+	/**
+	 * Replaces all instances of the tab character in <code>text</code> with
+	 * the number of spaces equivalent to a tab in this text area.<p>
+	 *
+	 * This method should only be called from thread-safe methods, such as
+	 * {@link #replaceSelection(String)}.
+	 *
+	 * @param text The <code>java.lang.String</code> in which to replace tabs
+	 *        with spaces.  This has already been verified to have at least
+	 *        one tab character in it.
+	 * @return A <code>java.lang.String</code> just like <code>text</code>,
+	 *         but with spaces instead of tabs.
+	 */
+	private final String replaceTabsWithSpaces(String text) {
+
+		String tabText = "";
+		int temp = getTabSize();
+		for (int i=0; i<temp; i++) {
+			tabText += ' ';
+		}
+
+		// Common case: User's entering a single tab (pressed the tab key).
+		if (text.length()==1) {
+			return tabText;
+		}
+
+		// Otherwise, there may be more than one tab.  Manually search for
+		// tabs for performance, as opposed to using String#replaceAll().
+		// This method is called for each character inserted when "replace
+		// tabs with spaces" is enabled, so we need to be quick.
+
+		//return text.replaceAll("\t", tabText);
+		if (repTabsSB==null) {
+			repTabsSB = new StringBuffer();
+		}
+		repTabsSB.setLength(0);
+		char[] array = text.toCharArray(); // Wouldn't be needed in 1.5!
+		int oldPos = 0;
+		int pos = 0;
+		while ((pos=text.indexOf('\t', oldPos))>-1) {
+			//repTabsSB.append(text, oldPos, pos); // Added in Java 1.5
+			if (pos>oldPos) {
+				repTabsSB.append(array, oldPos, pos-oldPos);
+			}
+			repTabsSB.append(tabText);
+			oldPos = pos + 1;
+		}
+		if (oldPos<array.length) {
+			repTabsSB.append(array, oldPos, array.length-oldPos);
+		}
+
+		return repTabsSB.toString();
+
+	}
+
+
+
+	/**
+	 * Sets the properties of one of the actions this text area owns.
+	 *
+	 * @param action The action to modify; for example, {@link #CUT_ACTION}.
+	 * @param name The new name for the action.
+	 * @param mnemonic The new mnemonic for the action.
+	 * @param accelerator The new accelerator key for the action.
+	 */
+	public static void setActionProperties(int action, String name,
+							char mnemonic, KeyStroke accelerator) {
+		setActionProperties(action, name, new Integer(mnemonic), accelerator);
+	}
+
+
+	/**
+	 * Sets the properties of one of the actions this text area owns.
+	 *
+	 * @param action The action to modify; for example, {@link #CUT_ACTION}.
+	 * @param name The new name for the action.
+	 * @param mnemonic The new mnemonic for the action.
+	 * @param accelerator The new accelerator key for the action.
+	 */
+	public static void setActionProperties(int action, String name,
+							Integer mnemonic, KeyStroke accelerator) {
+
+		Action tempAction = null;
+
+		switch (action) {
+			case CUT_ACTION:
+				tempAction = cutAction;
+				break;
+			case COPY_ACTION:
+				tempAction = copyAction;
+				break;
+			case PASTE_ACTION:
+				tempAction = pasteAction;
+				break;
+			case DELETE_ACTION:
+				tempAction = deleteAction;
+				break;
+			case SELECT_ALL_ACTION:
+				tempAction = selectAllAction;
+				break;
+			case UNDO_ACTION:
+			case REDO_ACTION:
+			default:
+				return;
+		}
+
+		tempAction.putValue(Action.NAME, name);
+		tempAction.putValue(Action.SHORT_DESCRIPTION, name);
+		tempAction.putValue(Action.ACCELERATOR_KEY, accelerator);
+		tempAction.putValue(Action.MNEMONIC_KEY, mnemonic);
+
+	}
+
+
+	/**
+	 * This method is overridden to make sure that instances of
+	 * <code>RTextArea</code> only use {@link ConfigurableCaret}s.
+	 * To set the style of caret (vertical line, block, etc.) used for
+	 * insert or overwrite mode, use {@link #setCaretStyle(int, int)}.
+	 *
+	 * @param caret The caret to use.  If this is not an instance of
+	 *        <code>ConfigurableCaret</code>, an exception is thrown.
+	 * @throws IllegalArgumentException If the specified caret is not an
+	 *         <code>ConfigurableCaret</code>.
+	 * @see #setCaretStyle(int, int)
+	 */
+	public void setCaret(Caret caret) {
+		if (!(caret instanceof ConfigurableCaret)) {
+			throw new IllegalArgumentException(
+						"RTextArea needs ConfigurableCaret");
+		}
+		super.setCaret(caret);
+		if (carets!=null) { // Called by setUI() before carets is initialized
+			((ConfigurableCaret)caret).setStyle(carets[getTextMode()]);
+		}
+	}
+
+
+	/**
+	 * Sets the style of caret used when in insert or overwrite mode.
+	 *
+	 * @param mode Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+	 * @param style The style for the caret (such as
+	 *        {@link ConfigurableCaret#VERTICAL_LINE_STYLE}).
+	 * @see org.fife.ui.rtextarea.ConfigurableCaret
+	 */
+	public void setCaretStyle(int mode, int style) {
+		style = (style>=ConfigurableCaret.MIN_STYLE &&
+					style<=ConfigurableCaret.MAX_STYLE ?
+						style : ConfigurableCaret.THICK_VERTICAL_LINE_STYLE);
+		carets[mode] = style;
+		if (mode==getTextMode()) {
+			// Will repaint the caret if necessary.
+			((ConfigurableCaret)getCaret()).setStyle(style);
+		}
+	}
+
+
+	/**
+	 * Sets the document used by this text area.
+	 *
+	 * @param document The new document to use.
+	 * @throws IllegalArgumentException If the document is not an instance of
+	 *         {@link AbstractDocument}.
+	 */
+	public void setDocument(Document document) {
+		if (!(document instanceof AbstractDocument)) {
+			throw new IllegalArgumentException("RTextArea requires " +
+				"instances of AbstractDocument for its document");
+		}
+		if (undoManager!=null) { // First time through, undoManager==null
+			Document old = getDocument();
+			if (old!=null) {
+				old.removeUndoableEditListener(undoManager);
+			}
+		}
+		super.setDocument(document);
+		if (undoManager!=null) {
+			document.addUndoableEditListener(undoManager);
+			discardAllEdits();
+		}
+	}
+
+
+	/**
+	 * Sets the path in which to find images to associate with the editor's
+	 * actions.  The path MUST contain the following images (with the
+	 * appropriate extension as defined by the icon group):<br>
+	 * <ul>
+	 *   <li>cut</li>
+	 *   <li>copy</li>
+	 *   <li>paste</li>
+	 *   <li>delete</li>
+	 *   <li>undo</li>
+	 *   <li>redo</li>
+	 *   <li>selectall</li>
+	 * </ul>
+	 * If any of the above images don't exist, the corresponding action will
+	 * not have an icon.
+	 *
+	 * @param group The icon group to load.
+	 * @see #getIconGroup()
+	 */
+	public static synchronized void setIconGroup(IconGroup group) {
+		Icon icon = group.getIcon("cut");
+		cutAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("copy");
+		copyAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("paste");
+		pasteAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("delete");
+		deleteAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("undo");
+		undoAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("redo");
+		redoAction.putValue(Action.SMALL_ICON, icon);
+		icon = group.getIcon("selectall");
+		selectAllAction.putValue(Action.SMALL_ICON, icon);
+		iconGroup = group;
+	}
+
+
+	/**
+	 * Sets the color used for "mark all."  This fires a property change of
+	 * type {@link #MARK_ALL_COLOR_PROPERTY}.
+	 *
+	 * @param color The color to use for "mark all."
+	 * @see #getMarkAllHighlightColor()
+	 */
+	public void setMarkAllHighlightColor(Color color) {
+		Color old = (Color)markAllHighlightPainter.getPaint();
+		if (old!=null && !old.equals(color)) {
+			markAllHighlightPainter.setPaint(color);
+			if (markedWord!=null)
+				repaint();	// Repaint if words are highlighted.
+			firePropertyChange(MARK_ALL_COLOR_PROPERTY, old, color);
+		}
+	}
+
+
+	/**
+	 * Sets the popup menu used by this text area.<p>
+	 * 
+	 * If you set the popup menu with this method, you'll want to consider also
+	 * overriding {@link #configurePopupMenu(JPopupMenu)}, especially if you
+	 * removed any of the default menu items.
+	 *
+	 * @param popupMenu The popup menu.  If this is <code>null</code>, no
+	 *        popup menu will be displayed.
+	 * @see #getPopupMenu()
+	 * @see #configurePopupMenu(JPopupMenu)
+	 */
+	public void setPopupMenu(JPopupMenu popupMenu) {
+		this.popupMenu = popupMenu;
+		popupMenuCreated = true;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setRoundedSelectionEdges(boolean rounded) {
+		if (getRoundedSelectionEdges()!=rounded) {
+			markAllHighlightPainter.setRoundedEdges(rounded);
+			super.setRoundedSelectionEdges(rounded); // Fires event.
+		}
+	}
+
+
+	/**
+	 * Sets the text last selected/Ctrl+K'd in an <code>RTextArea</code>.
+	 * This text will be searched for in subsequent Ctrl+K/Ctrl+Shift+K
+	 * actions (Cmd+K on OS X).<p>
+	 *
+	 * Since the selected occurrence actions are built into RTextArea,
+	 * applications usually do not have to call this method directly, but can
+	 * choose to do so if they wish (for example, if they wish to set this
+	 * value when the user does a search via a Find dialog).
+	 *
+	 * @param text The selected text.
+	 * @see #getSelectedOccurrenceText()
+	 */
+	public static void setSelectedOccurrenceText(String text) {
+		selectedOccurrenceText = text;
+	}
+
+
+	/**
+	 * Sets the text mode for this editor pane.
+	 *
+	 * @param mode Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+	 */
+	public void setTextMode(int mode) {
+
+		if (mode!=INSERT_MODE && mode!=OVERWRITE_MODE)
+			mode = INSERT_MODE;
+
+		if (textMode != mode) {
+			ConfigurableCaret cc = (ConfigurableCaret)getCaret();
+			cc.setStyle(carets[mode]);
+			textMode = mode;
+		}
+
+	}
+
+
+	/**
+	 * Sets the tool tip supplier.
+	 *
+	 * @param supplier The new tool tip supplier, or <code>null</code> if
+	 *        there is to be no supplier.
+	 * @see #getToolTipSupplier()
+	 */
+	public void setToolTipSupplier(ToolTipSupplier supplier) {
+		this.toolTipSupplier = supplier;
+	}
+
+
+	/**
+	 * Sets the UI used by this text area.  This is overridden so only the
+	 * right-click popup menu's UI is updated.  The look and feel of an
+	 * <code>RTextArea</code> is independent of the Java Look and Feel, and so
+	 * this method does not change the text area itself.  Subclasses (such as
+	 * <code>RSyntaxTextArea</code> can call <code>setRTextAreaUI</code> if
+	 * they wish to install a new UI.
+	 *
+	 * @param ui This parameter is ignored.
+	 */
+	public final void setUI(TextUI ui) {
+
+		// Update the popup menu's ui.
+		if (popupMenu!=null) {
+			SwingUtilities.updateComponentTreeUI(popupMenu);
+		}
+
+		// Set things like selection color, selected text color, etc. to
+		// laf defaults (if values are null or UIResource instances).
+		RTextAreaUI rtaui = (RTextAreaUI)getUI();
+		if (rtaui!=null) {
+			rtaui.installDefaults();
+		}
+
+	}
+
+
+	/**
+	 * Attempt to undo an "action" done in this text area.
+	 *
+	 * @see #redoLastAction()
+	 */
+	public void undoLastAction() {
+		// NOTE: that the try/catch block shouldn't be necessary...
+		try {
+			if (undoManager.canUndo())
+				undoManager.undo();
+		}
+		catch (CannotUndoException cre) {
+			cre.printStackTrace();
+		}
+	}
+
+	/**
+	 * Serializes this text area.
+	 *
+	 * @param s The stream to write to.
+	 * @throws IOException If an IO error occurs.
+	 */
+	private void writeObject(ObjectOutputStream s) throws IOException {
+
+		// UndoManagers cannot be serialized without Exceptions.  See
+		// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4275892
+		getDocument().removeUndoableEditListener(undoManager);
+		s.defaultWriteObject();
+		getDocument().addUndoableEditListener(undoManager);
+
+	}
+
+
+	/**
+	 * Modified from <code>MutableCaretEvent</code> in
+	 * <code>JTextComponent</code> so that mouse events get fired when the user
+	 * is selecting text with the mouse as well.  This class also displays the
+	 * popup menu when the user right-clicks in the text area.
+	 */
+	protected class RTextAreaMutableCaretEvent extends RTAMouseListener {
+
+		protected RTextAreaMutableCaretEvent(RTextArea textArea) {
+			super(textArea);
+		}
+
+		public void focusGained(FocusEvent e) {
+			Caret c = getCaret();
+			boolean enabled = c.getDot()!=c.getMark();
+			cutAction.setEnabled(enabled);
+			copyAction.setEnabled(enabled);
+			undoManager.updateActions(); // To reflect this text area.
+		}
+
+		public void focusLost(FocusEvent e) {
+		}
+
+		public void mouseDragged(MouseEvent e) {
+			if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
+				Caret caret = getCaret();
+				dot = caret.getDot();
+				mark = caret.getMark();
+				fireCaretUpdate(this);
+			}
+		}
+
+		public void mousePressed(MouseEvent e) {
+			// WORKAROUND:  Since JTextComponent only updates the caret
+			// location on mouse clicked and released, we'll do it on dragged
+			// events when the left mouse button is clicked.
+			if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
+				Caret caret = getCaret();
+				dot = caret.getDot();
+				mark = caret.getMark();
+				fireCaretUpdate(this);
+			}
+		}
+
+		public void mouseReleased(MouseEvent e) {
+			if ((e.getModifiers()&MouseEvent.BUTTON3_MASK)!=0)
+				showPopup(e);
+		}
+
+		/**
+		 * Shows a popup menu with cut, copy, paste, etc. options if the
+		 * user clicked the right button.
+		 *
+		 * @param e The mouse event that caused this method to be called.
+		 */
+		private void showPopup(MouseEvent e) {
+			JPopupMenu popupMenu = getPopupMenu();
+			if (popupMenu!=null) {
+				configurePopupMenu(popupMenu);
+				popupMenu.show(e.getComponent(), e.getX(), e.getY());
+			}
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaBase.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaBase.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaBase.java	(revision 25584)
@@ -0,0 +1,1168 @@
+/*
+ * 04/07/2005
+ *
+ * RTextAreaBase.java - The base class for an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.AWTEvent;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.event.ComponentEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import javax.swing.JTextArea;
+import javax.swing.event.CaretEvent;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * This is the base class for <code>RTextArea</code>; basically it's just an
+ * extension of <code>javax.swing.JTextArea</code> adding a bunch of properties.
+ * <p>
+ *
+ * This class is only supposed to be overridden by <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ */
+abstract class RTextAreaBase extends JTextArea {
+
+	public static final String BACKGROUND_IMAGE_PROPERTY			= "background.image";
+	public static final String CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY	= "RTA.currentLineHighlightColor";
+	public static final String CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY	= "RTA.currentLineHighlightFade";
+	public static final String HIGHLIGHT_CURRENT_LINE_PROPERTY		= "RTA.currentLineHighlight";
+	public static final String ROUNDED_SELECTION_PROPERTY			= "RTA.roundedSelection";
+
+	private boolean tabsEmulatedWithSpaces;		// If true, tabs will be expanded to spaces.
+
+	private boolean highlightCurrentLine;		// If true, the current line is highlighted.
+	private Color currentLineColor;			// The color used to highlight the current line.
+	private boolean marginLineEnabled;			// If true, paint a "margin line."
+	private Color marginLineColor;			// The color used to paint the margin line.
+	private int marginLineX;				// The x-location of the margin line.
+	private int marginSizeInChars;			// How many 'm' widths the margin line is over.
+	private boolean fadeCurrentLineHighlight;	// "Fade effect" for current line highlight.
+	private boolean roundedSelectionEdges;
+	private int previousCaretY;
+int currentCaretY;							// Used to know when to rehighlight current line.
+
+	private BackgroundPainterStrategy backgroundPainter;	// Paints the background.
+
+	private RTAMouseListener mouseListener;
+
+	private static final Color DEFAULT_CARET_COLOR				= new ColorUIResource(255,51,51);
+	private static final Color DEFAULT_CURRENT_LINE_HIGHLIGHT_COLOR	= new Color(255,255,170);
+	private static final Color DEFAULT_MARGIN_LINE_COLOR			= new Color(255,224,224);
+	private static final int DEFAULT_TAB_SIZE					= 4;
+	private static final int DEFAULT_MARGIN_LINE_POSITION			= 80;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RTextAreaBase() {
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 */
+	public RTextAreaBase(AbstractDocument doc) {
+		super(doc);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 */
+	public RTextAreaBase(String text) {
+		super(text);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextAreaBase(int rows, int cols) {
+		super(rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextAreaBase(String text, int rows, int cols) {
+		super(text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param doc The document for the editor.
+	 * @param text The initial text to display.
+	 * @param rows The number of rows to display.
+	 * @param cols The number of columns to display.
+	 * @throws IllegalArgumentException If either <code>rows</code> or
+	 *         <code>cols</code> is negative.
+	 */
+	public RTextAreaBase(AbstractDocument doc, String text, int rows,
+							int cols) {
+		super(doc, text, rows, cols);
+		init();
+	}
+
+
+	/**
+	 * Adds listeners that listen for changes to the current line, so we can
+	 * update our "current line highlight."  This is needed only because of an
+	 * apparent difference between the JRE 1.4.2 and 1.5.0 (needed on 1.4.2,
+	 * not needed on 1.5.0).
+	 */
+	protected void addCurrentLineHighlightListeners() {
+		boolean add = true;
+		MouseMotionListener[] mouseMotionListeners = getMouseMotionListeners();
+		for (int i=0; i<mouseMotionListeners.length; i++) {
+			if (mouseMotionListeners[i]==mouseListener) {
+				add = false;
+				break;
+			}
+		}
+		if (add==true) {
+			//System.err.println("Adding mouse motion listener!");
+			addMouseMotionListener(mouseListener);
+		}
+		MouseListener[] mouseListeners = getMouseListeners();
+		for (int i=0; i<mouseListeners.length; i++) {
+			if (mouseListeners[i]==mouseListener) {
+				add = false;
+				break;
+			}
+		}
+		if (add==true) {
+			//System.err.println("Adding mouse listener!");
+			addMouseListener(mouseListener);
+		}
+	}
+
+
+	/*
+	 * TODO: Figure out why RTextArea doesn't work with RTL orientation!
+	 */
+//	public void applyComponentOrientation(ComponentOrientation orientation) {
+//		super.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
+//	}
+
+
+	/**
+	 * Converts all instances of a number of spaces equal to a tab size
+	 * into a tab in this text area.
+	 *
+	 * @see #convertTabsToSpaces
+	 * @see #getTabsEmulated
+	 * @see #setTabsEmulated
+	 */
+	public void convertSpacesToTabs() {
+
+		// FIXME:  This is inefficient and will yield an OutOfMemoryError if
+		// done on a large document.  We should scan 1 line at a time and
+		// replace; it'll be slower but safer.
+
+		int caretPosition = getCaretPosition();
+		int tabSize = getTabSize();
+		String tabInSpaces = "";
+		for (int i=0; i<tabSize; i++)
+			tabInSpaces += " ";
+		String text = getText();
+		setText(text.replaceAll(tabInSpaces, "\t"));
+		int newDocumentLength = getDocument().getLength();
+
+		// Place the caret back in its proper position.
+		if (caretPosition<newDocumentLength)
+			setCaretPosition(caretPosition);
+		else
+			setCaretPosition(newDocumentLength-1);
+
+	}
+
+
+	/**
+	 * Converts all instances of a tab into a number of spaces equivalent
+	 * to a tab in this text area.
+	 *
+	 * @see #convertSpacesToTabs
+	 * @see #getTabsEmulated
+	 * @see #setTabsEmulated
+	 */
+	public void convertTabsToSpaces() {
+
+		// FIXME:  This is inefficient and will yield an OutOfMemoryError if
+		// done on a large document.  We should scan 1 line at a time and
+		// replace; it'll be slower but safer.
+
+		int caretPosition = getCaretPosition();
+		int tabSize = getTabSize();
+		StringBuffer tabInSpaces = new StringBuffer();
+		for (int i=0; i<tabSize; i++)
+			tabInSpaces.append(' ');
+		String text = getText();
+		setText(text.replaceAll("\t", tabInSpaces.toString()));
+
+		// Put caret back at same place in document.
+		setCaretPosition(caretPosition);
+
+	}
+
+
+	/**
+	 * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+	 *
+	 * @return The caret event/mouse listener.
+	 */
+	protected abstract RTAMouseListener createMouseListener();
+
+
+	/**
+	 * Returns the a real UI to install on this text component.  Subclasses
+	 * can override this method to return an extended version of
+	 * <code>RTextAreaUI</code>.
+	 *
+	 * @return The UI.
+	 */
+	protected abstract RTextAreaUI createRTextAreaUI();
+
+
+	/**
+	 * Forces the current line highlight to be repainted.  This hack is
+	 * necessary for those situations when the view (appearance) changes
+	 * but the caret's location hasn't (and thus the current line highlight
+	 * coordinates won't get changed).  Examples of this are when
+	 * word wrap is toggled and when syntax styles are changed in an
+	 * <code>RSyntaxTextArea</code>.
+	 */
+	protected void forceCurrentLineHighlightRepaint() {
+		// Check isShowing() to prevent BadLocationException
+		// in constructor if linewrap is set to true.
+		if (isShowing()) {
+			// Changing previousCaretY makes us sure to get a repaint.
+			previousCaretY = -1;
+			// Trick it into checking for the need to repaint by firing
+			// a false caret event.
+			fireCaretUpdate(mouseListener);
+		}
+	}
+
+
+	/**
+	 * Returns the <code>java.awt.Color</code> used as the background color for
+	 * this text area.  If a <code>java.awt.Image</code> image is currently
+	 * being used instead, <code>null</code> is returned.
+	 *
+	 * @return The current background color, or <code>null</code> if an image
+	 *         is currently the background.
+	 */
+	public final Color getBackground() {
+		Object bg = getBackgroundObject();
+		return (bg instanceof Color) ? (Color)bg : null;
+	}
+
+	/**
+	 * Returns the image currently used for the background.
+	 * If the current background is currently a <code>java.awt.Color</code> and
+	 * not a <code>java.awt.Image</code>, then <code>null</code> is returned.
+	 *
+	 * @return A <code>java.awt.Image</code> used for the background, or
+	 *         <code>null</code> if the background is not an image.
+	 * @see #setBackgroundImage
+	 */
+	public final Image getBackgroundImage() {
+		Object bg = getBackgroundObject();
+		return (bg instanceof Image) ? (Image)bg : null;
+	}
+
+
+	/**
+	 * Returns the <code>Object</code> representing the background for all
+	 * documents in this tabbed pane; either a <code>java.awt.Color</code> or a
+	 * <code>java.lang.Image</code> containing the image used as the background
+	 * for this text area.
+	 *
+	 * @return The <code>Object</code> used for the background.
+	 * @see #setBackgroundObject(Object newBackground)
+	 */
+	public final Object getBackgroundObject() {
+		if (backgroundPainter==null)
+			return null;
+		return (backgroundPainter instanceof ImageBackgroundPainterStrategy) ?
+			(Object)((ImageBackgroundPainterStrategy)backgroundPainter).
+					getMasterImage() :
+			(Object)((ColorBackgroundPainterStrategy)backgroundPainter).
+					getColor();
+	}
+
+
+	/**
+	 * Gets the line number that the caret is on.
+	 *
+	 * @return The zero-based line number that the caret is on.
+	 */
+	public final int getCaretLineNumber() {
+		try {
+			return getLineOfOffset(getCaretPosition());
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Gets the position from the beginning of the current line that the caret
+	 * is on.
+	 *
+	 * @return The zero-based position from the beginning of the current line
+	 *         that the caret is on.
+	 */
+	public final int getCaretOffsetFromLineStart() {
+		try {
+			int pos = getCaretPosition();
+			return pos - getLineStartOffset(getLineOfOffset(pos));
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Returns the color being used to highlight the current line.  Note that
+	 * if highlighting the current line is turned off, you will not be seeing
+	 * this highlight.
+	 *
+	 * @return The color being used to highlight the current line.
+	 * @see #getHighlightCurrentLine()
+	 * @see #setHighlightCurrentLine(boolean)
+	 * @see #setCurrentLineHighlightColor
+	 */
+	public Color getCurrentLineHighlightColor() {
+		return currentLineColor;
+	}
+
+
+	/**
+	 * Returns the default caret color.
+	 *
+	 * @return The default caret color.
+	 */
+	public static final Color getDefaultCaretColor() {
+		return DEFAULT_CARET_COLOR;
+	}
+
+
+	/**
+	 * Returns the "default" color for highlighting the current line.  Note
+	 * that this color was chosen only because it looks nice (to me) against a
+	 * white background.
+	 *
+	 * @return The default color for highlighting the current line.
+	 */
+	public static final Color getDefaultCurrentLineHighlightColor() {
+		return DEFAULT_CURRENT_LINE_HIGHLIGHT_COLOR;
+	}
+
+
+	/**
+	 * Returns the default font for text areas.
+	 *
+	 * @return The default font.
+	 */
+	public static final Font getDefaultFont() {
+
+		Font font = null;
+
+		if (isOSX()) {
+			// Snow Leopard (1.6) uses Menlo as default monospaced font,
+			// pre-Snow Leopard used Monaco.
+			font = new Font("Menlo", Font.PLAIN, 12);
+			if (!"Menlo".equals(font.getFamily())) {
+				font = new Font("Monaco", Font.PLAIN, 12);
+				if (!"Monaco".equals(font.getFamily())) { // Shouldn't happen
+					font = new Font("Monospaced", Font.PLAIN, 13);
+				}
+			}
+		}
+		else {
+			font = new Font("Monospaced", Font.PLAIN, 13);
+		}
+
+		//System.out.println(font.getFamily() + ", " + font.getName());
+		return font;
+
+	}
+
+
+	/**
+	 * Returns the default foreground color for text in this text area.
+	 *
+	 * @return The default foreground color.
+	 */
+	public static final Color getDefaultForeground() {
+		return Color.BLACK;
+	}
+
+
+	/**
+	 * Returns the default color for the margin line.
+	 *
+	 * @return The default margin line color.
+	 * @see #getMarginLineColor()
+	 * @see #setMarginLineColor(Color)
+	 */
+	public static final Color getDefaultMarginLineColor() {
+		return DEFAULT_MARGIN_LINE_COLOR;
+	}
+
+
+	/**
+	 * Returns the default margin line position.
+	 *
+	 * @return The default margin line position.
+	 * @see #getMarginLinePosition
+	 * @see #setMarginLinePosition
+	 */
+	public static final int getDefaultMarginLinePosition() {
+		return DEFAULT_MARGIN_LINE_POSITION;
+	}
+
+
+	/**
+	 * Returns the default tab size, in spaces.
+	 *
+	 * @return The default tab size.
+	 */
+	public static final int getDefaultTabSize() {
+		return DEFAULT_TAB_SIZE;
+	}
+
+
+	/**
+	 * Returns whether the current line highlight is faded.
+	 *
+	 * @return Whether the current line highlight is faded.
+	 * @see #setFadeCurrentLineHighlight
+	 */
+	public boolean getFadeCurrentLineHighlight() {
+		return fadeCurrentLineHighlight;
+	}
+
+
+	/**
+	 * Returns whether or not the current line is highlighted.
+	 *
+	 * @return Whether or the current line is highlighted.
+	 * @see #setHighlightCurrentLine(boolean)
+	 * @see #getCurrentLineHighlightColor
+	 * @see #setCurrentLineHighlightColor
+	 */
+	public boolean getHighlightCurrentLine() {
+		return highlightCurrentLine;
+	}
+
+
+	/**
+	 * Returns the offset of the last character of the line that the caret is
+	 * on.
+	 *
+	 * @return The last offset of the line that the caret is currently on.
+	 */
+	public final int getLineEndOffsetOfCurrentLine() {
+		try {
+			return getLineEndOffset(getCaretLineNumber());
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Returns the height of a line of text in this text area.
+	 *
+	 * @return The height of a line of text.
+	 */
+	public int getLineHeight() {
+		return getRowHeight();
+	}
+
+
+	/**
+	 * Returns the offset of the first character of the line that the caret is
+	 * on.
+	 *
+	 * @return The first offset of the line that the caret is currently on.
+	 */
+	public final int getLineStartOffsetOfCurrentLine() {
+		try {
+			return getLineStartOffset(getCaretLineNumber());
+		} catch (BadLocationException ble) {
+			return 0; // Never happens
+		}
+	}
+
+
+	/**
+	 * Returns the color used to paint the margin line.
+	 *
+	 * @return The margin line color.
+	 * @see #setMarginLineColor(Color)
+	 */
+	public Color getMarginLineColor() {
+		return marginLineColor;
+	}
+
+
+	/**
+	 * Returns the margin line position (in pixels) from the left-hand side of
+	 * the text area.
+	 *
+	 * @return The margin line position.
+	 * @see #getDefaultMarginLinePosition
+	 * @see #setMarginLinePosition
+	 */
+	public int getMarginLinePixelLocation() {
+		return marginLineX;
+	}
+
+
+	/**
+	 * Returns the margin line position (which is the number of 'm' widths in
+	 * the current font the margin line is over).
+	 *
+	 * @return The margin line position.
+	 * @see #getDefaultMarginLinePosition
+	 * @see #setMarginLinePosition
+	 */
+	public int getMarginLinePosition() {
+		return marginSizeInChars;
+	}
+
+
+	/**
+	 * Returns whether selection edges are rounded in this text area.
+	 *
+	 * @return Whether selection edges are rounded.
+	 * @see #setRoundedSelectionEdges(boolean)
+	 */
+	public boolean getRoundedSelectionEdges() {
+		return roundedSelectionEdges;
+	}
+
+
+	/**
+	 * Returns whether or not tabs are emulated with spaces (i.e., "soft"
+	 * tabs).
+	 *
+	 * @return <code>true</code> if tabs are emulated with spaces;
+	 *         <code>false</code> if they aren't.
+	 * @see #setTabsEmulated
+	 */
+	public boolean getTabsEmulated() {
+		return tabsEmulatedWithSpaces;
+	}
+
+
+	/**
+	 * Initializes this text area.
+	 */
+	private void init() {
+
+		// Sets the UI.  Note that setUI() is overridden in RTextArea to only
+		// update the popup menu; this method must be called to set the real
+		// UI.  This is done because the look and feel of an RTextArea is
+		// independent of the installed Java look and feels.
+		setRTextAreaUI(createRTextAreaUI());
+
+		// So we get notified when the component is resized.
+		enableEvents(AWTEvent.COMPONENT_EVENT_MASK|AWTEvent.KEY_EVENT_MASK);
+
+		// Defaults for various properties.
+		setHighlightCurrentLine(true);
+		setCurrentLineHighlightColor(getDefaultCurrentLineHighlightColor());
+		setMarginLineEnabled(false);
+		setMarginLineColor(getDefaultMarginLineColor());
+		setMarginLinePosition(getDefaultMarginLinePosition());
+		setBackgroundObject(Color.WHITE);
+		setWrapStyleWord(true);// We only support wrapping at word boundaries.
+		setTabSize(5);
+		setForeground(Color.BLACK);
+		setTabsEmulated(false);
+
+		// Stuff needed by the caret listener below.
+		previousCaretY = currentCaretY = getInsets().top;
+
+		// Stuff to highlight the current line.
+		mouseListener = createMouseListener();
+		// Also acts as a focus listener so we can update our shared actions
+		// (cut, copy, etc. on the popup menu).
+		addFocusListener(mouseListener);
+		addCurrentLineHighlightListeners();
+
+	}
+
+
+	/**
+	 * Returns whether or not the margin line is being painted.
+	 *
+	 * @return Whether or not the margin line is being painted.
+	 * @see #setMarginLineEnabled
+	 */
+	public boolean isMarginLineEnabled() {
+		return marginLineEnabled;
+	}
+
+
+	/**
+	 * Returns whether the OS we're running on is OS X.
+	 *
+	 * @return Whether the OS we're running on is OS X.
+	 */
+	public static boolean isOSX() {
+		// Recommended at:
+		// http://developer.apple.com/mac/library/technotes/tn2002/tn2110.html
+		String osName = System.getProperty("os.name").toLowerCase();
+		return osName.startsWith("mac os x");
+	}
+
+
+	/**
+	 * Paints the text area.
+	 *
+	 * @param g The graphics context with which to paint.
+	 */
+	protected void paintComponent(Graphics g) {
+
+		//long startTime = System.currentTimeMillis();
+
+		backgroundPainter.paint(g, getVisibleRect());
+
+		// Paint the main part of the text area.
+		TextUI ui = getUI();
+		if (ui != null) {
+			// Not allowed to modify g, so make a copy.
+			Graphics scratchGraphics = g.create();
+			try {
+				ui.update(scratchGraphics, this);
+			} finally {
+				scratchGraphics.dispose();
+			}
+		}
+
+		//long endTime = System.currentTimeMillis();
+		//System.err.println(endTime-startTime);
+
+	}
+
+
+	/**
+	 * Updates the current line highlight location.
+	 */
+	protected void possiblyUpdateCurrentLineHighlightLocation() {
+
+		int width = getWidth();
+		int lineHeight = getLineHeight();
+		int dot = getCaretPosition();
+
+		// If we're wrapping lines we need to check the actual y-coordinate
+		// of the caret, not just the line number, since a single logical
+		// line can span multiple physical lines.
+		if (getLineWrap()) {
+			try {
+				Rectangle temp = modelToView(dot);
+				if (temp!=null) {
+					currentCaretY = temp.y;
+				}
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Should never happen.
+			}
+		}
+
+		// No line wrap - we can simply check the line number (quicker).
+		else {
+//			Document doc = getDocument();
+//			if (doc!=null) {
+//				Element map = doc.getDefaultRootElement();
+//				int caretLine = map.getElementIndex(dot);
+//				Rectangle alloc = ((RTextAreaUI)getUI()).
+//											getVisibleEditorRect();
+//				if (alloc!=null)
+//					currentCaretY = alloc.y + caretLine*lineHeight;
+//			}
+// Modified for code folding requirements
+try {
+	Rectangle temp = modelToView(dot);
+	if (temp!=null) {
+		currentCaretY = temp.y;
+	}
+} catch (BadLocationException ble) {
+	ble.printStackTrace(); // Should never happen.
+}
+		}
+
+		// Repaint current line (to fill in entire highlight), and old line
+		// (to erase entire old highlight) if necessary.  Always repaint
+		// current line in case selection is added or removed.
+		repaint(0,currentCaretY, width,lineHeight);
+		if (previousCaretY!=currentCaretY) {
+			repaint(0,previousCaretY, width,lineHeight);
+		}
+
+		previousCaretY = currentCaretY;
+
+	}
+
+
+	/**
+	 * Overridden so we can tell when the text area is resized and update the
+	 * current-line highlight, if necessary (i.e., if it is enabled and if
+	 * lineWrap is enabled.
+	 *
+	 * @param e The component event about to be sent to all registered
+	 *        <code>ComponentListener</code>s.
+	 */
+	protected void processComponentEvent(ComponentEvent e) {
+
+		// In line wrap mode, resizing the text area means that the caret's
+		// "line" could change - not to a different logical line, but a
+		// different physical one.  So, here we force a repaint of the current
+		// line's highlight if necessary.
+		if (e.getID()==ComponentEvent.COMPONENT_RESIZED &&
+				getLineWrap()==true && getHighlightCurrentLine()) {
+			previousCaretY = -1;  // So we are sure to repaint.
+			fireCaretUpdate(mouseListener);
+		}
+
+		super.processComponentEvent(e);
+
+	}
+
+
+	/**
+	 * Sets the background color of this text editor.  Note that this is
+	 * equivalent to calling <code>setBackgroundObject(bg)</code>.
+	 *
+	 * NOTE:  the opaque property is set to <code>true</code> when the
+	 * background is set to a color (by this method).  When an image is used
+	 * for the background, opaque is set to false.  This is because
+	 * we perform better when setOpaque is true, but if we use an
+	 * image for the background when opaque is true, we get on-screen
+	 * garbage when the user scrolls via the arrow keys.  Thus we
+	 * need setOpaque to be false in that case.<p>
+	 * You never have to change the opaque property yourself; it is always done
+	 * for you.
+	 *
+	 * @param bg The color to use as the background color.
+	 */
+	public void setBackground(Color bg) {
+		Object oldBG = getBackgroundObject();
+		if (oldBG instanceof Color) { // Just change color of strategy.
+			((ColorBackgroundPainterStrategy)backgroundPainter).
+						setColor(bg);
+		}
+		else { // Was an image painter...
+			backgroundPainter = new ColorBackgroundPainterStrategy(bg);
+		}
+		setOpaque(true);
+		firePropertyChange("background", oldBG, bg);
+		repaint();
+	}
+
+
+	/**
+	 * Sets this image as the background image.  This method fires a
+	 * property change event of type {@link #BACKGROUND_IMAGE_PROPERTY}.<p>
+	 *
+	 * NOTE:  the opaque property is set to <code>true</code> when the
+	 * background is set to a color.  When an image is used for the
+	 * background (by this method), opaque is set to false.  This is because
+	 * we perform better when setOpaque is true, but if we use an
+	 * image for the background when opaque is true, we get on-screen
+	 * garbage when the user scrolls via the arrow keys.  Thus we
+	 * need setOpaque to be false in that case.<p>
+	 * You never have to change the opaque property yourself; it is always done
+	 * for you.
+	 *
+	 * @param image The image to use as this text area's background.
+	 * @see #getBackgroundImage
+	 */
+	public void setBackgroundImage(Image image) {
+		Object oldBG = getBackgroundObject();
+		if (oldBG instanceof Image) { // Just change image being displayed.
+			((BufferedImageBackgroundPainterStrategy)backgroundPainter).
+					setImage(image);
+		}
+		else { // Was a color strategy...
+			BufferedImageBackgroundPainterStrategy strategy =
+				new BufferedImageBackgroundPainterStrategy(this);
+			strategy.setImage(image);
+			backgroundPainter = strategy;
+		}
+		setOpaque(false);
+		firePropertyChange(BACKGROUND_IMAGE_PROPERTY, oldBG, image);
+		repaint();
+	}
+
+
+	/**
+	 * Makes the background into this <code>Object</code>.
+	 *
+	 * @param newBackground The <code>java.awt.Color</code> or
+	 *        <code>java.awt.Image</code> object. If <code>newBackground</code>
+	 *        is not either of these, the background is set to plain white.
+	 */
+	public void setBackgroundObject(Object newBackground) {
+		if (newBackground instanceof Color) {
+			setBackground((Color)newBackground);
+		}
+		else if (newBackground instanceof Image) {
+			setBackgroundImage((Image)newBackground);
+		}
+		else {
+			setBackground(Color.WHITE);
+		}
+
+	}
+
+
+	/*
+	 * TODO: Figure out why RTextArea doesn't work with RTL (e.g. Arabic)
+	 * and fix it!
+	 */
+//	public void setComponentOrientation(ComponentOrientation o) {
+//		if (!o.isLeftToRight()) {
+//			o = ComponentOrientation.LEFT_TO_RIGHT;
+//		}
+//		super.setComponentOrientation(o);
+//	}
+
+
+	/**
+	 * Sets the color to use to highlight the current line.  Note that if
+	 * highlighting the current line is turned off, you will not be able to
+	 * see this highlight.  This method fires a property change of type
+	 * {@link #CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY}.
+	 *
+	 * @param color The color to use to highlight the current line.
+	 * @throws NullPointerException if <code>color</code> is <code>null</code>.
+	 * @see #getHighlightCurrentLine()
+	 * @see #setHighlightCurrentLine(boolean)
+	 * @see #getCurrentLineHighlightColor
+	 */
+	public void setCurrentLineHighlightColor(Color color) {
+		if (color==null)
+			throw new NullPointerException();
+		if (!color.equals(currentLineColor)) {
+			Color old = currentLineColor;
+			currentLineColor = color;
+			firePropertyChange(CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY,
+							old, color);
+		}
+	}
+
+
+	/**
+	 * Sets whether the current line highlight should have a "fade" effect.
+	 * This method fires a property change event of type
+	 * <code>CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY</code>.
+	 *
+	 * @param fade Whether the fade effect should be enabled.
+	 * @see #getFadeCurrentLineHighlight
+	 */
+	public void setFadeCurrentLineHighlight(boolean fade) {
+		if (fade!=fadeCurrentLineHighlight) {
+			fadeCurrentLineHighlight = fade;
+			if (getHighlightCurrentLine())
+				forceCurrentLineHighlightRepaint();
+			firePropertyChange(CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY,
+							!fade, fade);
+		}
+	}
+
+
+	/**
+	 * Sets the font for this text area.  This is overridden only so that we
+	 * can update the size of the "current line highlight" and the location of
+	 * the "margin line," if necessary.
+	 *
+	 * @param font The font to use for this text component.
+	 */
+	public void setFont(Font font) {
+		super.setFont(font);
+		updateMarginLineX();
+		if (highlightCurrentLine)
+			possiblyUpdateCurrentLineHighlightLocation();
+	}
+
+
+	/**
+	 * Sets whether or not the current line is highlighted.  This method
+	 * fires a property change of type {@link #HIGHLIGHT_CURRENT_LINE_PROPERTY}.
+	 *
+	 * @param highlight Whether or not to highlight the current line.
+	 * @see #getHighlightCurrentLine()
+	 * @see #getCurrentLineHighlightColor
+	 * @see #setCurrentLineHighlightColor
+	 */
+	public void setHighlightCurrentLine(boolean highlight) {
+		if (highlight!=highlightCurrentLine) {
+			highlightCurrentLine = highlight;
+			firePropertyChange(HIGHLIGHT_CURRENT_LINE_PROPERTY,
+							!highlight, highlight);
+			repaint(); // Repaint entire width of line.
+		}
+	}
+
+
+	/**
+	 * Sets whether or not word wrap is enabled.  This is overridden so that
+	 * the "current line highlight" gets updated if it needs to be.
+	 *
+	 * @param wrap Whether or not word wrap should be enabled.
+	 */
+	public void setLineWrap(boolean wrap) {
+		super.setLineWrap(wrap);
+		forceCurrentLineHighlightRepaint();
+	}
+
+
+	/**
+	 * Sets the color used to paint the margin line.
+	 *
+	 * @param color The new margin line color.
+	 * @see #getDefaultMarginLineColor()
+	 * @see #getMarginLineColor()
+	 */
+	public void setMarginLineColor(Color color) {
+		marginLineColor = color;
+		if (marginLineEnabled) {
+			Rectangle visibleRect = getVisibleRect();
+			repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+		}
+	}
+
+
+	/**
+	 * Enables or disables the margin line.
+	 *
+	 * @param enabled Whether or not the margin line should be enabled.
+	 * @see #isMarginLineEnabled
+	 */
+	public void setMarginLineEnabled(boolean enabled) {
+		if (enabled!=marginLineEnabled) {
+			marginLineEnabled = enabled;
+			if (marginLineEnabled) {
+				Rectangle visibleRect = getVisibleRect();
+				repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+			}
+		}
+	}
+
+
+	/**
+	 * Sets the number of 'm' widths the margin line is over.
+	 *
+	 * @param size The margin size.
+	 * #see #getDefaultMarginLinePosition
+	 * @see #getMarginLinePosition
+	 */
+	public void setMarginLinePosition(int size) {
+		marginSizeInChars = size;
+		if (marginLineEnabled) {
+			Rectangle visibleRect = getVisibleRect();
+			repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+			updateMarginLineX();
+			repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+		}
+	}
+
+
+	/**
+	 * Sets whether the edges of selections are rounded in this text area.
+	 * This method fires a property change of type
+	 * {@link #ROUNDED_SELECTION_PROPERTY}.
+	 *
+	 * @param rounded Whether selection edges should be rounded.
+	 * @see #getRoundedSelectionEdges()
+	 */
+	public void setRoundedSelectionEdges(boolean rounded) {
+		if (roundedSelectionEdges!=rounded) {
+			roundedSelectionEdges = rounded;
+			ConfigurableCaret cc = (ConfigurableCaret)getCaret();
+			cc.setRoundedSelectionEdges(rounded);
+			if (cc.getDot()!=cc.getMark()) { // ie, if there is a selection
+				repaint();
+			}
+			firePropertyChange(ROUNDED_SELECTION_PROPERTY, !rounded,
+											rounded);
+		}
+	}
+
+
+	/**
+	 * Sets the UI for this <code>RTextArea</code>.  Note that, for instances
+	 * of <code>RTextArea</code>, <code>setUI</code> only updates the popup
+	 * menu; this is because <code>RTextArea</code>s' look and feels are
+	 * independent of the Java Look and Feel.  This method is here so
+	 * subclasses can set a UI (subclass of <code>RTextAreaUI</code>) if they
+	 * have to.
+	 *
+	 * @param ui The new UI.
+	 * @see #setUI
+	 */
+	protected void setRTextAreaUI(RTextAreaUI ui) {
+
+		super.setUI(ui);
+
+		// Workaround as setUI makes the text area opaque, even if we don't
+		// want it to be.
+		setOpaque(getBackgroundObject() instanceof Color);
+
+	}
+
+
+	/**
+	 * Changes whether or not tabs should be emulated with spaces (i.e., soft
+	 * tabs).  Note that this affects all tabs inserted AFTER this call, not
+	 * tabs already in the document.  For that, see
+	 * {@link #convertTabsToSpaces} and {@link #convertSpacesToTabs}.
+	 *
+	 * @param areEmulated Whether or not tabs should be emulated with spaces.
+	 * @see #convertSpacesToTabs
+	 * @see #convertTabsToSpaces
+	 * @see #getTabsEmulated
+	 */
+	public void setTabsEmulated(boolean areEmulated) {
+		tabsEmulatedWithSpaces = areEmulated;
+	}
+
+
+	/**
+	 * Workaround, since in JDK1.4 it appears that <code>setTabSize()</code>
+	 * doesn't work for a <code>JTextArea</code> unless you use the constructor
+	 * specifying the number of rows and columns...<p>
+	 * Sets the number of characters to expand tabs to. This will be multiplied
+	 * by the maximum advance for variable width fonts. A PropertyChange event
+	 * ("tabSize") is fired when the tab size changes.
+	 *
+	 * @param size Number of characters to expand to.
+	 */
+	public void setTabSize(int size) {
+		super.setTabSize(size);
+		boolean b = getLineWrap();
+		setLineWrap(!b);
+		setLineWrap(b);
+	}
+
+
+	/**
+	 * This is here so subclasses such as <code>RSyntaxTextArea</code> that
+	 * have multiple fonts can define exactly what it means, for example, for
+	 * the margin line to be "80 characters" over.
+	 */
+	protected void updateMarginLineX() {
+		marginLineX = getFontMetrics(getFont()).charWidth('m') *
+												marginSizeInChars;
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.
+	 *
+	 * @param line The line number.
+	 * @return The y-coordinate of the top of the line, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>line</code> isn't a valid line
+	 *         number for this document.
+	 */
+	public int yForLine(int line) throws BadLocationException {
+		return ((RTextAreaUI)getUI()).yForLine(line);
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the line containing an offset.
+	 *
+	 * @param offs The offset info the document.
+	 * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>offs</code> isn't a valid offset
+	 *         into the document.
+	 */
+	public int yForLineContaining(int offs) throws BadLocationException {
+		return ((RTextAreaUI)getUI()).yForLineContaining(offs);
+	}
+
+
+	protected class RTAMouseListener extends CaretEvent implements
+					MouseListener, MouseMotionListener, FocusListener {
+
+		RTAMouseListener(RTextAreaBase textArea) {
+			super(textArea);
+		}
+
+		public void focusGained(FocusEvent e) {}
+		public void focusLost(FocusEvent e) {}
+		public void mouseDragged(MouseEvent e) {}
+		public void mouseMoved(MouseEvent e) {}
+		public void mouseClicked(MouseEvent e) {}
+		public void mousePressed(MouseEvent e) {}
+		public void mouseReleased(MouseEvent e) {}
+		public void mouseEntered(MouseEvent e) {}
+		public void mouseExited(MouseEvent e) {}
+
+		public int getDot() {
+			return dot;
+		}
+
+		public int getMark() {
+			return mark;
+		}
+
+		protected int dot;
+		protected int mark;
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaEditorKit.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaEditorKit.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaEditorKit.java	(revision 25584)
@@ -0,0 +1,2574 @@
+/*
+ * 08/13/2004
+ *
+ * RTextAreaEditorKit.java - The editor kit used by RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.text.BreakIterator;
+import java.text.DateFormat;
+import java.util.Date;
+import javax.swing.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * An extension of <code>DefaultEditorKit</code> that adds functionality found
+ * in <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+// FIXME:  Replace Utilities calls with custom versions (in RSyntaxUtilities) to
+// cut down on all of the modelToViews, as each call causes
+// a getTokenList => expensive!
+public class RTextAreaEditorKit extends DefaultEditorKit {
+
+	/**
+	 * The name of the action that begins recording a macro.
+	 */
+	public static final String rtaBeginRecordingMacroAction	= "RTA.BeginRecordingMacroAction";
+
+	/**
+	 * The name of the action to decrease the font size.
+	 */
+	public static final String rtaDecreaseFontSizeAction		= "RTA.DecreaseFontSizeAction";
+
+	/**
+	 * The name of the action that deletes the current line.
+	 */
+	public static final String rtaDeleteLineAction			= "RTA.DeleteLineAction";
+
+	/**
+	 * The name of the action to delete the word before the caret.
+	 */
+	public static final String rtaDeletePrevWordAction		= "RTA.DeletePrevWordAction";
+
+	/**
+	 * The name of the action taken to delete the remainder of the line (from
+	 * the caret position to the end of the line).
+	 */
+	public static final String rtaDeleteRestOfLineAction		= "RTA.DeleteRestOfLineAction";
+
+	/**
+	 * The name of the action that completes the word at the caret position
+	 * with the last word in the document that starts with the text up to the
+	 * caret.
+	 */
+	public static final String rtaDumbCompleteWordAction		= "RTA.DumbCompleteWordAction";
+
+	/**
+	 * The name of the action that ends recording a macro.
+	 */
+	public static final String rtaEndRecordingMacroAction		= "RTA.EndRecordingMacroAction";
+
+	/**
+	 * The name of the action to increase the font size.
+	 */
+	public static final String rtaIncreaseFontSizeAction		= "RTA.IncreaseFontSizeAction";
+
+	/**
+	 * The name of the action that inverts the case of the current selection.
+	 */
+	public static final String rtaInvertSelectionCaseAction	= "RTA.InvertCaseAction";
+
+	/**
+	 * The name of the action to join two lines.
+	 */
+	public static final String rtaJoinLinesAction			= "RTA.JoinLinesAction";
+
+	/**
+	 * Action to move a line down.
+	 */
+	public static final String rtaLineDownAction				= "RTA.LineDownAction";
+
+	/**
+	 * Action to move a line up.
+	 */
+	public static final String rtaLineUpAction				= "RTA.LineUpAction";
+
+	/**
+	 * The name of the action to make the current selection lower-case.
+	 */
+	public static final String rtaLowerSelectionCaseAction		= "RTA.LowerCaseAction";
+
+	/**
+	 * Action to select the next occurrence of the selected text.
+	 */
+	public static final String rtaNextOccurrenceAction		= "RTA.NextOccurrenceAction";
+
+	/**
+     * Action to select the previous occurrence of the selected text.
+	 */
+	public static final String rtaPrevOccurrenceAction		= "RTA.PrevOccurrenceAction";
+
+	/**
+	 * Action to jump to the next bookmark.
+	 */
+	public static final String rtaNextBookmarkAction		= "RTA.NextBookmarkAction";
+
+	/**
+	 * Action to jump to the previous bookmark.
+	 */
+	public static final String rtaPrevBookmarkAction		= "RTA.PrevBookmarkAction";
+
+	/**
+	 * The name of the action that "plays back" the last macro.
+	 */
+	public static final String rtaPlaybackLastMacroAction		= "RTA.PlaybackLastMacroAction";
+
+	/**
+	 * The name of the action for "redoing" the last action undone.
+	 */
+	public static final String rtaRedoAction				= "RTA.RedoAction";
+
+	/**
+	 * The name of the action to scroll the text area down one line
+	 * without changing the caret's position.
+	 */
+	public static final String rtaScrollDownAction			= "RTA.ScrollDownAction";
+
+	/**
+	 * The name of the action to scroll the text area up one line
+	 * without changing the caret's position.
+	 */
+	public static final String rtaScrollUpAction				= "RTA.ScrollUpAction";
+
+	/**
+	 * The name of the action for "paging up" with the selection.
+	 */
+	public static final String rtaSelectionPageUpAction		= "RTA.SelectionPageUpAction";
+
+	/**
+	 * The name of the action for "paging down" with the selection.
+	 */
+	public static final String rtaSelectionPageDownAction		= "RTA.SelectionPageDownAction";
+
+	/**
+	 * The name of the action for "paging left" with the selection.
+	 */
+	public static final String rtaSelectionPageLeftAction		= "RTA.SelectionPageLeftAction";
+
+	/**
+	 * The name of the action for "paging right" with the selection.
+	 */
+	public static final String rtaSelectionPageRightAction		= "RTA.SelectionPageRightAction";
+
+	/**
+	 * The name of the action for inserting a time/date stamp.
+	 */
+	public static final String rtaTimeDateAction				= "RTA.TimeDateAction";
+
+	/**
+	 * Toggles whether the current line has a bookmark, if this text area
+	 * is in an {@link RTextScrollPane}.
+	 */
+	public static final String rtaToggleBookmarkAction		= "RTA.ToggleBookmarkAction";
+
+	/**
+	 * The name of the action taken when the user hits the Insert key (thus
+	 * toggling between insert and overwrite modes).
+	 */
+	public static final String rtaToggleTextModeAction		= "RTA.ToggleTextModeAction";
+
+	/**
+	 * The name of the action for "undoing" the last action done.
+	 */
+	public static final String rtaUndoAction				= "RTA.UndoAction";
+
+	/**
+	 * The name of the action for unselecting any selected text in the text
+	 * area.
+	 */
+	public static final String rtaUnselectAction				= "RTA.UnselectAction";
+
+	/**
+	 * The name of the action for making the current selection upper-case.
+	 */
+	public static final String rtaUpperSelectionCaseAction		= "RTA.UpperCaseAction";
+
+	/**
+	 * The actions that <code>RTextAreaEditorKit</code> adds to those of
+	 * the default editor kit.
+	 */
+	private static final RecordableTextAction[] defaultActions = {
+		new BeginAction(beginAction, false), 
+		new BeginAction(selectionBeginAction, true), 
+		new BeginLineAction(beginLineAction, false),  
+		new BeginLineAction(selectionBeginLineAction, true),  
+		new BeginRecordingMacroAction(),
+		new BeginWordAction(beginWordAction, false),
+		new BeginWordAction(selectionBeginWordAction, true),
+		new CopyAction(),
+		new CutAction(),
+		new DefaultKeyTypedAction(),
+		new DeleteLineAction(),
+		new DeleteNextCharAction(),
+		new DeletePrevCharAction(),
+		new DeletePrevWordAction(),
+		new DeleteRestOfLineAction(),
+		new DumbCompleteWordAction(),
+		new EndAction(endAction, false),
+		new EndAction(selectionEndAction, true),
+		new EndLineAction(endLineAction, false),
+		new EndLineAction(selectionEndLineAction, true),
+		new EndRecordingMacroAction(),
+		new EndWordAction(endWordAction, false),
+		new EndWordAction(endWordAction, true),
+		new InsertBreakAction(),
+		new InsertContentAction(),
+		new InsertTabAction(),
+		new InvertSelectionCaseAction(),
+		new JoinLinesAction(),
+		new LowerSelectionCaseAction(),
+		new LineMoveAction(rtaLineUpAction, -1),
+		new LineMoveAction(rtaLineDownAction, 1),
+		new NextBookmarkAction(rtaNextBookmarkAction, true),
+		new NextBookmarkAction(rtaPrevBookmarkAction, false),
+		new NextVisualPositionAction(forwardAction, false, SwingConstants.EAST),
+		new NextVisualPositionAction(backwardAction, false, SwingConstants.WEST),
+		new NextVisualPositionAction(selectionForwardAction, true, SwingConstants.EAST),
+		new NextVisualPositionAction(selectionBackwardAction, true, SwingConstants.WEST),
+		new NextVisualPositionAction(upAction, false, SwingConstants.NORTH),
+		new NextVisualPositionAction(downAction, false, SwingConstants.SOUTH),
+		new NextVisualPositionAction(selectionUpAction, true, SwingConstants.NORTH),
+		new NextVisualPositionAction(selectionDownAction, true, SwingConstants.SOUTH),
+        new NextOccurrenceAction(rtaNextOccurrenceAction),
+        new PreviousOccurrenceAction(rtaPrevOccurrenceAction),
+		new NextWordAction(nextWordAction, false),
+		new NextWordAction(selectionNextWordAction, true),
+		new PageAction(rtaSelectionPageLeftAction, true, true), 
+		new PageAction(rtaSelectionPageRightAction, false, true),
+		new PasteAction(),
+		new PlaybackLastMacroAction(),
+		new PreviousWordAction(previousWordAction, false),  
+		new PreviousWordAction(selectionPreviousWordAction, true),
+		new RedoAction(),
+		new ScrollAction(rtaScrollUpAction, -1),
+		new ScrollAction(rtaScrollDownAction, 1),
+		new SelectAllAction(),
+		new SelectLineAction(),
+		new SelectWordAction(),
+		new SetReadOnlyAction(),
+		new SetWritableAction(),
+		new ToggleBookmarkAction(),
+		new ToggleTextModeAction(),
+		new UndoAction(),
+		new UnselectAction(),
+		new UpperSelectionCaseAction(),
+		new VerticalPageAction(pageUpAction, -1, false), 
+		new VerticalPageAction(pageDownAction, 1, false),
+		new VerticalPageAction(rtaSelectionPageUpAction, -1, true), 
+		new VerticalPageAction(rtaSelectionPageDownAction, 1, true)
+	};
+
+	/**
+	 * The amount of characters read at a time when reading a file.
+	 */
+	private static final int READBUFFER_SIZE	= 32768;
+
+
+	/**
+	 * Constructor.
+	 */
+	public RTextAreaEditorKit() {
+		super();
+	}
+
+
+	/**
+	 * Creates an icon row header to use in the gutter for a text area.
+	 *
+	 * @param textArea The text area.
+	 * @return The icon row header.
+	 */
+	public IconRowHeader createIconRowHeader(RTextArea textArea) {
+		return new IconRowHeader(textArea);
+	}
+
+
+	/**
+	 * Creates a line number list to use in the gutter for a text area.
+	 *
+	 * @param textArea The text area.
+	 * @return The line number list.
+	 */
+	public LineNumberList createLineNumberList(RTextArea textArea) {
+		return new LineNumberList(textArea);
+	}
+
+
+	/**
+	 * Fetches the set of commands that can be used
+	 * on a text component that is using a model and
+	 * view produced by this kit.
+	 *
+	 * @return the command list
+	 */ 
+	public Action[] getActions() {
+		return defaultActions;
+	}
+
+
+	/**
+	 * Inserts content from the given stream, which will be 
+	 * treated as plain text.  This method is overridden merely
+	 * so we can increase the number of characters read at a time.
+	 * 
+	 * @param in  The stream to read from
+	 * @param doc The destination for the insertion.
+	 * @param pos The location in the document to place the
+	 *   content >= 0.
+	 * @exception IOException on any I/O error
+	 * @exception BadLocationException if pos represents an invalid
+	 *   location within the document.
+	*/
+	public void read(Reader in, Document doc, int pos) 
+				throws IOException, BadLocationException {
+
+		char[] buff = new char[READBUFFER_SIZE];
+		int nch;
+		boolean lastWasCR = false;
+		boolean isCRLF = false;
+		boolean isCR = false;
+		int last;
+		boolean wasEmpty = (doc.getLength() == 0);
+
+		// Read in a block at a time, mapping \r\n to \n, as well as single
+		// \r's to \n's. If a \r\n is encountered, \r\n will be set as the
+		// newline string for the document, if \r is encountered it will
+		// be set as the newline character, otherwise the newline property
+		// for the document will be removed.
+		while ((nch = in.read(buff, 0, buff.length)) != -1) {
+			last = 0;
+			for (int counter = 0; counter < nch; counter++) {
+				switch (buff[counter]) {
+					case '\r':
+						if (lastWasCR) {
+							isCR = true;
+							if (counter == 0) {
+								doc.insertString(pos, "\n", null);
+								pos++;
+							}
+							else {
+								buff[counter - 1] = '\n';
+							}
+						}
+						else {
+							lastWasCR = true;
+						}
+						break;
+					case '\n':
+						if (lastWasCR) {
+							if (counter > (last + 1)) {
+								doc.insertString(pos, new String(buff, last,
+												counter - last - 1), null);
+								pos += (counter - last - 1);
+							}
+							// else nothing to do, can skip \r, next write will
+							// write \n
+							lastWasCR = false;
+							last = counter;
+							isCRLF = true;
+						}
+						break;
+					default:
+						if (lastWasCR) {
+							isCR = true;
+							if (counter == 0) {
+								doc.insertString(pos, "\n", null);
+								pos++;
+							}
+							else {
+								buff[counter - 1] = '\n';
+							}
+							lastWasCR = false;
+						}
+						break;
+				} // End of switch (buff[counter]).
+			} // End of for (int counter = 0; counter < nch; counter++).
+
+			if (last < nch) {
+				if(lastWasCR) {
+					if (last < (nch - 1)) {
+						doc.insertString(pos, new String(buff, last,
+										nch - last - 1), null);
+						pos += (nch - last - 1);
+					}
+				}
+				else {
+					doc.insertString(pos, new String(buff, last,
+									nch - last), null);
+					pos += (nch - last);
+				}
+			}
+
+		} // End of while ((nch = in.read(buff, 0, buff.length)) != -1).
+
+		if (lastWasCR) {
+			doc.insertString(pos, "\n", null);
+			isCR = true;
+		}
+
+		if (wasEmpty) {
+			if (isCRLF) {
+				doc.putProperty(EndOfLineStringProperty, "\r\n");
+			}
+			else if (isCR) {
+				doc.putProperty(EndOfLineStringProperty, "\r");
+			}
+			else {
+				doc.putProperty(EndOfLineStringProperty, "\n");
+			}
+		}
+
+	}
+
+
+	/**
+	 * Creates a beep.
+	 */
+	public static class BeepAction extends RecordableTextAction {
+
+		public BeepAction() {
+			super(beepAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+		}
+
+		public final String getMacroID() {
+			return beepAction;
+		}
+
+	}
+
+
+	/**
+	 * Moves the caret to the beginning of the document.
+	 */
+	public static class BeginAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public BeginAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (select)
+				textArea.moveCaretPosition(0);
+			else
+				textArea.setCaretPosition(0);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Toggles the position of the caret between the beginning of the line,
+	 * and the first non-whitespace character on the line.
+	 */
+	public static class BeginLineAction extends RecordableTextAction {
+
+ 		private Segment currentLine = new Segment(); // For speed.
+ 		private boolean select;
+
+		public BeginLineAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int newPos = 0;
+
+			try {
+
+				// Is line wrap enabled?
+				if (textArea.getLineWrap()) {
+					int offs = textArea.getCaretPosition();
+					// TODO:  Replace Utilities call with custom version
+					// to cut down on all of the modelToViews, as each call
+					// causes TokenList => expensive!
+					int begOffs = Utilities.getRowStart(textArea, offs);
+					// TODO: line wrap doesn't currently toggle between
+					// the first non-whitespace char and the actual start
+					// of the line line the no-line-wrap version does.
+					newPos = begOffs;
+				}
+
+				// No line wrap - optimized for performance!
+				else {
+
+					// We use the elements instead of calling
+					// getLineOfOffset(), etc. to speed things up just a
+					// tad (i.e. micro-optimize).
+					int caretPosition = textArea.getCaretPosition();
+					Document document = textArea.getDocument();
+					Element map = document.getDefaultRootElement();
+					int currentLineNum = map.getElementIndex(caretPosition);
+					Element currentLineElement = map.getElement(currentLineNum);
+					int currentLineStart = currentLineElement.getStartOffset();
+					int currentLineEnd = currentLineElement.getEndOffset();
+					int count = currentLineEnd - currentLineStart;
+					if (count>0) { // If there are chars in the line...
+						document.getText(currentLineStart, count, currentLine);
+						int firstNonWhitespace = getFirstNonWhitespacePos();
+						firstNonWhitespace = currentLineStart +
+								(firstNonWhitespace - currentLine.offset);
+						if (caretPosition!=firstNonWhitespace) {
+							newPos = firstNonWhitespace;
+						}
+						else {
+							newPos = currentLineStart;
+						}
+					}
+					else { // Empty line (at end of the document only).
+						newPos = currentLineStart;
+					}
+
+				}
+
+				if (select) {
+					textArea.moveCaretPosition(newPos);
+				}
+				else {
+					textArea.setCaretPosition(newPos);
+				}
+				//e.consume();
+
+			} catch (BadLocationException ble) {
+				/* Shouldn't ever happen. */
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				ble.printStackTrace();
+			}
+
+		}
+
+		private final int getFirstNonWhitespacePos() {
+			int offset = currentLine.offset;
+			int end = offset + currentLine.count - 1;
+			int pos = offset;
+			char[] array = currentLine.array;
+			char currentChar = array[pos];
+			while ((currentChar=='\t' || currentChar==' ') && (++pos<end))
+				currentChar = array[pos];
+			return pos;
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that begins recording a macro.
+	 */
+	public static class BeginRecordingMacroAction extends RecordableTextAction {
+
+ 
+		public BeginRecordingMacroAction() {
+			super(rtaBeginRecordingMacroAction);
+		}
+
+		public BeginRecordingMacroAction(String name, Icon icon,
+					String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RTextArea.beginRecordingMacro();
+		}
+
+		public boolean isRecordable() {
+			return false; // Never record the recording of a macro!
+		}
+
+		public final String getMacroID() {
+			return rtaBeginRecordingMacroAction;
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the beginning of the word.
+	 */
+	protected static class BeginWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		protected BeginWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			try {
+				int offs = textArea.getCaretPosition();
+				int begOffs = getWordStart(textArea, offs);
+				if (select)
+					textArea.moveCaretPosition(begOffs);
+				else
+					textArea.setCaretPosition(begOffs);
+			} catch (BadLocationException ble) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getWordStart(RTextArea textArea, int offs)
+										throws BadLocationException {
+			return Utilities.getWordStart(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Action for copying text.
+	 */
+	public static class CopyAction extends RecordableTextAction {
+
+ 
+		public CopyAction() {
+			super(DefaultEditorKit.copyAction);
+		}
+
+		public CopyAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.copy();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.copyAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for cutting text.
+	 */
+	public static class CutAction extends RecordableTextAction {
+
+		public CutAction() {
+			super(DefaultEditorKit.cutAction);
+		}
+
+		public CutAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.cut();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.cutAction;
+		}
+
+	}
+
+
+	/**
+	 * Action for decreasing the font size.
+	 */
+	public static class DecreaseFontSizeAction extends RecordableTextAction {
+
+ 
+		protected float decreaseAmount;
+
+		protected static final float MINIMUM_SIZE	= 2.0f;
+
+		public DecreaseFontSizeAction() {
+			super(rtaDecreaseFontSizeAction);
+			initialize();
+		}
+
+		public DecreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+			initialize();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Font font = textArea.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize - decreaseAmount;
+			if (newSize>=MINIMUM_SIZE) {
+				// Shrink by decreaseAmount.
+				font = font.deriveFont(newSize);
+				textArea.setFont(font);
+			}
+			else if (oldSize>MINIMUM_SIZE) {
+				// Can't shrink by full decreaseAmount, but can shrink a
+				// little bit.
+				font = font.deriveFont(MINIMUM_SIZE);
+				textArea.setFont(font);
+			}
+			else {
+				// Our font size must be at or below MINIMUM_SIZE.
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return rtaDecreaseFontSizeAction;
+		}
+
+		protected void initialize() {
+			decreaseAmount = 1.0f;
+		}
+
+	}
+
+
+	/**
+	 * The action to use when no actions in the input/action map meet the key
+	 * pressed.  This is actually called from the keymap I believe.
+	 */
+	public static class DefaultKeyTypedAction extends RecordableTextAction {
+
+		private Action delegate;
+
+		public DefaultKeyTypedAction() {
+			super(DefaultEditorKit.defaultKeyTypedAction, null, null, null,
+					null);
+			delegate = new DefaultEditorKit.DefaultKeyTypedAction();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			// DefaultKeyTypedAction *is* different across different JVM's
+			// (at least the OSX implementation must be different - Alt+Numbers
+			// inputs symbols such as '[', '{', etc., which is a *required*
+			// feature on MacBooks running with non-English input, such as
+			// German or Swedish Pro).  So we can't just copy the
+			// implementation, we must delegate to it.
+			delegate.actionPerformed(e);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.defaultKeyTypedAction;
+		}
+
+	}
+
+
+	/**
+	 * Deletes the current line(s).
+	 */
+	public static class DeleteLineAction extends RecordableTextAction {
+
+		public DeleteLineAction() {
+			super(RTextAreaEditorKit.rtaDeleteLineAction, null, null, null,
+						null);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+
+			int selStart = textArea.getSelectionStart();
+			int selEnd   = textArea.getSelectionEnd();
+
+			try {
+
+				int line1     = textArea.getLineOfOffset(selStart);
+				int startOffs = textArea.getLineStartOffset(line1);
+				int line2     = textArea.getLineOfOffset(selEnd);
+				int endOffs   = textArea.getLineEndOffset(line2);
+
+				// Don't remove the last line if no actual chars are selected
+				if (line2>line1) {
+					if (selEnd==textArea.getLineStartOffset(line2)) {
+						endOffs = selEnd;
+					}
+				}
+
+				textArea.replaceRange(null, startOffs, endOffs);
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace(); // Never happens
+			}
+
+		}
+
+		public final String getMacroID() {
+			return RTextAreaEditorKit.rtaDeleteLineAction;
+		}
+
+	}
+
+
+	/**
+	 * Deletes the character of content that follows the current caret
+	 * position.
+	 */
+	public static class DeleteNextCharAction extends RecordableTextAction {
+
+		public DeleteNextCharAction() {
+			super(DefaultEditorKit.deleteNextCharAction, null, null,
+												null, null);
+		}
+
+		public DeleteNextCharAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			boolean beep = true;
+			if ((textArea != null) && (textArea.isEditable())) {
+				try {
+					Document doc = textArea.getDocument();
+					Caret caret = textArea.getCaret();
+					int dot = caret.getDot();
+					int mark = caret.getMark();
+					if (dot != mark) {
+						doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
+						beep = false;
+					}
+					else if (dot < doc.getLength()) {
+						int delChars = 1;
+						if (dot < doc.getLength() - 1) {
+							String dotChars = doc.getText(dot, 2);
+							char c0 = dotChars.charAt(0);
+							char c1 = dotChars.charAt(1);
+							if (c0 >= '\uD800' && c0 <= '\uDBFF' &&
+								c1 >= '\uDC00' && c1 <= '\uDFFF') {
+								delChars = 2;
+							}
+						}
+						doc.remove(dot, delChars);
+						beep = false;
+					}
+				} catch (BadLocationException bl) {
+				}
+			}
+
+			if (beep)
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+			textArea.requestFocusInWindow();
+
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.deleteNextCharAction;
+		}
+
+	}
+
+
+	/**
+	 * Deletes the character of content that precedes the current caret
+	 * position.
+	 */
+	public static class DeletePrevCharAction extends RecordableTextAction {
+ 
+		public DeletePrevCharAction() {
+			super(deletePrevCharAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			boolean beep = true;
+			if ((textArea != null) && (textArea.isEditable())) {
+				try {
+					Document doc = textArea.getDocument();
+					Caret caret = textArea.getCaret();
+					int dot = caret.getDot();
+					int mark = caret.getMark();
+					if (dot != mark) {
+						doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
+						beep = false;
+					}
+					else if (dot > 0) {
+						int delChars = 1;
+						if (dot > 1) {
+							String dotChars = doc.getText(dot - 2, 2);
+							char c0 = dotChars.charAt(0);
+							char c1 = dotChars.charAt(1);
+							if (c0 >= '\uD800' && c0 <= '\uDBFF' &&
+								c1 >= '\uDC00' && c1 <= '\uDFFF') {
+								delChars = 2;
+							}
+						}
+						doc.remove(dot - delChars, delChars);
+						beep = false;
+					}
+				} catch (BadLocationException bl) {
+				}
+			}
+
+			if (beep)
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.deletePrevCharAction;
+		}
+
+	}
+
+
+	/**
+	 * Action that deletes the previous word in the text area.
+	 */
+	public static class DeletePrevWordAction extends RecordableTextAction {
+
+		public DeletePrevWordAction() {
+			super(rtaDeletePrevWordAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			try {
+				int end = textArea.getSelectionStart();
+				int start = getPreviousWordStart(textArea, end);
+				if (end>start) {
+					textArea.getDocument().remove(start, end-start);
+				}
+			} catch (BadLocationException ex) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public String getMacroID() {
+			return rtaDeletePrevWordAction;
+		}
+
+		/**
+		 * Returns the starting offset to delete.  Exists so subclasses can
+		 * override.
+		 */
+		protected int getPreviousWordStart(RTextArea textArea, int end)
+				throws BadLocationException {
+			return Utilities.getPreviousWord(textArea, end);
+		}
+
+	}
+
+
+	/**
+	 * Action that deletes all text from the caret position to the end of the
+	 * caret's line.
+	 */
+	public static class DeleteRestOfLineAction extends RecordableTextAction {
+
+ 
+		public DeleteRestOfLineAction() {
+			super(rtaDeleteRestOfLineAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			try {
+
+				// We use the elements instead of calling getLineOfOffset(),
+				// etc. to speed things up just a tad (i.e. micro-optimize).
+				Document document = textArea.getDocument();
+				int caretPosition = textArea.getCaretPosition();
+				Element map = document.getDefaultRootElement();
+				int currentLineNum = map.getElementIndex(caretPosition);
+				Element currentLineElement = map.getElement(currentLineNum);
+				// Always take -1 as we don't want to remove the newline.
+				int currentLineEnd = currentLineElement.getEndOffset()-1;
+				if (caretPosition<currentLineEnd) {
+					document.remove(caretPosition,
+									currentLineEnd-caretPosition);
+				}
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			}
+
+		}
+
+		public final String getMacroID() {
+			return rtaDeleteRestOfLineAction;
+		}
+
+	}
+
+
+	/**
+	 * Finds the most recent word in the document that matches the "word" up
+	 * to the current caret position, and auto-completes the rest.  Repeatedly
+	 * calling this action at the same location in the document goes one
+	 * match back each time it is called.
+	 */
+	public static class DumbCompleteWordAction extends RecordableTextAction {
+
+		private int lastWordStart;
+		private int lastDot;
+		private int searchOffs;
+		private String lastPrefix;
+
+		public DumbCompleteWordAction() {
+			super(rtaDumbCompleteWordAction);
+			lastWordStart = searchOffs = lastDot = -1;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				return;
+			}
+
+			try {
+
+				int dot = textArea.getCaretPosition();
+				if (dot == 0) {
+					return;
+				}
+
+				int curWordStart = Utilities.getWordStart(textArea, dot - 1);
+
+				if (lastWordStart!=curWordStart || dot!=lastDot) {
+					lastPrefix = textArea.getText(curWordStart,dot-curWordStart);
+					// Utilities.getWordStart() treats spans of whitespace and
+					// single non-letter chars as "words."
+					if (lastPrefix.length()==0 ||
+							!Character.isLetter(lastPrefix.charAt(lastPrefix.length()-1))) {
+						UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+						return;
+					}
+					lastWordStart = dot - lastPrefix.length();
+					searchOffs = lastWordStart;
+				}
+
+				while (searchOffs > 0) {
+					int wordStart = Utilities.getPreviousWord(textArea,
+							searchOffs);
+					if (wordStart==BreakIterator.DONE) {
+						UIManager.getLookAndFeel().provideErrorFeedback(
+								textArea);
+						break;
+					}
+					int end = Utilities.getWordEnd(textArea, wordStart);
+					String word = textArea.getText(wordStart, end - wordStart);
+					searchOffs = wordStart;
+					if (word.startsWith(lastPrefix)) {
+						textArea.replaceRange(word, lastWordStart, dot);
+						lastDot = textArea.getCaretPosition(); // Maybe shifted
+						break;
+					}
+				}
+
+			} catch (BadLocationException ble) { // Never happens
+				ble.printStackTrace();
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Moves the caret to the end of the document.
+	 */
+	public static class EndAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public EndAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			int dot = getVisibleEnd(textArea);
+			if (select)
+				textArea.moveCaretPosition(dot);
+			else
+				textArea.setCaretPosition(dot);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getVisibleEnd(RTextArea textArea) {
+			return textArea.getDocument().getLength();
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the end of the line.
+	 */
+	public static class EndLineAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public EndLineAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			int offs = textArea.getCaretPosition();
+			int endOffs = 0;
+			try {
+				if (textArea.getLineWrap()) {
+					// Must check per character, since one logical line may be
+					// many physical lines.
+					// FIXME:  Replace Utilities call with custom version to
+					// cut down on all of the modelToViews, as each call causes
+					// a getTokenList => expensive!
+					endOffs = Utilities.getRowEnd(textArea, offs);
+				}
+				else {
+					Element root = textArea.getDocument().getDefaultRootElement();
+					int line = root.getElementIndex(offs);
+					endOffs = root.getElement(line).getEndOffset() - 1;
+				}
+				if (select) {
+					textArea.moveCaretPosition(endOffs);
+				}
+				else {
+					textArea.setCaretPosition(endOffs);
+				}
+			} catch (Exception ex) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that ends recording a macro.
+	 */
+	public static class EndRecordingMacroAction extends RecordableTextAction {
+
+ 
+		public EndRecordingMacroAction() {
+			super(rtaEndRecordingMacroAction);
+		}
+
+		public EndRecordingMacroAction(String name, Icon icon,
+					String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			RTextArea.endRecordingMacro();
+		}
+
+		public final String getMacroID() {
+			return rtaEndRecordingMacroAction;
+		}
+
+		public boolean isRecordable() {
+			return false; // Never record the recording of a macro!
+		}
+
+	}
+
+
+	/**
+	 * Positions the caret at the end of the word.
+	 */
+	protected static class EndWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		protected EndWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			try {
+				int offs = textArea.getCaretPosition();
+				int endOffs = getWordEnd(textArea, offs);
+				if (select)
+					textArea.moveCaretPosition(endOffs);
+				else
+					textArea.setCaretPosition(endOffs);
+			} catch (BadLocationException ble) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getWordEnd(RTextArea textArea, int offs)
+									throws BadLocationException {
+			return Utilities.getWordEnd(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Action for increasing the font size.
+	 */
+	public static class IncreaseFontSizeAction extends RecordableTextAction {
+
+ 
+		protected float increaseAmount;
+
+		protected static final float MAXIMUM_SIZE	= 40.0f;
+
+		public IncreaseFontSizeAction() {
+			super(rtaIncreaseFontSizeAction);
+			initialize();
+		}
+
+		public IncreaseFontSizeAction(String name, Icon icon, String desc,
+							Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+			initialize();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Font font = textArea.getFont();
+			float oldSize = font.getSize2D();
+			float newSize = oldSize + increaseAmount;
+			if (newSize<=MAXIMUM_SIZE) {
+				// Grow by increaseAmount.
+				font = font.deriveFont(newSize);
+				textArea.setFont(font);
+			}
+			else if (oldSize<MAXIMUM_SIZE) {
+				// Can't grow by full increaseAmount, but can grow a
+				// little bit.
+				font = font.deriveFont(MAXIMUM_SIZE);
+				textArea.setFont(font);
+			}
+			else {
+				// Our font size must be at or bigger than MAXIMUM_SIZE.
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return rtaIncreaseFontSizeAction;
+		}
+
+		protected void initialize() {
+			increaseAmount = 1.0f;
+		}
+
+	}
+
+
+	/**
+	 * Action for when the user presses the Enter key.
+	 */
+	public static class InsertBreakAction extends RecordableTextAction {
+
+ 
+		public InsertBreakAction() {
+			super(DefaultEditorKit.insertBreakAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			textArea.replaceSelection("\n");
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.insertBreakAction;
+		}
+
+		/*
+		 * Overridden for Sun bug 4515750.  Sun fixed this in a more complicated
+		 * way, but I'm not sure why.  See BasicTextUI#getActionMap() and
+		 * BasicTextUI.TextActionWrapper.
+		 */
+		public boolean isEnabled() {
+			JTextComponent tc = getTextComponent(null);
+			return (tc==null || tc.isEditable()) ? super.isEnabled() : false;
+		}
+
+	}
+
+
+	/**
+	 * Action taken when content is to be inserted.
+	 */
+	public static class InsertContentAction extends RecordableTextAction {
+
+ 
+		public InsertContentAction() {
+			super(DefaultEditorKit.insertContentAction, null, null, null,
+					null);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String content = e.getActionCommand();
+			if (content != null)
+				textArea.replaceSelection(content);
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.insertContentAction;
+		}
+
+	}
+
+
+	/**
+	 * Places a tab character into the document. If there is a selection, it
+	 * is removed before the tab is added.
+	 */
+	public static class InsertTabAction extends RecordableTextAction {
+
+ 
+		public InsertTabAction() {
+			super(insertTabAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			textArea.replaceSelection("\t");
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.insertTabAction;
+		}
+
+	}
+
+
+	/**
+	 * Action to invert the selection's case.
+	 */
+	public static class InvertSelectionCaseAction extends RecordableTextAction {
+
+ 
+		public InvertSelectionCaseAction() {
+			super(rtaInvertSelectionCaseAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String selection = textArea.getSelectedText();
+			if (selection!=null) {
+				StringBuffer buffer = new StringBuffer(selection);
+				int length = buffer.length();
+				for (int i=0; i<length; i++) {
+					char c = buffer.charAt(i);
+					if (Character.isUpperCase(c))
+						buffer.setCharAt(i, Character.toLowerCase(c));
+					else if (Character.isLowerCase(c))
+						buffer.setCharAt(i, Character.toUpperCase(c));
+				}
+				textArea.replaceSelection(buffer.toString());
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action to join the current line and the following line.
+	 */
+	public static class JoinLinesAction extends RecordableTextAction {
+
+		public JoinLinesAction() {
+			super(rtaJoinLinesAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			try {
+				Caret c = textArea.getCaret();
+				int caretPos = c.getDot();
+				Document doc = textArea.getDocument();
+				Element map = doc.getDefaultRootElement();
+				int lineCount = map.getElementCount();
+				int line = map.getElementIndex(caretPos);
+				if (line==lineCount-1) {
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					return;
+				}
+				Element lineElem = map.getElement(line);
+				caretPos = lineElem.getEndOffset() - 1;
+				c.setDot(caretPos);		// Gets rid of any selection.
+				doc.remove(caretPos, 1);	// Should be '\n'.
+			} catch (BadLocationException ble) {
+				/* Shouldn't ever happen. */
+				ble.printStackTrace();
+			}
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that moves a line up or down.
+	 */
+	public static class LineMoveAction extends RecordableTextAction {
+
+		private int moveAmt;
+
+		public LineMoveAction(String name, int moveAmt) {
+			super(name);
+			this.moveAmt = moveAmt;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			try {
+				int caret = textArea.getCaretPosition();
+				Document doc = textArea.getDocument();
+				Element root = doc.getDefaultRootElement();
+				int line = root.getElementIndex(caret);
+				if (moveAmt==-1 && line>0) {
+					moveLineUp(textArea, line);
+				}
+				else if (moveAmt==1 && line<root.getElementCount()-1) {
+					moveLineDown(textArea, line);
+				}
+				else {
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+					return;
+				}
+			} catch (BadLocationException ble) {
+				// Never happens.
+				ble.printStackTrace();
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		private final void moveLineDown(RTextArea textArea, int line)
+									throws BadLocationException {
+			Document doc = textArea.getDocument();
+			Element root = doc.getDefaultRootElement();
+			Element elem = root.getElement(line);
+			int start = elem.getStartOffset();
+			int end = elem.getEndOffset();
+			int caret = textArea.getCaretPosition();
+			int caretOffset = caret - start;
+			String text = doc.getText(start, end-start);
+			doc.remove(start, end-start);
+			Element elem2 = root.getElement(line); // not "line+1" - removed.
+			//int start2 = elem2.getStartOffset();
+			int end2 = elem2.getEndOffset();
+			doc.insertString(end2, text, null);
+			elem = root.getElement(line+1);
+			textArea.setCaretPosition(elem.getStartOffset()+caretOffset);
+		}
+
+		private final void moveLineUp(RTextArea textArea, int line)
+									throws BadLocationException {
+			Document doc = textArea.getDocument();
+			Element root = doc.getDefaultRootElement();
+			int lineCount = root.getElementCount();
+			Element elem = root.getElement(line);
+			int start = elem.getStartOffset();
+			int end = line==lineCount-1 ? elem.getEndOffset()-1 :
+									elem.getEndOffset();
+			int caret = textArea.getCaretPosition();
+			int caretOffset = caret - start;
+			String text = doc.getText(start, end-start);
+			if (line==lineCount-1) {
+				start--; // Remove previous line's ending \n
+			}
+			doc.remove(start, end-start);
+			Element elem2 = root.getElement(line-1);
+			int start2 = elem2.getStartOffset();
+			//int end2 = elem2.getEndOffset();
+			if (line==lineCount-1) {
+				text += '\n';
+			}
+			doc.insertString(start2, text, null);
+			//caretOffset = Math.min(start2+caretOffset, end2-1);
+			textArea.setCaretPosition(start2+caretOffset);
+		}
+
+	}
+
+
+	/**
+	 * Action to make the selection lower-case.
+	 */
+	public static class LowerSelectionCaseAction extends RecordableTextAction {
+
+		public LowerSelectionCaseAction() {
+			super(rtaLowerSelectionCaseAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String selection = textArea.getSelectedText();
+			if (selection!=null)
+				textArea.replaceSelection(selection.toLowerCase());
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action that moves the caret to the next (or previous) bookmark.
+	 */
+	public static class NextBookmarkAction extends RecordableTextAction {
+
+		private boolean forward;
+
+		public NextBookmarkAction(String name, boolean forward) {
+			super(name);
+			this.forward = forward;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+			if (gutter!=null) {
+
+				try {
+
+					GutterIconInfo[] bookmarks = gutter.getBookmarks();
+					if (bookmarks.length==0) {
+						UIManager.getLookAndFeel().
+									provideErrorFeedback(textArea);
+						return;
+					}
+
+					GutterIconInfo moveTo = null;
+					int curLine = textArea.getCaretLineNumber();
+
+					if (forward) {
+						for (int i=0; i<bookmarks.length; i++) {
+							GutterIconInfo bookmark = bookmarks[i];
+							int offs = bookmark.getMarkedOffset();
+							int line = textArea.getLineOfOffset(offs);
+							if (line>curLine) {
+								moveTo = bookmark;
+								break;
+							}
+						}
+						if (moveTo==null) { // Loop back to beginning
+							moveTo = bookmarks[0];
+						}
+					}
+					else {
+						for (int i=bookmarks.length-1; i>=0; i--) {
+							GutterIconInfo bookmark = bookmarks[i];
+							int offs = bookmark.getMarkedOffset();
+							int line = textArea.getLineOfOffset(offs);
+							if (line<curLine) {
+								moveTo = bookmark;
+								break;
+							}
+						}
+						if (moveTo==null) { // Loop back to end
+							moveTo = bookmarks[bookmarks.length-1];
+						}
+					}
+
+					int offs = moveTo.getMarkedOffset();
+					if (textArea instanceof RSyntaxTextArea) {
+						RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+						if (rsta.isCodeFoldingEnabled()) {
+							rsta.getFoldManager().
+										ensureOffsetNotInClosedFold(offs);
+						}
+					}
+					int line = textArea.getLineOfOffset(offs);
+					offs = textArea.getLineStartOffset(line);
+					textArea.setCaretPosition(offs);
+
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					ble.printStackTrace();
+				}
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Selects the next occurrence of the text last selected.
+	 */
+	public static class NextOccurrenceAction extends RecordableTextAction {
+
+		public NextOccurrenceAction(String name) {
+			super(name);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			String selectedText = textArea.getSelectedText();
+			if (selectedText == null || selectedText.length() == 0) {
+				selectedText = RTextArea.getSelectedOccurrenceText();
+				if (selectedText == null || selectedText.length() == 0) {
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+					return;
+				}
+			}
+			SearchContext context = new SearchContext(selectedText);
+			if (!SearchEngine.find(textArea, context)) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			RTextArea.setSelectedOccurrenceText(selectedText);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action to move the selection and/or caret. Constructor indicates
+	 * direction to use.
+	 */
+	public static class NextVisualPositionAction extends RecordableTextAction {
+
+		private boolean select;
+		private int direction;
+
+		public NextVisualPositionAction(String nm, boolean select, int dir) {
+			super(nm);
+			this.select = select;
+			this.direction = dir;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			Caret caret = textArea.getCaret();
+			int dot = caret.getDot();
+
+			/*
+			 * Move to the beginning/end of selection on a "non-shifted"
+			 * left- or right-keypress.  We shouldn't have to worry about
+			 * navigation filters as, if one is being used, it let us get
+			 * to that position before.
+			 */
+			if (!select) {
+				switch (direction) {
+					case SwingConstants.EAST:
+						int mark = caret.getMark();
+						if (dot!=mark) {
+							caret.setDot(Math.max(dot, mark));
+							return;
+						}
+						break;
+					case SwingConstants.WEST:
+						mark = caret.getMark();
+						if (dot!=mark) {
+							caret.setDot(Math.min(dot, mark));
+							return;
+						}
+						break;
+					default:
+				}
+			}
+
+			Position.Bias[] bias = new Position.Bias[1];
+			Point magicPosition = caret.getMagicCaretPosition();
+
+			try {
+
+				if(magicPosition == null &&
+					(direction == SwingConstants.NORTH ||
+					direction == SwingConstants.SOUTH)) {
+					Rectangle r = textArea.modelToView(dot);
+					magicPosition = new Point(r.x, r.y);
+				}
+
+				NavigationFilter filter = textArea.getNavigationFilter();
+
+				if (filter != null) {
+					dot = filter.getNextVisualPositionFrom(textArea, dot,
+								Position.Bias.Forward, direction, bias);
+				}
+				else {
+					dot = textArea.getUI().getNextVisualPositionFrom(
+								textArea, dot,
+								Position.Bias.Forward, direction, bias);
+				}
+				if (select)
+					caret.moveDot(dot);
+				else
+					caret.setDot(dot);
+
+				if(magicPosition != null &&
+					(direction == SwingConstants.NORTH ||
+					direction == SwingConstants.SOUTH)) {
+						caret.setMagicCaretPosition(magicPosition);
+				}
+
+			} catch (BadLocationException ble) {
+				ble.printStackTrace();
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+    }
+
+
+	/**
+	 * Positions the caret at the next word.
+	 */
+	public static class NextWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public NextWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int offs = textArea.getCaretPosition();
+			int oldOffs = offs;
+			Element curPara = Utilities.getParagraphElement(textArea, offs);
+
+			try {
+				offs = getNextWord(textArea, offs);
+				if(offs >= curPara.getEndOffset() &&
+							oldOffs != curPara.getEndOffset() - 1) {
+					// we should first move to the end of current paragraph
+					// http://bugs.sun.com/view_bug.do?bug_id=4278839
+					offs = curPara.getEndOffset() - 1;
+				}
+			} catch (BadLocationException ble) {
+				int end = textArea.getDocument().getLength();
+				if (offs != end) {
+					if(oldOffs != curPara.getEndOffset() - 1)
+						offs = curPara.getEndOffset() - 1;
+					else
+						offs = end;
+				}
+			}
+
+			if (select)
+				textArea.moveCaretPosition(offs);
+			else
+				textArea.setCaretPosition(offs);
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getNextWord(RTextArea textArea, int offs)
+									throws BadLocationException {
+			return Utilities.getNextWord(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Pages one view to the left or right.
+	 */
+	static class PageAction extends RecordableTextAction {
+
+ 
+		private boolean select;
+		private boolean left;
+
+		public PageAction(String name, boolean left, boolean select) {
+			super(name);
+			this.select = select;
+			this.left = left;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int selectedIndex;
+			Rectangle visible = new Rectangle();
+			textArea.computeVisibleRect(visible);
+			if (left)
+				visible.x = Math.max(0, visible.x - visible.width);
+			else
+				visible.x += visible.width;
+		
+			selectedIndex = textArea.getCaretPosition();
+			if(selectedIndex != -1) {
+				if (left) {
+					selectedIndex = textArea.viewToModel(
+									new Point(visible.x, visible.y));
+				}
+				else {
+					selectedIndex = textArea.viewToModel(
+							new Point(visible.x + visible.width - 1,
+									visible.y + visible.height - 1));
+				}
+				Document doc = textArea.getDocument();
+				if ((selectedIndex != 0) && 
+					(selectedIndex  > (doc.getLength()-1))) {
+					selectedIndex = doc.getLength()-1;
+				}
+				else if(selectedIndex  < 0) {
+					selectedIndex = 0;
+				}
+				if (select)
+					textArea.moveCaretPosition(selectedIndex);
+				else
+					textArea.setCaretPosition(selectedIndex);
+			}
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Action for pasting text.
+	 */
+	public static class PasteAction extends RecordableTextAction {
+
+ 
+		public PasteAction() {
+			super(DefaultEditorKit.pasteAction);
+		}
+
+		public PasteAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.paste();
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.pasteAction;
+		}
+
+	}
+
+
+	/**
+	 * "Plays back" the last macro recorded.
+	 */
+	public static class PlaybackLastMacroAction extends RecordableTextAction {
+
+ 
+		public PlaybackLastMacroAction() {
+			super(rtaPlaybackLastMacroAction);
+		}
+
+		public PlaybackLastMacroAction(String name, Icon icon,
+					String desc, Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.playbackLastMacro();
+		}
+
+		public boolean isRecordable() {
+			return false; // Don't record macro playbacks.
+		}
+
+		public final String getMacroID() {
+			return rtaPlaybackLastMacroAction;
+		}
+
+	}
+
+
+	/**
+	 * Select the previous occurrence of the text last selected.
+	 */
+	public static class PreviousOccurrenceAction extends RecordableTextAction {
+
+		public PreviousOccurrenceAction(String name) {
+			super(name);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			String selectedText = textArea.getSelectedText();
+			if (selectedText == null || selectedText.length() == 0) {
+				selectedText = RTextArea.getSelectedOccurrenceText();
+				if (selectedText == null || selectedText.length() == 0) {
+					UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+					return;
+				}
+			}
+			SearchContext context = new SearchContext(selectedText);
+			context.setSearchForward(false);
+			if (!SearchEngine.find(textArea, context)) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+			}
+			RTextArea.setSelectedOccurrenceText(selectedText);
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+    /**
+     * Positions the caret at the beginning of the previous word.
+     */
+    public static class PreviousWordAction extends RecordableTextAction {
+
+ 		private boolean select;
+
+		public PreviousWordAction(String name, boolean select) {
+			super(name);
+			this.select = select;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			int offs = textArea.getCaretPosition();
+			boolean failed = false;
+			try {
+
+				Element curPara = Utilities.getParagraphElement(textArea, offs);
+				offs = getPreviousWord(textArea, offs);
+				if(offs < curPara.getStartOffset()) {
+					offs = Utilities.getParagraphElement(textArea, offs).
+												getEndOffset() - 1;
+				}
+
+			} catch (BadLocationException bl) {
+				if (offs != 0)
+					offs = 0;
+				else
+					failed = true;
+			}
+
+			if (!failed) {
+				if (select)
+					textArea.moveCaretPosition(offs);
+				else
+					textArea.setCaretPosition(offs);
+			}
+			else
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+		protected int getPreviousWord(RTextArea textArea, int offs)
+										throws BadLocationException {
+			return Utilities.getPreviousWord(textArea, offs);
+		}
+
+	}
+
+
+	/**
+	 * Re-does the last action undone.
+	 */
+	public static class RedoAction extends RecordableTextAction {
+
+ 
+		public RedoAction() {
+			super(rtaRedoAction);
+		}
+
+		public RedoAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (textArea.isEnabled() && textArea.isEditable()) {
+				textArea.redoLastAction();
+				textArea.requestFocusInWindow();
+			}
+		}
+
+		public final String getMacroID() {
+			return rtaRedoAction;
+		}
+
+	}
+
+
+	/**
+	 * Scrolls the text area one line up or down, without changing
+	 * the caret position.
+	 */
+	public static class ScrollAction extends RecordableTextAction {
+
+		private int delta;
+
+		public ScrollAction(String name, int delta) {
+			super(name);
+			this.delta = delta;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Container parent = textArea.getParent();
+			if (parent instanceof JViewport) {
+				JViewport viewport = (JViewport)parent;
+				Point p = viewport.getViewPosition();
+				p.y += delta*textArea.getLineHeight();
+				if (p.y<0) {
+					p.y = 0;
+				}
+				else {
+					Rectangle viewRect = viewport.getViewRect();
+					int visibleEnd = p.y + viewRect.height;
+					if (visibleEnd>=textArea.getHeight()) {
+						p.y = textArea.getHeight() - viewRect.height;
+					}
+				}
+				viewport.setViewPosition(p);
+			}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Selects the entire document.
+	 */
+	public static class SelectAllAction extends RecordableTextAction {
+
+ 
+		public SelectAllAction() {
+			super(selectAllAction);
+		}
+
+		public SelectAllAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Document doc = textArea.getDocument();
+			textArea.setCaretPosition(0);
+			textArea.moveCaretPosition(doc.getLength());
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.selectAllAction;
+		}
+
+	}
+
+
+	/**
+	 * Selects the line around the caret.
+	 */
+	public static class SelectLineAction extends RecordableTextAction {
+
+ 		private Action start;
+		private Action end;
+
+		public SelectLineAction() {
+			super(selectLineAction);
+			start = new BeginLineAction("pigdog", false);
+			end = new EndLineAction("pigdog", true);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			start.actionPerformed(e);
+			end.actionPerformed(e);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.selectLineAction;
+		}
+
+	}
+
+
+	/**
+	 * Selects the word around the caret.
+	 */
+	public static class SelectWordAction extends RecordableTextAction {
+
+ 		protected Action start;
+		protected Action end;
+
+		public SelectWordAction() {
+			super(selectWordAction);
+			createActions();
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			start.actionPerformed(e);
+			end.actionPerformed(e);
+		}
+
+		protected void createActions() {
+			start = new BeginWordAction("pigdog", false);
+			end = new EndWordAction("pigdog", true);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.selectWordAction;
+		}
+
+	}
+
+
+	/**
+	 * Puts the text area into read-only mode.
+	 */
+	public static class SetReadOnlyAction extends RecordableTextAction {
+
+ 
+		public SetReadOnlyAction() {
+			super(readOnlyAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.setEditable(false);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.readOnlyAction;
+		}
+
+		public boolean isRecordable() {
+			return false; // Why would you want to record this?
+		}
+
+	}
+
+
+	/**
+	 * Puts the text area into writable (from read-only) mode.
+	 */
+	public static class SetWritableAction extends RecordableTextAction {
+
+ 
+		public SetWritableAction() {
+			super(writableAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.setEditable(true);
+		}
+
+		public final String getMacroID() {
+			return DefaultEditorKit.writableAction;
+		}
+
+		public boolean isRecordable() {
+			return false; // Why would you want to record this?
+		}
+
+	}
+
+
+	/**
+	 * The action for inserting a time/date stamp.
+	 */
+	public static class TimeDateAction extends RecordableTextAction {
+
+ 
+		public TimeDateAction() {
+			super(rtaTimeDateAction);
+		}
+
+		public TimeDateAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			Date today = new Date();
+			DateFormat timeDateStamp = DateFormat.getDateTimeInstance();
+			String dateString = timeDateStamp.format(today);
+			textArea.replaceSelection(dateString);
+		}
+
+		public final String getMacroID() {
+			return rtaTimeDateAction;
+		}
+
+	}
+
+
+	/**
+	 * Toggles whether the current line has a bookmark.
+	 */
+	public static class ToggleBookmarkAction extends RecordableTextAction {
+ 
+		public ToggleBookmarkAction() {
+			super(rtaToggleBookmarkAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+			if (gutter!=null) {
+				int line = textArea.getCaretLineNumber();
+				try {
+					gutter.toggleBookmark(line);
+				} catch (BadLocationException ble) { // Never happens
+					UIManager.getLookAndFeel().
+								provideErrorFeedback(textArea);
+					ble.printStackTrace();
+				}
+			}
+		}
+
+		public final String getMacroID() {
+			return rtaToggleBookmarkAction;
+		}
+
+	}
+
+
+	/**
+	 * The action for the insert key toggling insert/overwrite modes.
+	 */
+	public static class ToggleTextModeAction extends RecordableTextAction {
+ 
+		public ToggleTextModeAction() {
+			super(rtaToggleTextModeAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			int textMode = textArea.getTextMode();
+			if (textMode==RTextArea.INSERT_MODE)
+				textArea.setTextMode(RTextArea.OVERWRITE_MODE);
+			else
+				textArea.setTextMode(RTextArea.INSERT_MODE);
+		}
+
+		public final String getMacroID() {
+			return rtaToggleTextModeAction;
+		}
+
+	}
+
+
+	/**
+	 * Undoes the last action done.
+	 */
+	public static class UndoAction extends RecordableTextAction {
+
+ 		public UndoAction() {
+			super(rtaUndoAction);
+		}
+
+		public UndoAction(String name, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+			super(name, icon, desc, mnemonic, accelerator);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (textArea.isEnabled() && textArea.isEditable()) {
+				textArea.undoLastAction();
+				textArea.requestFocusInWindow();
+			}
+		}
+
+		public final String getMacroID() {
+			return rtaUndoAction;
+		}
+
+	}
+
+
+	/**
+	 * Removes the selection, if any.
+	 */
+	public static class UnselectAction extends RecordableTextAction {
+
+ 
+		public UnselectAction() {
+			super(rtaUnselectAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			textArea.setCaretPosition(textArea.getCaretPosition());
+		}
+
+		public final String getMacroID() {
+			return rtaUnselectAction;
+		}
+
+	}
+
+ 
+	/**
+	 * Action to make the selection upper-case.
+	 */
+	public static class UpperSelectionCaseAction extends RecordableTextAction {
+
+ 
+		public UpperSelectionCaseAction() {
+			super(rtaUpperSelectionCaseAction);
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+			if (!textArea.isEditable() || !textArea.isEnabled()) {
+				UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+				return;
+			}
+			String selection = textArea.getSelectedText();
+			if (selection!=null)
+				textArea.replaceSelection(selection.toUpperCase());
+			textArea.requestFocusInWindow();
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+	/**
+	 * Scrolls up/down vertically.  The select version of this action extends
+	 * the selection, instead of simply moving the caret.
+	 */
+	public static class VerticalPageAction extends RecordableTextAction {
+
+		private boolean select;
+		private int direction;
+
+		public VerticalPageAction(String name, int direction, boolean select) {
+			super(name);
+			this.select = select;
+			this.direction = direction;
+		}
+
+		public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+			Rectangle visible = textArea.getVisibleRect();
+			Rectangle newVis = new Rectangle(visible);
+			int selectedIndex = textArea.getCaretPosition();
+			int scrollAmount = textArea.getScrollableBlockIncrement(
+							visible, SwingConstants.VERTICAL, direction); 
+			int initialY = visible.y;
+			Caret caret = textArea.getCaret();
+			Point magicPosition = caret.getMagicCaretPosition();
+			int yOffset;   
+
+			if (selectedIndex!=-1) {
+
+				try {
+
+					Rectangle dotBounds = textArea.modelToView(selectedIndex);
+					int x = (magicPosition != null) ? magicPosition.x :
+												dotBounds.x;
+					int h = dotBounds.height;
+					yOffset = direction *
+							((int)Math.ceil(scrollAmount/(double)h)-1)*h; 
+					newVis.y = constrainY(textArea, initialY+yOffset, yOffset, visible.height);                        
+					int newIndex;
+
+					if (visible.contains(dotBounds.x, dotBounds.y)) {
+						// Dot is currently visible, base the new
+						// location off the old, or
+						newIndex = textArea.viewToModel(
+									new Point(x, constrainY(textArea,
+										dotBounds.y + yOffset, 0, 0)));
+										}
+					else {
+						// Dot isn't visible, choose the top or the bottom
+						// for the new location.
+						if (direction == -1) {
+							newIndex = textArea.viewToModel(new Point(
+													x, newVis.y));
+						}
+						else {
+							newIndex = textArea.viewToModel(new Point(
+									x, newVis.y + visible.height));
+						}
+					}
+					newIndex = constrainOffset(textArea, newIndex);
+					if (newIndex != selectedIndex) {
+						// Make sure the new visible location contains
+						// the location of dot, otherwise Caret will
+						// cause an additional scroll.
+						adjustScrollIfNecessary(textArea, newVis, initialY,
+											newIndex);
+						if (select)
+							textArea.moveCaretPosition(newIndex);
+						else
+							textArea.setCaretPosition(newIndex);
+					}
+
+				} catch (BadLocationException ble) { }
+
+			} // End of if (selectedIndex!=-1).
+
+			else {
+				yOffset = direction * scrollAmount;
+				newVis.y = constrainY(textArea, initialY + yOffset, yOffset, visible.height);
+			}
+
+			if (magicPosition != null)
+				caret.setMagicCaretPosition(magicPosition);
+
+			textArea.scrollRectToVisible(newVis);
+		}
+
+		private int constrainY(JTextComponent textArea, int y, int vis, int screenHeight) {
+			if (y < 0)
+				y = 0;
+			else if (y + vis > textArea.getHeight()) {
+				//y = Math.max(0, textArea.getHeight() - vis);
+				y = Math.max(0, textArea.getHeight()-screenHeight);
+			}
+			return y;
+		}
+
+		private int constrainOffset(JTextComponent text, int offset) {
+			Document doc = text.getDocument();
+			if ((offset != 0) && (offset > doc.getLength()))
+				offset = doc.getLength();
+			if (offset  < 0)
+				offset = 0;
+			return offset;
+		}
+
+		private void adjustScrollIfNecessary(JTextComponent text,
+									Rectangle visible, int initialY,
+									int index) {
+			try {
+				Rectangle dotBounds = text.modelToView(index);
+	                if (dotBounds.y < visible.y ||
+					(dotBounds.y > (visible.y + visible.height)) ||
+					(dotBounds.y + dotBounds.height) >
+					(visible.y + visible.height)) {
+					int y;
+					if (dotBounds.y < visible.y)
+						y = dotBounds.y;
+					else
+						y = dotBounds.y + dotBounds.height - visible.height;
+					if ((direction == -1 && y < initialY) ||
+						(direction == 1 && y > initialY))
+						// Only adjust if won't cause scrolling upward.
+						visible.y = y;
+				}
+			} catch (BadLocationException ble) {}
+		}
+
+		public final String getMacroID() {
+			return getName();
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaUI.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaUI.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextAreaUI.java	(revision 25584)
@@ -0,0 +1,581 @@
+/*
+ * 04/25/2007
+ *
+ * RTextAreaUI.java - UI used by instances of RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.text.*;
+import javax.swing.border.Border;
+import javax.swing.plaf.*;
+import javax.swing.plaf.basic.*;
+
+
+/**
+ * The UI used by instances of <code>RTextArea</code>.  This UI takes into
+ * account all of the "extras" involved in an <code>RTextArea</code>, including
+ * having a special caret (for insert and overwrite), background images,
+ * highlighting the current line, etc.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class RTextAreaUI extends BasicTextAreaUI implements ViewFactory {
+
+	private static final String SHARED_ACTION_MAP_NAME	= "RTextAreaUI.actionMap";
+	private static final String SHARED_INPUT_MAP_NAME	= "RTextAreaUI.inputMap";
+
+	protected RTextArea textArea;				// The text area for which we are the UI.
+
+	private static final EditorKit defaultKit = new RTextAreaEditorKit();
+	private static final TransferHandler defaultTransferHandler =
+										new RTATextTransferHandler();
+
+	private static final String RTEXTAREA_KEYMAP_NAME	= "RTextAreaKeymap";
+
+
+	/**
+	 * Creates a UI for an RTextArea.
+	 *
+	 * @param textArea A text area.
+	 * @return The UI.
+	 */
+	public static ComponentUI createUI(JComponent textArea) {
+		return new RTextAreaUI(textArea);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea An instance of <code>RTextArea</code>.
+	 * @throws IllegalArgumentException If <code>textArea</code> is not an
+	 *         instance of <code>RTextArea</code>.
+	 */
+	public RTextAreaUI(JComponent textArea) {
+		if (!(textArea instanceof RTextArea)) {
+			throw new IllegalArgumentException("RTextAreaUI is for " +
+							 		"instances of RTextArea only!");
+		}
+		this.textArea = (RTextArea)textArea;
+	}
+
+
+	/**
+	 * The Nimbus LAF (and any Synth laf might have similar issues) doesn't set
+	 * many UIManager properties that BasicLAF UI's look for.  This causes
+	 * problems for custom Basic-based UI's such as RTextAreaUI.  This method
+	 * attempts to detect if Nimbus has been installed, and if so, sets proper
+	 * values for some editor properties.
+	 *
+	 * @param editor The text area.
+	 */
+	private void correctNimbusDefaultProblems(JTextComponent editor) {
+
+		// Don't check UIManager.getLookAndFeel().getName() for "Nimbus",
+		// as other Synth-based LaFs might have not set these properties,
+		// in which case we'll need to use our fallback values.
+
+		// Check for null, but not for UIResource, for these properties,
+		// because if Nimbus was installed these values would all be given
+		// null values.  Another laf might have successfully installed
+		// UIResource values, which we don't want to override.
+
+		Color c = editor.getCaretColor();
+		if (c==null) {
+			editor.setCaretColor(RTextArea.getDefaultCaretColor());
+		}
+
+		c = editor.getSelectionColor();
+		if (c==null) {
+			c = UIManager.getColor("nimbusSelectionBackground");
+			if (c==null) { // Not Nimbus, but still need a value - fallback
+				c = UIManager.getColor("textHighlight");
+				if (c==null) {
+					c = new ColorUIResource(Color.BLUE);
+				}
+			}
+			editor.setSelectionColor(c);
+		}
+
+		c = editor.getSelectedTextColor();
+		if (c==null) {
+			c = UIManager.getColor("nimbusSelectedText");
+			if (c==null) { // Not Nimbus, but still need a value - fallback
+				c = UIManager.getColor("textHighlightText");
+				if (c==null) {
+					c = new ColorUIResource(Color.WHITE);
+				}
+			}
+			editor.setSelectedTextColor(c);
+		}
+
+		c = editor.getDisabledTextColor();
+		if (c==null) {
+			c = UIManager.getColor("nimbusDisabledText");
+			if (c==null) { // Not Nimbus, but still need a value - fallback
+				c = UIManager.getColor("textInactiveText");
+				if (c==null) {
+					c = new ColorUIResource(Color.DARK_GRAY);
+				}
+			}
+			editor.setDisabledTextColor(c);
+		}
+
+		Border border = editor.getBorder();
+		if (border==null) {
+			editor.setBorder(new BasicBorders.MarginBorder());
+		}
+
+		Insets margin = editor.getMargin();
+		if (margin==null) {
+			editor.setMargin(new InsetsUIResource(2, 2, 2, 2));
+		}
+
+	}
+
+
+	/**
+	 * Creates the view for an element.  Returns a WrappedPlainView or
+	 * PlainView.
+	 *
+	 * @param elem The element.
+	 * @return The view.
+	 */
+	public View create(Element elem) {
+		if (textArea.getLineWrap())
+			return new WrappedPlainView(elem, textArea.getWrapStyleWord());
+		else
+			return new PlainView(elem);
+	}
+
+
+	/**
+	 * Returns the default caret for an <code>RTextArea</code>.  This caret is
+	 * capable of displaying itself differently for insert/overwrite modes.
+	 *
+	 * @return The caret.
+	 */
+	protected Caret createCaret() {
+		Caret caret = new ConfigurableCaret();
+		caret.setBlinkRate(500);
+		return caret;
+	}
+
+
+	/**
+	 * Creates the keymap for this text area.  This takes the super class's
+	 * keymap, but sets the default keystroke to be RTextAreaEditorKit's
+	 * DefaultKeyTypedAction.  This must be done to override the default
+	 * keymap's default key-typed action.
+	 *
+	 * @return The keymap.
+	 */
+	protected Keymap createKeymap() {
+
+		// Load the keymap we'll be using (it's saved by
+		// JTextComponent.addKeymap).
+		Keymap map = JTextComponent.getKeymap(RTEXTAREA_KEYMAP_NAME);
+		if (map==null) {
+			Keymap parent = JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP);
+			map = JTextComponent.addKeymap(RTEXTAREA_KEYMAP_NAME, parent);
+			map.setDefaultAction(new RTextAreaEditorKit.DefaultKeyTypedAction());
+		}
+
+		return map;
+
+	}
+
+
+	/**
+	 * Creates a default action map.  This action map contains actions for all
+	 * basic text area work - cut, copy, paste, select, caret motion, etc.<p>
+	 *
+	 * This isn't named <code>createActionMap()</code> because there is a
+	 * package-private member by that name in <code>BasicTextAreaUI</code>,
+	 * and some compilers will give warnings that we are not overriding that
+	 * method since it is package-private.
+	 *
+	 * @return The action map.
+	 */
+	protected ActionMap createRTextAreaActionMap() {
+
+		// Get the actions of the text area (which in turn gets them from its
+		// DefaultEditorKit).
+		ActionMap map = new ActionMapUIResource();
+		Action[] actions = textArea.getActions();
+		int n = actions.length;
+		for (int i = 0; i < n; i++) {
+			Action a = actions[i];
+			map.put(a.getValue(Action.NAME), a);
+		}
+
+		// Not sure if we need these; not sure they are ever called
+		// (check their NAMEs).
+		map.put(TransferHandler.getCutAction().getValue(Action.NAME),
+									TransferHandler.getCutAction());
+		map.put(TransferHandler.getCopyAction().getValue(Action.NAME),
+									TransferHandler.getCopyAction());
+		map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
+									TransferHandler.getPasteAction());
+
+		return map;
+
+	}
+
+
+	/**
+	 * Returns the name to use to cache/fetch the shared action map.  This
+	 * should be overridden by subclasses if the subclass has its own custom
+	 * editor kit to install, so its actions get picked up.
+	 *
+	 * @return The name of the cached action map.
+	 */
+	protected String getActionMapName() {
+		return SHARED_ACTION_MAP_NAME;
+	}
+
+
+	/**
+	 * Fetches the EditorKit for the UI.
+	 *
+	 * @param tc the text component for which this UI is installed
+	 * @return the editor capabilities
+	 * @see TextUI#getEditorKit
+	 */
+	public EditorKit getEditorKit(JTextComponent tc) {
+		return defaultKit;
+	}
+
+
+	/**
+	 * Returns the text area for which we are the UI.
+	 *
+	 * @return The text area.
+	 */
+	public RTextArea getRTextArea() {
+		return textArea;
+	}
+
+
+	/**
+	 * Returns an action map to use by a text area.<p>
+	 *
+	 * This method is not named <code>getActionMap()</code> because there is
+	 * a package-private method in <code>BasicTextAreaUI</code> with that name.
+	 * Thus, creating a new method with that name causes certain compilers to
+	 * issue warnings that you are not actually overriding the original method
+	 * (since it is package-private).
+	 *
+	 * @return The action map.
+	 * @see #createRTextAreaActionMap()
+	 */
+	private ActionMap getRTextAreaActionMap() {
+
+		// Get the UIManager-cached action map; if this is the first
+		// RTextArea created, create the action map and cache it.
+		ActionMap map = (ActionMap)UIManager.get(getActionMapName());
+		if (map==null) {
+			map = createRTextAreaActionMap();
+			UIManager.put(getActionMapName(), map);
+		}
+
+		ActionMap componentMap = new ActionMapUIResource();
+		componentMap.put("requestFocus", new FocusAction());
+
+		if (map != null)
+			componentMap.setParent(map);
+		return componentMap;
+
+	}
+
+
+	/**
+	 * Get the InputMap to use for the UI.<p>
+	 *  
+	 * This method is not named <code>getInputMap()</code> because there is
+	 * a package-private method in <code>BasicTextAreaUI</code> with that name.
+	 * Thus, creating a new method with that name causes certain compilers to
+	 * issue warnings that you are not actually overriding the original method
+	 * (since it is package-private).
+	 */
+	protected InputMap getRTextAreaInputMap() {
+		InputMap map = new InputMapUIResource();
+		InputMap shared = (InputMap)UIManager.get(SHARED_INPUT_MAP_NAME);
+		if (shared==null) {
+			shared = new RTADefaultInputMap();
+			UIManager.put(SHARED_INPUT_MAP_NAME, shared);
+		}
+		//KeyStroke[] keys = shared.allKeys();
+		//for (int i=0; i<keys.length; i++)
+		//	System.err.println(keys[i] + " -> " + shared.get(keys[i]));
+		map.setParent(shared);
+		return map;
+	}
+
+
+	/**
+	 * Gets the allocation to give the root View.  Due
+	 * to an unfortunate set of historical events this 
+	 * method is inappropriately named.  The Rectangle
+	 * returned has nothing to do with visibility.  
+	 * The component must have a non-zero positive size for 
+	 * this translation to be computed.
+	 *
+	 * @return the bounding box for the root view
+	 */
+	protected Rectangle getVisibleEditorRect() {
+		Rectangle alloc = textArea.getBounds();
+		if ((alloc.width > 0) && (alloc.height > 0)) {
+			alloc.x = alloc.y = 0;
+			Insets insets = textArea.getInsets();
+			alloc.x += insets.left;
+			alloc.y += insets.top;
+			alloc.width -= insets.left + insets.right;
+			alloc.height -= insets.top + insets.bottom;
+			return alloc;
+		}
+		return null;
+	}
+
+
+	protected void installDefaults() {
+
+		super.installDefaults();
+
+		JTextComponent editor = getComponent();
+		editor.setFont(RTextAreaBase.getDefaultFont());
+
+		// Nimbus (and possibly other Synth lafs) doesn't play by BasicLaf
+		// rules and doesn't set properties needed by custom BasicTextAreaUI's.
+		correctNimbusDefaultProblems(editor);
+
+		editor.setTransferHandler(defaultTransferHandler);
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void installKeyboardActions() {
+
+		// NOTE: Don't call super.installKeyboardActions(), as that causes
+		// JTextAreas to stop responding to certain keystrokes if an RTextArea
+		// is the first-instantiated text area.  This is because of the code
+		// path installKeyboardActions() -> getActionMap() -> createActionMap().
+		// In BasicTextUI#createActionMap(), "editor.getActions()" is called,
+		// and the current editor's returned Actions are used to create the
+		// ActionMap, which is then cached and used in all future J/RTextAreas.
+		// Unfortunately, RTextArea actions don't worn in JTextAreas.
+		//super.installKeyboardActions();
+
+		RTextArea textArea = getRTextArea();
+
+		// backward compatibility support... keymaps for the UI
+		// are now installed in the more friendly input map.
+		textArea.setKeymap(createKeymap()); 
+
+		// Since BasicTextUI.getInputMap() is package-private, instead use
+		// our own version here.
+		InputMap map = getRTextAreaInputMap();
+		SwingUtilities.replaceUIInputMap(textArea,JComponent.WHEN_FOCUSED,map);
+
+		// Same thing here with action map.
+		ActionMap am = getRTextAreaActionMap();
+		if (am!=null) {
+		    SwingUtilities.replaceUIActionMap(textArea, am);
+		}
+
+
+	}
+
+
+	/**
+	 * Installs this UI to the given text component.
+	 */
+	public void installUI(JComponent c) {
+		if (!(c instanceof RTextArea)) {
+			throw new Error("RTextAreaUI needs an instance of RTextArea!");
+		}
+		super.installUI(c);
+	}
+
+
+	protected void paintBackground(Graphics g) {
+
+		// Only fill in the background if an image isn't being used.
+		Color bg = textArea.getBackground();
+		if (bg!=null) {
+			g.setColor(bg);
+			//g.fillRect(0, 0, textArea.getWidth(), textArea.getHeight());
+			Rectangle r = g.getClipBounds();
+			g.fillRect(r.x,r.y, r.width,r.height);
+		}
+
+		Rectangle visibleRect = textArea.getVisibleRect();
+
+		paintLineHighlights(g);
+		paintCurrentLineHighlight(g, visibleRect);
+		paintMarginLine(g, visibleRect);
+
+	}
+
+
+	/**
+	 * Paints the highlighted current line, if it is enabled.
+	 *
+	 * @param g The graphics context with which to paint.
+	 * @param visibleRect The visible rectangle of the text area.
+	 */
+	protected void paintCurrentLineHighlight(Graphics g, Rectangle visibleRect) {
+
+		if (textArea.getHighlightCurrentLine()) {
+
+			Caret caret = textArea.getCaret();
+			if (caret.getDot()==caret.getMark()) {
+
+				Color highlight = textArea.getCurrentLineHighlightColor();
+				// NOTE:  We use the getLineHeight() method below instead
+				// of currentCaretRect.height because of a bug where
+				// currentCaretRect.height is incorrect when an
+				// RSyntaxTextArea is first displayed (it is initialized 
+				// with the text area's font.getHeight() (via RTextArea),
+				// but isn't changed to account for the syntax styles
+				// before it is displayed).
+				//int height = textArea.currentCaretRect.height);
+				int height = textArea.getLineHeight();
+
+				if (textArea.getFadeCurrentLineHighlight()) {
+					Graphics2D g2d = (Graphics2D)g;
+					Color bg = textArea.getBackground();
+					GradientPaint paint = new GradientPaint(
+						visibleRect.x,0, highlight,
+						visibleRect.x+visibleRect.width,0,
+								bg==null ? Color.WHITE : bg);
+					g2d.setPaint(paint);
+					g2d.fillRect(visibleRect.x,textArea.currentCaretY,
+									visibleRect.width, height);
+				}
+				else {
+					g.setColor(highlight);
+					g.fillRect(visibleRect.x,textArea.currentCaretY,
+									visibleRect.width, height);
+				}
+
+			} // End of if (caret.getDot()==caret.getMark()).
+
+		} // End of if (textArea.isCurrentLineHighlightEnabled()...
+
+	}
+
+
+	/**
+	 * Paints any line highlights.
+	 *
+	 * @param g The graphics context.
+	 */
+	protected void paintLineHighlights(Graphics g) {
+		LineHighlightManager lhm = textArea.getLineHighlightManager();
+		if (lhm!=null) {
+			lhm.paintLineHighlights(g);
+		}
+	}
+
+
+	/**
+	 * Draws the "margin line" if enabled.
+	 *
+	 * @param g The graphics context to paint with.
+	 * @param visibleRect The visible rectangle of this text area.
+	 */
+	protected void paintMarginLine(Graphics g, Rectangle visibleRect) {
+		if (textArea.isMarginLineEnabled()) {
+			g.setColor(textArea.getMarginLineColor());
+			Insets insets = textArea.getInsets();
+			int marginLineX = textArea.getMarginLinePixelLocation() +
+							(insets==null ? 0 : insets.left);
+			g.drawLine(marginLineX,visibleRect.y,
+						marginLineX,visibleRect.y+visibleRect.height);
+		}
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the specified line.<p>
+	 *
+	 * The default implementation is equivalent to:
+	 * <pre>
+	 * int startOffs = textArea.getLineStartOffset(line);
+	 * return yForLineContaining(startOffs);</code>
+	 * </pre>
+	 *
+	 * Subclasses that can calculate this value more quickly than traditional
+	 * {@link #modelToView(JTextComponent, int)} calls should override this
+	 * method to do so. This method may be used when the entire bounding box
+	 * isn't needed, to speed up rendering.
+	 *
+	 * @param line The line number.
+	 * @return The y-coordinate of the top of the line, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>line</code> isn't a valid line
+	 *         number for this document.
+	 */
+	public int yForLine(int line) throws BadLocationException {
+		int startOffs = textArea.getLineStartOffset(line);
+		return yForLineContaining(startOffs);
+	}
+
+
+	/**
+	 * Returns the y-coordinate of the line containing an offset.<p>
+	 *
+	 * The default implementation is equivalent to:
+	 * <pre>
+	 * int line = textArea.getLineOfOffset(offs);
+	 * int startOffs = textArea.getLineStartOffset(line);
+	 * return modelToView(startOffs).y;</code>
+	 * </pre>
+	 *
+	 * Subclasses that can calculate this value more quickly than traditional
+	 * {@link #modelToView(JTextComponent, int)} calls should override this
+	 * method to do so. This method may be used when the entire bounding box
+	 * isn't needed, to speed up rendering.
+	 *
+	 * @param offs The offset info the document.
+	 * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+	 *         this text area doesn't yet have a positive size or the line is
+	 *         hidden (i.e. from folding).
+	 * @throws BadLocationException If <code>offs</code> isn't a valid offset
+	 *         into the document.
+	 */
+	public int yForLineContaining(int offs) throws BadLocationException {
+		Rectangle r = modelToView(textArea, offs);
+		return r!=null ? r.y : -1;
+	}
+
+
+	/**
+	 * Registered in the ActionMap.
+	 */
+	class FocusAction extends AbstractAction {
+
+		public void actionPerformed(ActionEvent e) {
+			textArea.requestFocus();
+		}
+
+		public boolean isEnabled() {
+			return textArea.isEditable();
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextScrollPane.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextScrollPane.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RTextScrollPane.java	(revision 25584)
@@ -0,0 +1,236 @@
+/*
+ * 11/14/2003
+ *
+ * RTextScrollPane.java - A JScrollPane that will only accept RTextAreas
+ * so that it can display line numbers, fold indicators, and icons.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import javax.swing.JScrollPane;
+
+
+/**
+ * An extension of <code>javax.swing.JScrollPane</code> that will only take
+ * <code>RTextArea</code>s for its view.  This class has the ability to show:
+ * <ul>
+ *    <li>Line numbers
+ *    <li>Per-line icons (for bookmarks, debugging breakpoints, error markers, etc.)
+ *    <li>+/- icons to denote code folding regions.
+ * </ul>
+ *
+ * The actual "meat" of these extras is contained in the {@link Gutter} class.
+ * Each <code>RTextScrollPane</code> has a <code>Gutter</code> instance that
+ * it uses as its row header.  The gutter is only made visible when one of its
+ * features is being used (line numbering, folding, and/or icons).
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+public class RTextScrollPane extends JScrollPane {
+
+	private RTextArea textArea;
+	private Gutter gutter;
+
+
+	/**
+	 * Constructor.  If you use this constructor, you must call
+	 * {@link #setViewportView(Component)} and pass in an {@link RTextArea}
+	 * for this scroll pane to render line numbers properly.
+	 */
+	public RTextScrollPane() {
+		this(null, true);
+	}
+
+
+	/**
+	 * Creates a scroll pane.  A default value will be used for line number
+	 * color (gray), and the current line's line number will be highlighted.
+	 *
+	 * @param textArea The text area this scroll pane will contain.
+	 */
+	public RTextScrollPane(RTextArea textArea) {
+		this(textArea, true);
+	}
+
+
+	/**
+	 * Creates a scroll pane.  A default value will be used for line number
+	 * color (gray), and the current line's line number will be highlighted.
+	 *
+	 * @param textArea The text area this scroll pane will contain.  If this is
+	 *        <code>null</code>, you must call
+	 *        {@link #setViewportView(Component)}, passing in an
+	 *        {@link RTextArea}.
+	 * @param lineNumbers Whether line numbers should be enabled.
+	 */
+	public RTextScrollPane(RTextArea textArea, boolean lineNumbers) {
+		this(textArea, lineNumbers, Color.GRAY);
+	}
+
+
+	/**
+	 * Creates a scroll pane with preferred size (width, height).
+	 *
+	 * @param area The text area this scroll pane will contain.  If this is
+	 *        <code>null</code>, you must call
+	 *        {@link #setViewportView(Component)}, passing in an
+	 *        {@link RTextArea}.
+	 * @param lineNumbers Whether line numbers are initially enabled.
+	 * @param lineNumberColor The color to use for line numbers.
+	 */
+	public RTextScrollPane(RTextArea area, boolean lineNumbers,
+							Color lineNumberColor) {
+
+		super(area);
+
+		// Create the text area and set it inside this scroll bar area.
+		textArea = area;
+
+		// Create the gutter for this document.
+		Font defaultFont = new Font("Monospaced", Font.PLAIN, 12);
+		gutter = new Gutter(textArea);
+		gutter.setLineNumberFont(defaultFont);
+		gutter.setLineNumberColor(lineNumberColor);
+		setLineNumbersEnabled(lineNumbers);
+
+		// Set miscellaneous properties.
+		setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
+		setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
+
+	}
+
+
+	/**
+	 * Ensures the gutter is visible if it's showing anything.
+	 */
+	private void checkGutterVisibility() {
+		int count = gutter.getComponentCount();
+		if (count==0) {
+			if (getRowHeader()!=null && getRowHeader().getView()==gutter) {
+				setRowHeaderView(null);
+			}
+		}
+		else {
+			if (getRowHeader()==null || getRowHeader().getView()==null) {
+				setRowHeaderView(gutter);
+			}
+		}
+	}
+
+
+	/**
+	 * Returns the gutter.
+	 *
+	 * @return The gutter.
+	 */
+	public Gutter getGutter() {
+		return gutter;
+	}
+
+
+	/**
+	 * Returns <code>true</code> if the line numbers are enabled and visible.
+	 *
+	 * @return Whether or not line numbers are visible.
+	 * @see #setLineNumbersEnabled(boolean)
+	 */
+	public boolean getLineNumbersEnabled() {
+		return gutter.getLineNumbersEnabled();
+	}
+
+
+	/**
+	 * Returns the text area being displayed.
+	 *
+	 * @return The text area.
+	 * @see #setViewportView(Component)
+	 */
+	public RTextArea getTextArea() {
+		return (RTextArea)getViewport().getView();
+	}
+
+
+	/**
+	 * Returns whether the fold indicator is enabled.
+	 *
+	 * @return Whether the fold indicator is enabled.
+	 * @see #setFoldIndicatorEnabled(boolean)
+	 */
+	public boolean isFoldIndicatorEnabled() {
+		return gutter.isFoldIndicatorEnabled();
+	}
+
+
+	/**
+	 * Returns whether the icon row header is enabled.
+	 *
+	 * @return Whether the icon row header is enabled.
+	 * @see #setIconRowHeaderEnabled(boolean)
+	 */
+	public boolean isIconRowHeaderEnabled() {
+		return gutter.isIconRowHeaderEnabled();
+	}
+
+
+	/**
+	 * Toggles whether the fold indicator is enabled.
+	 *
+	 * @param enabled Whether the fold indicator should be enabled.
+	 * @see #isFoldIndicatorEnabled()
+	 */
+	public void setFoldIndicatorEnabled(boolean enabled) {
+		gutter.setFoldIndicatorEnabled(enabled);
+		checkGutterVisibility();
+	}
+
+
+	/**
+	 * Toggles whether the icon row header (used for breakpoints, bookmarks,
+	 * etc.) is enabled.
+	 *
+	 * @param enabled Whether the icon row header is enabled.
+	 * @see #isIconRowHeaderEnabled()
+	 */
+	public void setIconRowHeaderEnabled(boolean enabled) {
+		gutter.setIconRowHeaderEnabled(enabled);
+		checkGutterVisibility();
+	}
+
+
+	/**
+	 * Toggles whether or not line numbers are visible.
+	 *
+	 * @param enabled Whether or not line numbers should be visible.
+	 * @see #getLineNumbersEnabled()
+	 */
+	public void setLineNumbersEnabled(boolean enabled) {
+		gutter.setLineNumbersEnabled(enabled);
+		checkGutterVisibility();
+	}
+
+
+	/**
+	 * Sets the view for this scroll pane.  This must be an {@link RTextArea}.
+	 *
+	 * @param view The new view.
+	 * @see #getTextArea()
+	 */
+	public void setViewportView(Component view) {
+		if (!(view instanceof RTextArea)) {
+			throw new IllegalArgumentException("view must be an RTextArea");
+		}
+		super.setViewportView(view);
+		textArea = (RTextArea)view;
+		if (gutter!=null) {
+			gutter.setTextArea(textArea);
+		}
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RUndoManager.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RUndoManager.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RUndoManager.java	(revision 25584)
@@ -0,0 +1,254 @@
+/*
+ * 12/06/2008
+ *
+ * RUndoManager.java - Handles undo/redo behavior for RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.util.ResourceBundle;
+import javax.swing.Action;
+import javax.swing.UIManager;
+import javax.swing.event.UndoableEditEvent;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import javax.swing.undo.CompoundEdit;
+import javax.swing.undo.UndoManager;
+import javax.swing.undo.UndoableEdit;
+
+
+/**
+ * This class manages undos/redos for a particular editor pane.  It groups
+ * all undos that occur one character position apart together, to avoid
+ * Java's horrible "one character at a time" undo behavior.  It also
+ * recognizes "replace" actions (i.e., text is selected, then the user
+ * types), and treats it as a single action, instead of a remove/insert
+ * action pair.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RUndoManager extends UndoManager {
+
+	private RCompoundEdit compoundEdit;
+	private RTextArea textArea;
+	private int lastOffset;
+	private String cantUndoText;
+	private String cantRedoText;
+
+	private int internalAtomicEditDepth;
+
+	private static final String MSG	= "org.fife.ui.rtextarea.RTextArea";
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param textArea The parent text area.
+	 */
+	public RUndoManager(RTextArea textArea) {
+		this.textArea = textArea;
+		ResourceBundle msg = ResourceBundle.getBundle(MSG);
+		cantUndoText = msg.getString("Action.CantUndo.Name");
+		cantRedoText = msg.getString("Action.CantRedo.Name");
+	}
+
+
+	/**
+	 * Begins an "atomic" edit.  This method is called when RTextArea
+	 * KNOWS that some edits should be compound automatically, such as
+	 * when the user is typing in overwrite mode (the deletion of the
+	 * current char + insertion of the new one) or the playing back of a
+	 * macro.
+	 *
+	 * @see #endInternalAtomicEdit()
+	 */
+	public void beginInternalAtomicEdit() {
+		if (++internalAtomicEditDepth==1) {
+			if (compoundEdit!=null)
+				compoundEdit.end();
+			compoundEdit = new RCompoundEdit();
+		}
+	}
+
+
+	/**
+	 * Ends an "atomic" edit.
+	 *
+	 * @see #beginInternalAtomicEdit()
+	 */
+	public void endInternalAtomicEdit() {
+		if (internalAtomicEditDepth>0 && --internalAtomicEditDepth==0) {
+			addEdit(compoundEdit);
+			compoundEdit.end();
+			compoundEdit = null;
+			updateActions();	// Needed to show the new display name.
+		}
+	}
+
+
+	/**
+	 * Returns the localized "Can't Redo" string.
+	 *
+	 * @return The localized "Can't Redo" string.
+	 * @see #getCantUndoText()
+	 */
+	public String getCantRedoText() {
+		return cantRedoText;
+	}
+
+
+	/**
+	 * Returns the localized "Can't Undo" string.
+	 *
+	 * @return The localized "Can't Undo" string.
+	 * @see #getCantRedoText()
+	 */
+	public String getCantUndoText() {
+		return cantUndoText;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void redo() throws CannotRedoException {
+		super.redo();
+		updateActions();
+	}
+
+
+	private RCompoundEdit startCompoundEdit(UndoableEdit edit) {
+		lastOffset = textArea.getCaretPosition();
+		compoundEdit = new RCompoundEdit();
+		compoundEdit.addEdit(edit);
+		addEdit(compoundEdit);
+		return compoundEdit;
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void undo() throws CannotUndoException {
+		super.undo();
+		updateActions();
+	}
+
+
+	public void undoableEditHappened(UndoableEditEvent e) {
+
+		// This happens when the first undoable edit occurs, and
+		// just after an undo.  So, we need to update our actions.
+		if (compoundEdit==null) {
+			compoundEdit = startCompoundEdit(e.getEdit());
+			updateActions();
+			return;
+		}
+
+		else if (internalAtomicEditDepth>0) {
+			compoundEdit.addEdit(e.getEdit());
+			return;
+		}
+
+		// This happens when there's already an undo that has occurred.
+		// Test to see if these undos are on back-to-back characters,
+		// and if they are, group them as a single edit.  Since an
+		// undo has already occurred, there is no need to update our
+		// actions here.
+		int diff = textArea.getCaretPosition() - lastOffset;
+		// "<=1" allows contiguous "overwrite mode" key presses to be
+		// grouped together.
+		if (Math.abs(diff)<=1) {//==1) {
+			compoundEdit.addEdit(e.getEdit());
+			lastOffset += diff;
+			//updateActions();
+			return;
+		}
+
+		// This happens when this UndoableEdit didn't occur at the
+		// character just after the previous undlabeledit.  Since an
+		// undo has already occurred, there is no need to update our
+		// actions here either.
+		compoundEdit.end();
+		compoundEdit = startCompoundEdit(e.getEdit());
+		//updateActions();
+
+	}
+
+
+	/**
+	 * Ensures that undo/redo actions are enabled appropriately and have
+	 * descriptive text at all times.
+	 */
+	public void updateActions() {
+
+		String text;
+
+		Action a = RTextArea.getAction(RTextArea.UNDO_ACTION);
+		if (canUndo()) {
+			a.setEnabled(true);
+			text = getUndoPresentationName();
+			a.putValue(Action.NAME, text);
+			a.putValue(Action.SHORT_DESCRIPTION, text);
+		}
+		else {
+			if (a.isEnabled()) {
+				a.setEnabled(false);
+				text = cantUndoText;
+				a.putValue(Action.NAME, text);
+				a.putValue(Action.SHORT_DESCRIPTION, text);
+			}
+		}
+
+		a = RTextArea.getAction(RTextArea.REDO_ACTION);
+		if (canRedo()) {
+			a.setEnabled(true);
+			text = getRedoPresentationName();
+			a.putValue(Action.NAME, text);
+			a.putValue(Action.SHORT_DESCRIPTION, text);
+		}
+		else {
+			if (a.isEnabled()) {
+				a.setEnabled(false);
+				text = cantRedoText;
+				a.putValue(Action.NAME, text);
+				a.putValue(Action.SHORT_DESCRIPTION, text);
+			}
+		}
+
+	}
+
+	/**
+	 * The action used by {@link RUndoManager}.
+	 *  
+	 * @author Robert Futrell
+	 * @version 1.0
+	 */
+	class RCompoundEdit extends CompoundEdit {
+
+		public String getUndoPresentationName() {
+			return UIManager.getString("AbstractUndoableEdit.undoText");
+		}
+
+		public String getRedoPresentationName() {
+			return UIManager.getString("AbstractUndoableEdit.redoText");
+		}
+
+		public boolean isInProgress() {
+			return false;
+		}
+
+		public void undo() throws CannotUndoException {
+			if (compoundEdit!=null)
+				compoundEdit.end();
+			super.undo();
+			compoundEdit = null;
+		}
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RecordableTextAction.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RecordableTextAction.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RecordableTextAction.java	(revision 25584)
@@ -0,0 +1,289 @@
+/*
+ * 08/19/2004
+ *
+ * RecordableTextAction.java - An action that can be recorded and replayed
+ * in an RTextArea macro.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.event.ActionEvent;
+import java.util.ResourceBundle;
+import javax.swing.Icon;
+import javax.swing.KeyStroke;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.TextAction;
+
+
+/**
+ * The base action used by the actions defined in
+ * {@link RTextAreaEditorKit}.  This action is what allows instances of
+ * <code>RTextArea</code> to record keystrokes into "macros;" if an action is
+ * recordable and occurs while the user is recording a macro, it adds itself to
+ * the currently-being-recorded macro.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public abstract class RecordableTextAction extends TextAction {
+
+	/**
+	 * Whether or not this text action should be recorded in a macro.
+	 */
+	private boolean isRecordable;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The text (name) associated with the action.
+	 */
+	public RecordableTextAction(String text) {
+		this(text, null, null, null, null);
+	}
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param text The text (name) associated with the action.
+	 * @param icon The icon associated with the action.
+	 * @param desc The description of the action.
+	 * @param mnemonic The mnemonic for the action.
+	 * @param accelerator The accelerator key for the action.
+	 */
+	public RecordableTextAction(String text, Icon icon, String desc,
+					Integer mnemonic, KeyStroke accelerator) {
+		super(text);
+		putValue(SMALL_ICON, icon);
+		putValue(SHORT_DESCRIPTION, desc);
+		putValue(ACCELERATOR_KEY, accelerator);
+		putValue(MNEMONIC_KEY, mnemonic);
+		setRecordable(true);
+	}
+
+
+	/**
+	 * This method is final so that you cannot override it and mess up the
+	 * macro-recording part of it.  The actual meat of the action is in
+	 * <code>actionPerformedImpl</code>.
+	 *
+	 * @param e The action being performed.
+	 * @see #actionPerformedImpl
+	 */
+	public final void actionPerformed(ActionEvent e) {
+
+		JTextComponent textComponent = getTextComponent(e);
+		if (textComponent instanceof RTextArea) {
+			RTextArea textArea = (RTextArea)textComponent;
+			//System.err.println("Recordable action: " + getMacroID());
+			if (RTextArea.isRecordingMacro() && isRecordable()) {
+				int mod = e.getModifiers();
+				// We ignore keypresses involving ctrl/alt/meta if they are
+				// "default" keypresses - i.e., they aren't some special
+				// action like paste (e.g., paste would return Ctrl+V, but
+				// its action would be "paste-action").
+				String macroID = getMacroID();
+//System.err.println(macroID);
+//System.err.println("... " + (mod&ActionEvent.ALT_MASK));
+//System.err.println("... " + (mod&ActionEvent.CTRL_MASK));
+//System.err.println("... " + (mod&ActionEvent.META_MASK));
+				if (!DefaultEditorKit.defaultKeyTypedAction.equals(macroID)
+					|| (
+						(mod&ActionEvent.ALT_MASK)==0 &&
+						(mod&ActionEvent.CTRL_MASK)==0 &&
+						(mod&ActionEvent.META_MASK)==0)
+					) {
+					String command = e.getActionCommand();
+					RTextArea.addToCurrentMacro(macroID, command);
+					//System.err.println("... recording it!");
+				}
+			}
+			actionPerformedImpl(e, textArea);
+		}
+
+	}
+
+
+	/**
+	 * The actual meat of the action.  If you wish to subclass this action
+	 * and modify its behavior, this is the method to override.
+	 *
+	 * @param e The action being performed.
+	 * @param textArea The text area "receiving" the action.
+	 * @see #actionPerformed
+	 */
+	public abstract void actionPerformedImpl(ActionEvent e, RTextArea textArea);
+
+
+	/**
+	 * Returns the accelerator for this action.
+	 *
+	 * @return The accelerator.
+	 * @see #setAccelerator(KeyStroke)
+	 */
+	public KeyStroke getAccelerator() {
+		return (KeyStroke)getValue(ACCELERATOR_KEY);
+	}
+
+
+	/**
+	 * Returns the description for this action.
+	 *
+	 * @return The description.
+	 */
+	public String getDescription() {
+		return (String)getValue(SHORT_DESCRIPTION);
+	}
+
+
+	/**
+	 * Returns the icon for this action.
+	 *
+	 * @return The icon.
+	 */
+	public Icon getIcon() {
+		return (Icon)getValue(SMALL_ICON);
+	}
+
+
+	/**
+	 * Returns the identifier for this macro.  This method makes it so that you
+	 * can create an instance of the <code>RTextAreaEditorKit.CutAction</code>
+	 * action, for example, rename it to "Remove", and it will still be
+	 * recorded as a "cut" action.  Subclasses should return a unique string
+	 * from this method; preferably the name of the action.<p>
+	 * If you subclass a <code>RecordableTextAction</code>, you should NOT
+	 * override this method; if you do, the action may not be properly
+	 * recorded in a macro.
+	 *
+	 * @return The internally-used macro ID.
+	 */
+	public abstract String getMacroID();
+
+
+	/**
+	 * Returns the mnemonic for this action.
+	 *
+	 * @return The mnemonic, or <code>-1</code> if not defined.
+	 * @see #setMnemonic(char)
+	 * @see #setMnemonic(Integer)
+	 */
+	public int getMnemonic() {
+		Integer i = (Integer)getValue(MNEMONIC_KEY);
+		return i!=null ? i.intValue() : -1;
+	}
+
+
+	/**
+	 * Returns the name of this action.
+	 *
+	 * @return The name of this action.
+	 * @see #setName(String)
+	 */
+	public String getName() {
+		return (String)getValue(NAME);
+	}
+
+
+	/**
+	 * Returns whether or not this action will be recorded and replayed in
+	 * a macro.
+	 *
+	 * @return Whether or not this action will be recorded and replayed.
+	 * @see #setRecordable
+	 */
+	public boolean isRecordable() {
+		return isRecordable;
+	}
+
+
+	/**
+	 * Sets the accelerator for this action.
+	 *
+	 * @param accelerator The new accelerator.
+	 * @see #getAccelerator()
+	 */
+	public void setAccelerator(KeyStroke accelerator) {
+		putValue(ACCELERATOR_KEY, accelerator);
+	}
+
+
+	/**
+	 * Sets the mnemonic for this action.
+	 *
+	 * @param mnemonic The new mnemonic.
+	 * @see #setMnemonic(Integer)
+	 * @see #getMnemonic()
+	 */
+	public void setMnemonic(char mnemonic) {
+		setMnemonic(new Integer(mnemonic));
+	}
+
+
+	/**
+	 * Sets the mnemonic for this action.
+	 *
+	 * @param mnemonic The new mnemonic.
+	 * @see #setMnemonic(char)
+	 * @see #getMnemonic()
+	 */
+	public void setMnemonic(Integer mnemonic) {
+		putValue(MNEMONIC_KEY, mnemonic);
+	}
+
+
+	/**
+	 * Sets the name of this action.
+	 *
+	 * @param name The new name.
+	 * @see #getName()
+	 */
+	public void setName(String name) {
+		putValue(NAME, name);
+	}
+
+
+	/**
+	 * Sets the name, mnemonic, and description of this action.
+	 *
+	 * @param msg The resource bundle.
+	 * @param keyRoot The root of the keys for the properties.
+	 *        "<code>.Name</code>", "<code>.Mnemonic</code>", and
+	 *        "<code>.Desc</code>" will be appended to create the key for each
+	 *        property.
+	 */
+	public void setProperties(ResourceBundle msg, String keyRoot) {
+		setName(msg.getString(keyRoot + ".Name"));
+		setMnemonic(msg.getString(keyRoot + ".Mnemonic").charAt(0));
+		setShortDescription(msg.getString(keyRoot + ".Desc"));
+	}
+
+
+	/**
+	 * Sets whether or not this action will be recorded and replayed in
+	 * a macro.
+	 *
+	 * @param recordable Whether or not this action should be recorded
+	 *        and replayed.
+	 * @see #isRecordable
+	 */
+	public void setRecordable(boolean recordable) {
+		isRecordable = recordable;
+	}
+
+
+	/**
+	 * Sets the short description for this action.
+	 *
+	 * @param shortDesc The short description for this action.
+	 */
+	public void setShortDescription(String shortDesc) {
+		putValue(SHORT_DESCRIPTION, shortDesc);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RegExReplaceInfo.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RegExReplaceInfo.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/RegExReplaceInfo.java	(revision 25584)
@@ -0,0 +1,85 @@
+/*
+ * 02/19/2006
+ *
+ * RegExReplaceInfo.java - Information about a regex text match.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+
+/**
+ * Information on how to implement a regular expression "replace" operation.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RegExReplaceInfo {
+
+	private String matchedText;
+	private int startIndex;
+	private int endIndex;
+	private String replacement;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param matchedText The text that matched the regular expression.
+	 * @param start The start index of the matched text in the
+	 *        <code>CharSequence</code> searched.
+	 * @param end The end index of the matched text in the
+	 *        <code>CharSequence</code> searched.
+	 * @param replacement The text to replace the matched text with.  This
+	 *        string has any matched groups and character escapes replaced.
+	 */
+	public RegExReplaceInfo(String matchedText, int start, int end,
+						String replacement) {
+		this.matchedText = matchedText;
+		this.startIndex = start;
+		this.endIndex = end;
+		this.replacement = replacement;
+	}
+
+	/**
+	 * Returns the end index of the matched text.
+	 *
+	 * @return The end index of the matched text in the document searched.
+	 * @see #getMatchedText()
+	 * @see #getEndIndex()
+	 */
+	public int getEndIndex() {
+		return endIndex;
+	}
+
+	/**
+	 * Returns the text that matched the regular expression.
+	 *
+	 * @return The matched text.
+	 */
+	public String getMatchedText() {
+		return matchedText;
+	}
+
+	/**
+	 * Returns the string to replaced the matched text with.
+	 * 
+	 * @return The string to replace the matched text with.
+	 */
+	public String getReplacement() {
+		return replacement;
+	}
+
+	/**
+	 * Returns the start index of the matched text.
+	 *
+	 * @return The start index of the matched text in the document searched.
+	 * @see #getMatchedText()
+	 * @see #getEndIndex()
+	 */
+	public int getStartIndex() {
+		return startIndex;
+	}
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/SearchContext.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/SearchContext.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/SearchContext.java	(revision 25584)
@@ -0,0 +1,231 @@
+/*
+ * 02/17/2012
+ *
+ * SearchContext.java - Container for options of a search/replace operation.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+
+/**
+ * Contains information about a find/replace operation.  Applications can
+ * keep an instance of this class around and use it to maintain the user's
+ * selection for options such as "match case," "regular expression," etc.,
+ * between search operations.  They can then pass the instance as a parameter
+ * to the public {@link SearchEngine} methods to do the actual searching.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SearchEngine
+ */
+public class SearchContext {
+
+	private String searchFor;
+
+	private String replaceWith;
+
+	private boolean forward;
+
+	private boolean matchCase;
+
+	private boolean wholeWord;
+
+	private boolean regex;
+
+	private boolean selectionOnly;
+
+
+	/**
+	 * Creates a new search context.  Specifies a forward search,
+	 * case-insensitive, not whole-word, not a regular expression.
+	 */
+	public SearchContext() {
+		this(null);
+	}
+
+
+	/**
+	 * Creates a new search context.  Specifies a forward search,
+	 * case-insensitive, not whole-word, not a regular expression.
+	 *
+	 * @param searchFor The text to search for.
+	 */
+	public SearchContext(String searchFor) {
+		this.searchFor = searchFor;
+		forward = true;
+	}
+
+
+	/**
+	 * Returns whether case should be honored while searching.
+	 *
+	 * @return Whether case should be honored.
+	 * @see #setMatchCase(boolean)
+	 */
+	public boolean getMatchCase() {
+		return matchCase;
+	}
+
+
+	/**
+	 * Returns the text to replace with, if doing a replace operation.
+	 *
+	 * @return The text to replace with.
+	 * @see #setReplaceWith(String)
+	 * @see #getSearchFor()
+	 */
+	public String getReplaceWith() {
+		return replaceWith;
+	}
+
+
+	/**
+	 * Returns the text to search for.
+	 *
+	 * @return The text to search for.
+	 * @see #setSearchFor(String)
+	 * @see #getReplaceWith()
+	 */
+	public String getSearchFor() {
+		return searchFor;
+	}
+
+
+	/**
+	 * Returns whether the search should be forward through the text (vs.
+	 * backwards).
+	 *
+	 * @return Whether we should search forwards.
+	 * @see #setSearchForward(boolean)
+	 */
+	public boolean getSearchForward() {
+		return forward;
+	}
+
+
+	/**
+	 * Returns whether the search should only be done in the selected text.
+	 * This flag is currently not supported.
+	 *
+	 * @return Whether only the selected text should be searched.
+	 * @see #setSearchSelectionOnly(boolean)
+	 */
+	public boolean getSearchSelectionOnly() {
+		return selectionOnly;
+	}
+
+
+	/**
+	 * Returns whether only "whole word" matches should be returned.  A match
+	 * is considered to be "whole word" if the character on either side of the
+	 * matched text is a non-word character, or if there is no character on
+	 * one side of the word, such as when it's at the beginning or end of a
+	 * line.
+	 *
+	 * @return Whether only "whole word" matches should be returned.
+	 * @see #setWholeWord(boolean)
+	 */
+	public boolean getWholeWord() {
+		return wholeWord;
+	}
+
+
+	/**
+	 * Returns whether a regular expression search should be done.
+	 *
+	 * @return Whether a regular expression search should be done.
+	 * @see #setRegularExpression(boolean)
+	 */
+	public boolean isRegularExpression() {
+		return regex;
+	}
+
+
+	/**
+	 * Sets whether case should be honored while searching.
+	 *
+	 * @param matchCase Whether case should be honored.
+	 * @see #getMatchCase()
+	 */
+	public void setMatchCase(boolean matchCase) {
+		this.matchCase = matchCase;
+	}
+
+
+	/**
+	 * Sets whether a regular expression search should be done.
+	 *
+	 * @param regex Whether a regular expression search should be done.
+	 * @see #isRegularExpression()
+	 */
+	public void setRegularExpression(boolean regex) {
+		this.regex = regex;
+	}
+
+
+	/**
+	 * Sets the text to replace with, if doing a replace operation.
+	 *
+	 * @param replaceWith The text to replace with.
+	 * @see #getReplaceWith()
+	 * @see #setSearchFor(String)
+	 */
+	public void setReplaceWith(String replaceWith) {
+		this.replaceWith = replaceWith;
+	}
+
+
+	/**
+	 * Sets the text to search for.
+	 *
+	 * @param searchFor The text to search for.
+	 * @see #getSearchFor()
+	 * @see #setReplaceWith(String)
+	 */
+	public void setSearchFor(String searchFor) {
+		this.searchFor = searchFor;
+	}
+
+
+	/**
+	 * Sets whether the search should be forward through the text (vs.
+	 * backwards).
+	 *
+	 * @param forward Whether we should search forwards.
+	 * @see #getSearchForward()
+	 */
+	public void setSearchForward(boolean forward) {
+		this.forward = forward;
+	}
+
+
+	/**
+	 * Sets whether only the selected text should be searched.
+	 * This flag is currently not supported.
+	 *
+	 * @param selectionOnly Whether only selected text should be searched.
+	 * @see #getSearchSelectionOnly()
+	 */
+	public void setSearchSelectionOnly(boolean selectionOnly) {
+		this.selectionOnly = selectionOnly;
+	}
+
+
+	/**
+	 * Sets whether only "whole word" matches should be returned.  A match
+	 * is considered to be "whole word" if the character on either side of the
+	 * matched text is a non-word character, or if there is no character on
+	 * one side of the word, such as when it's at the beginning or end of a
+	 * line.
+	 *
+	 * @param wholeWord Whether only "whole word" matches should be returned.
+	 * @see #getWholeWord()
+	 */
+	public void setWholeWord(boolean wholeWord) {
+		this.wholeWord = wholeWord;
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/SearchEngine.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/SearchEngine.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/SearchEngine.java	(revision 25584)
@@ -0,0 +1,807 @@
+/*
+ * 02/19/2006
+ *
+ * SearchEngine.java - Handles find/replace operations in an RTextArea.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.JTextArea;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * A singleton class that can perform advanced find/replace operations
+ * in an {@link RTextArea}.  Simply create a {@link SearchContext} and call
+ * one of the following methods:
+ * 
+ * <ul>
+ *    <li>{@link #find(JTextArea, SearchContext)}
+ *    <li>{@link #replace(RTextArea, SearchContext)}
+ *    <li>{@link #replaceAll(RTextArea, SearchContext)}
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SearchContext
+ */
+public class SearchEngine {
+
+
+	/**
+	 * Private constructor to prevent instantiation.
+	 */
+	private SearchEngine() {
+	}
+
+
+	/**
+	 * Finds the next instance of the string/regular expression specified
+	 * from the caret position.  If a match is found, it is selected in this
+	 * text area.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @return Whether a match was found (and thus selected).
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the search text is an invalid regular expression.
+	 * @see #replace(RTextArea, SearchContext)
+	 * @see #replaceAll(RTextArea, SearchContext)
+	 */
+	public static boolean find(JTextArea textArea, SearchContext context) {
+
+		String text = context.getSearchFor();
+		if (text==null || text.length()==0) {
+			return false;
+		}
+
+		// Be smart about what position we're "starting" at.  We don't want
+		// to find a match in the currently selected text (if any), so we
+		// start searching AFTER the selection if searching forward, and
+		// BEFORE the selection if searching backward.
+		Caret c = textArea.getCaret();
+		boolean forward = context.getSearchForward();
+		int start = forward ? Math.max(c.getDot(), c.getMark()) :
+						Math.min(c.getDot(), c.getMark());
+
+		String findIn = getFindInText(textArea, start, forward);
+		if (findIn==null || findIn.length()==0) return false;
+
+		// Find the next location of the text we're searching for.
+		if (!context.isRegularExpression()) {
+			int pos = getNextMatchPos(text, findIn, forward,
+								context.getMatchCase(), context.getWholeWord());
+			findIn = null; // May help garbage collecting.
+			if (pos!=-1) {
+				// Without this, if JTextArea isn't in focus, selection
+				// won't appear selected.
+				c.setSelectionVisible(true);
+				pos = forward ? start+pos : pos;
+				selectAndPossiblyCenter(textArea, pos, pos+text.length());
+				return true;
+			}
+		}
+		else {
+			// Regex matches can have varying widths.  The returned point's
+			// x- and y-values represent the start and end indices of the
+			// match in findIn.
+			Point regExPos = getNextMatchPosRegEx(text, findIn, forward,
+								context.getMatchCase(), context.getWholeWord());
+			findIn = null; // May help garbage collecting.
+			if (regExPos!=null) {
+				// Without this, if JTextArea isn't in focus, selection
+				// won't appear selected.
+				c.setSelectionVisible(true);
+				if (forward) {
+					regExPos.translate(start, start);
+				}
+				selectAndPossiblyCenter(textArea, regExPos.x, regExPos.y);
+				return true;
+			}
+		}
+
+		// No match.
+		return false;
+
+	}
+
+
+	/**
+	 * Returns the text in which to search, as a string.  This is used
+	 * internally to grab the smallest buffer possible in which to search.
+	 */
+	private static String getFindInText(JTextArea textArea, int start,
+									boolean forward) {
+
+		// Be smart about the text we grab to search in.  We grab more than
+		// a single line because our searches can return multiline results.
+		// We copy only the chars that will be searched through.
+		String findIn = null;
+		if (forward) {
+			try {
+				findIn = textArea.getText(start,
+							textArea.getDocument().getLength()-start);
+			} catch (BadLocationException ble) {
+				// Never happens; findIn will be null anyway.
+				ble.printStackTrace();
+			}
+		}
+		else { // backward
+			try {
+				findIn = textArea.getText(0, start);
+			} catch (BadLocationException ble) {
+				// Never happens; findIn will be null anyway.
+				ble.printStackTrace();
+			}
+		}
+
+		return findIn;
+
+	}
+
+
+	/**
+	 * This method is called internally by
+	 * <code>getNextMatchPosRegExImpl</code> and is used to get the locations
+	 * of all regular-expression matches, and possibly their replacement
+	 * strings.<p>
+	 *
+	 * Returns either:
+	 * <ul>
+	 *   <li>A list of points representing the starting and ending positions
+	 *       of all matches returned by the specified matcher, or
+	 *   <li>A list of <code>RegExReplaceInfo</code>s describing the matches
+	 *       found by the matcher and the replacement strings for each.
+	 * </ul>
+	 *
+	 * If <code>replacement</code> is <code>null</code>, this method call is
+	 * assumed to be part of a "find" operation and points are returned.  If
+	 * if is non-<code>null</code>, it is assumed to be part of a "replace"
+	 * operation and the <code>RegExReplaceInfo</code>s are returned.<p>
+	 *
+	 * @param m The matcher.
+	 * @param replaceStr The string to replace matches with.  This is a
+	 *        "template" string and can contain captured group references in
+	 *        the form "<code>${digit}</code>".
+	 * @return A list of result objects.
+	 * @throws IndexOutOfBoundsException If <code>replaceStr</code> references
+	 *         an invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 */
+	private static List getMatches(Matcher m, String replaceStr) {
+		ArrayList matches = new ArrayList();
+		while (m.find()) {
+			Point loc = new Point(m.start(), m.end());
+			if (replaceStr==null) { // Find, not replace.
+				matches.add(loc);
+			}
+			else { // Replace.
+				matches.add(new RegExReplaceInfo(m.group(0), loc.x, loc.y,
+								getReplacementText(m, replaceStr)));
+			}
+		}
+		return matches;
+	}
+
+
+	/**
+	 * Searches <code>searchIn</code> for an occurrence of
+	 * <code>searchFor</code> either forwards or backwards, matching
+	 * case or not.<p>
+	 *
+	 * Most clients will have no need to call this method directly.
+	 *
+	 * @param searchFor The string to look for.
+	 * @param searchIn The string to search in.
+	 * @param forward Whether to search forward or backward in
+	 *        <code>searchIn</code>.
+	 * @param matchCase If <code>true</code>, do a case-sensitive search for
+	 *        <code>searchFor</code>.
+	 * @param wholeWord If <code>true</code>, <code>searchFor</code>
+	 *        occurrences embedded in longer words in <code>searchIn</code>
+	 *        don't count as matches.
+	 * @return The starting position of a match, or <code>-1</code> if no
+	 *         match was found.
+	 */
+	public static final int getNextMatchPos(String searchFor, String searchIn,
+								boolean forward, boolean matchCase,
+								boolean wholeWord) {
+
+		// Make our variables lower case if we're ignoring case.
+		if (!matchCase) {
+			return getNextMatchPosImpl(searchFor.toLowerCase(),
+								searchIn.toLowerCase(), forward,
+								matchCase, wholeWord);
+		}
+
+		return getNextMatchPosImpl(searchFor, searchIn, forward,
+								matchCase, wholeWord);
+
+	}
+
+
+	/**
+	 * Actually does the work of matching; assumes searchFor and searchIn
+	 * are already upper/lower-cased appropriately.<br>
+	 * The reason this method is here is to attempt to speed up
+	 * <code>FindInFilesDialog</code>; since it repeatedly calls
+	 * this method instead of <code>getNextMatchPos</code>, it gets better
+	 * performance as it no longer has to allocate a lower-cased string for
+	 * every call.
+	 *
+	 * @param searchFor The string to search for.
+	 * @param searchIn The string to search in.
+	 * @param goForward Whether the search is forward or backward.
+	 * @param matchCase Whether the search is case-sensitive.
+	 * @param wholeWord Whether only whole words should be matched.
+	 * @return The location of the next match, or <code>-1</code> if no
+	 *         match was found.
+	 */
+	private static final int getNextMatchPosImpl(String searchFor,
+								String searchIn, boolean goForward,
+								boolean matchCase, boolean wholeWord) {
+
+		if (wholeWord) {
+			int len = searchFor.length();
+			int temp = goForward ? 0 : searchIn.length();
+			int tempChange = goForward ? 1 : -1;
+			while (true) {
+				if (goForward)
+					temp = searchIn.indexOf(searchFor, temp);
+				else
+					temp = searchIn.lastIndexOf(searchFor, temp);
+				if (temp!=-1) {
+					if (isWholeWord(searchIn, temp, len)) {
+						return temp;
+					}
+					else {
+						temp += tempChange;
+						continue;
+					}
+				}
+				return temp; // Always -1.
+			}
+		}
+		else {
+			return goForward ? searchIn.indexOf(searchFor) :
+							searchIn.lastIndexOf(searchFor);
+		}
+
+	}
+
+
+	/**
+	 * Searches <code>searchIn</code> for an occurrence of <code>regEx</code>
+	 * either forwards or backwards, matching case or not.
+	 *
+	 * @param regEx The regular expression to look for.
+	 * @param searchIn The string to search in.
+	 * @param goForward Whether to search forward.  If <code>false</code>,
+	 *        search backward.
+	 * @param matchCase Whether or not to do a case-sensitive search for
+	 *        <code>regEx</code>.
+	 * @param wholeWord If <code>true</code>, <code>regEx</code>
+	 *        occurrences embedded in longer words in <code>searchIn</code>
+	 *        don't count as matches.
+	 * @return A <code>Point</code> representing the starting and ending
+	 *         position of the match, or <code>null</code> if no match was
+	 *         found.
+	 * @throws PatternSyntaxException If <code>regEx</code> is an invalid
+	 *         regular expression.
+	 * @see #getNextMatchPos
+	 */
+	private static Point getNextMatchPosRegEx(String regEx,
+							CharSequence searchIn, boolean goForward,
+							boolean matchCase, boolean wholeWord) {
+		return (Point)getNextMatchPosRegExImpl(regEx, searchIn, goForward,
+									matchCase, wholeWord, null);
+	}
+
+
+	/**
+	 * Searches <code>searchIn</code> for an occurrence of <code>regEx</code>
+	 * either forwards or backwards, matching case or not.
+	 *
+	 * @param regEx The regular expression to look for.
+	 * @param searchIn The string to search in.
+	 * @param goForward Whether to search forward.  If <code>false</code>,
+	 *        search backward.
+	 * @param matchCase Whether or not to do a case-sensitive search for
+	 *        <code>regEx</code>.
+	 * @param wholeWord If <code>true</code>, <code>regEx</code>
+	 *        occurrences embedded in longer words in <code>searchIn</code>
+	 *        don't count as matches.
+	 * @param replaceStr The string that will replace the match found (if
+	 *        a match is found).  The object returned will contain the
+	 *        replacement string with matched groups substituted.  If this
+	 *        value is <code>null</code>, it is assumed this call is part of a
+	 *        "find" instead of a "replace" operation.
+	 * @return If <code>replaceStr</code> is <code>null</code>, a
+	 *         <code>Point</code> representing the starting and ending points
+	 *         of the match.  If it is non-<code>null</code>, an object with
+	 *         information about the match and the morphed string to replace
+	 *         it with.  If no match is found, <code>null</code> is returned.
+	 * @throws PatternSyntaxException If <code>regEx</code> is an invalid
+	 *         regular expression.
+	 * @throws IndexOutOfBoundsException If <code>replaceStr</code> references
+	 *         an invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 * @see #getNextMatchPos
+	 */
+	private static Object getNextMatchPosRegExImpl(String regEx,
+							CharSequence searchIn, boolean goForward,
+							boolean matchCase, boolean wholeWord,
+							String replaceStr) {
+
+		if (wholeWord) {
+			regEx = "\\b" + regEx + "\\b";
+		}
+
+		// Make a pattern that takes into account whether or not to match case.
+		int flags = Pattern.MULTILINE; // '^' and '$' are done per line.
+		flags |= matchCase ? 0 : (Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
+		Pattern pattern = Pattern.compile(regEx, flags);
+
+		// Make a Matcher to find the regEx instances.
+		Matcher m = pattern.matcher(searchIn);
+
+		// Search forwards
+		if (goForward) {
+			if (m.find()) {
+				if (replaceStr==null) { // Find, not replace.
+					return new Point(m.start(), m.end());
+				}
+				// Otherwise, replace
+				return new RegExReplaceInfo(m.group(0),
+						m.start(), m.end(),
+						getReplacementText(m, replaceStr));
+			}
+		}
+
+		// Search backwards
+		else {
+			List matches = getMatches(m, replaceStr);
+			if (!matches.isEmpty()) {
+				return matches.get(matches.size()-1);
+			}
+		}
+
+		return null; // No match found
+
+	}
+
+
+	/**
+	 * Returns information on how to implement a regular expression "replace"
+	 * action in the specified text with the specified replacement string.
+	 *
+	 * @param searchIn The string to search in.
+	 * @param context The search options.
+	 * @return A <code>RegExReplaceInfo</code> object describing how to
+	 *         implement the replace.
+	 * @throws PatternSyntaxException If the search text is an invalid regular
+	 *         expression.
+	 * @throws IndexOutOfBoundsException If the replacement text references an
+	 *         invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 * @see #getNextMatchPos
+	 */
+	private static RegExReplaceInfo getRegExReplaceInfo(String searchIn,
+										SearchContext context) {
+		// Can't pass null to getNextMatchPosRegExImpl or it'll think
+		// you're doing a "find" operation instead of "replace, and return a
+		// Point.
+		String replacement = context.getReplaceWith();
+		if (replacement==null) {
+			replacement = "";
+		}
+		String regex = context.getSearchFor();
+		boolean goForward = context.getSearchForward();
+		boolean matchCase = context.getMatchCase();
+		boolean wholeWord = context.getWholeWord();
+		return (RegExReplaceInfo)getNextMatchPosRegExImpl(regex, searchIn,
+						goForward, matchCase, wholeWord, replacement);
+	}
+
+
+	/**
+	 * Called internally by <code>getMatches()</code>.  This method assumes
+	 * that the specified matcher has just found a match, and that you want
+	 * to get the string with which to replace that match.<p>
+	 *
+	 * Escapes simply insert the escaped character, except for <code>\n</code>
+	 * and <code>\t</code>, which insert a newline and tab respectively.
+	 * Substrings of the form <code>$\d+</code> are considered to be matched
+	 * groups.  To include a literal dollar sign in your template, escape it
+	 * (i.e. <code>\$</code>).<p>
+	 *
+	 * Most clients will have no need to call this method directly.
+	 *
+	 * @param m The matcher.
+	 * @param template The template for the replacement string.  For example,
+	 *        "<code>foo</code>" would yield the replacement string
+	 *        "<code>foo</code>", while "<code>$1 is the greatest</code>"
+	 *        would yield different values depending on the value of the first
+	 *        captured group in the match.
+	 * @return The string to replace the match with.
+	 * @throws IndexOutOfBoundsException If <code>template</code> references
+	 *         an invalid group (less than zero or greater than the number of
+	 *         groups matched).
+	 */
+	public static String getReplacementText(Matcher m, CharSequence template) {
+
+		// NOTE: This code was mostly ripped off from J2SE's Matcher
+		// class.
+
+		// Process substitution string to replace group references with groups
+		int cursor = 0;
+		StringBuffer result = new StringBuffer();
+
+		while (cursor < template.length()) {
+	
+			char nextChar = template.charAt(cursor);
+	
+			if (nextChar == '\\') { // Escape character.
+				nextChar = template.charAt(++cursor);
+				switch (nextChar) { // Special cases.
+					case 'n':
+						nextChar = '\n';
+						break;
+					case 't':
+						nextChar = '\t';
+						break;
+				}
+				result.append(nextChar);
+				cursor++;
+			}
+			else if (nextChar == '$') { // Group reference.
+
+				cursor++; // Skip the '$'.
+
+				// The first number is always a group
+				int refNum = template.charAt(cursor) - '0';
+				if ((refNum < 0)||(refNum > 9)) {
+					// This should really be an IllegalArgumentException,
+					// but we cheat to keep all "group" errors throwing
+					// the same exception type.
+					throw new IndexOutOfBoundsException(
+								"No group " + template.charAt(cursor));
+				}
+				cursor++;
+
+				// Capture the largest legal group string
+				boolean done = false;
+				while (!done) {
+					if (cursor >= template.length()) {
+						break;
+					}
+					int nextDigit = template.charAt(cursor) - '0';
+					if ((nextDigit < 0)||(nextDigit > 9)) { // not a number
+						break;
+					}
+					int newRefNum = (refNum * 10) + nextDigit;
+					if (m.groupCount() < newRefNum) {
+						done = true;
+					}
+					else {
+						refNum = newRefNum;
+						cursor++;
+					}
+				}
+
+				// Append group
+				if (m.group(refNum) != null)
+					result.append(m.group(refNum));
+
+			}
+
+			else {
+				result.append(nextChar);
+				cursor++;
+			}
+
+		}
+
+		return result.toString();
+
+	}
+
+
+	/**
+	 * Returns whether the characters on either side of
+	 * <code>substr(searchIn, startPos, startPos+searchStringLength)</code>
+	 * are <em>not</em> letters or digits.
+	 */
+	private static final boolean isWholeWord(CharSequence searchIn,
+											int offset, int len) {
+
+		boolean wsBefore, wsAfter;
+
+		try {
+			wsBefore = !Character.isLetterOrDigit(searchIn.charAt(offset - 1));
+		} catch (IndexOutOfBoundsException e) { wsBefore = true; }
+		try {
+			wsAfter  = !Character.isLetterOrDigit(searchIn.charAt(offset + len));
+		} catch (IndexOutOfBoundsException e) { wsAfter = true; }
+
+		return wsBefore && wsAfter;
+
+	}
+
+
+	/**
+	 * Makes the caret's dot and mark the same location so that, for the
+	 * next search in the specified direction, a match will be found even
+	 * if it was within the original dot and mark's selection.
+	 *
+	 * @param textArea The text area.
+	 * @param forward Whether the search will be forward through the
+	 *        document (<code>false</code> means backward).
+	 * @return The new dot and mark position.
+	 */
+	private static int makeMarkAndDotEqual(JTextArea textArea,
+										boolean forward) {
+		Caret c = textArea.getCaret();
+		int val = forward ? Math.min(c.getDot(), c.getMark()) :
+						Math.max(c.getDot(), c.getMark());
+		c.setDot(val);
+		return val;
+	}
+
+
+	/**
+	 * Finds the next instance of the regular expression specified from
+	 * the caret position.  If a match is found, it is replaced with
+	 * the specified replacement string.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @return Whether a match was found (and thus replaced).
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the search text is an invalid regular expression.
+	 * @throws IndexOutOfBoundsException If this is a regular expression search
+	 *         but the replacement text references an invalid group (less than
+	 *         zero or greater than the number of groups matched).
+	 * @see #replace(RTextArea, SearchContext)
+	 * @see #find(JTextArea, SearchContext)
+	 */
+	private static boolean regexReplace(JTextArea textArea,
+			SearchContext context) throws PatternSyntaxException {
+
+		// Be smart about what position we're "starting" at.  For example,
+		// if they are searching backwards and there is a selection such that
+		// the dot is past the mark, and the selection is the text for which
+		// you're searching, this search will find and return the current
+		// selection.  So, in that case we start at the beginning of the
+		// selection.
+		Caret c = textArea.getCaret();
+		boolean forward = context.getSearchForward();
+		int start = makeMarkAndDotEqual(textArea, forward);
+
+		String findIn = getFindInText(textArea, start, forward);
+		if (findIn==null) return false;
+
+		// Find the next location of the text we're searching for.
+		RegExReplaceInfo info = getRegExReplaceInfo(findIn, context);
+
+		findIn = null; // May help garbage collecting.
+
+		// If a match was found, do the replace and return!
+		if (info!=null) {
+
+			// Without this, if JTextArea isn't in focus, selection won't
+			// appear selected.
+			c.setSelectionVisible(true);
+
+			int matchStart = info.getStartIndex();
+			int matchEnd = info.getEndIndex();
+			if (forward) {
+				matchStart += start;
+				matchEnd += start;
+			}
+			selectAndPossiblyCenter(textArea, matchStart, matchEnd);
+			textArea.replaceSelection(info.getReplacement());
+
+			return true;
+
+		}
+
+		// No match.
+		return false;
+
+	}
+
+
+	/**
+	 * Finds the next instance of the text/regular expression specified from
+	 * the caret position.  If a match is found, it is replaced with the
+	 * specified replacement string.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @return Whether a match was found (and thus replaced).
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the search text is an invalid regular expression.
+	 * @throws IndexOutOfBoundsException If this is a regular expression search
+	 *         but the replacement text references an invalid group (less than
+	 *         zero or greater than the number of groups matched).
+	 * @see #replaceAll(RTextArea, SearchContext)
+	 * @see #find(JTextArea, SearchContext)
+	 */
+	public static boolean replace(RTextArea textArea, SearchContext context)
+									throws PatternSyntaxException {
+
+		String toFind = context.getSearchFor();
+		if (toFind==null || toFind.length()==0) {
+			return false;
+		}
+
+		textArea.beginAtomicEdit();
+		try {
+
+			// Regular expression replacements have their own method.
+			if (context.isRegularExpression()) {
+				return regexReplace(textArea, context);
+			}
+
+			// Plain text search.  If we find it, replace it!
+			// First make the dot and mark equal (get rid of any selection), as
+			// a common use-case is the user will use "Find" to select the text
+			// to replace, then click "Replace" to replace the current
+			// selection. Since our find() method searches from an endpoint of
+			// the selection, we must remove the selection to work properly.
+			makeMarkAndDotEqual(textArea, context.getSearchForward());
+			if (find(textArea, context)) {
+				textArea.replaceSelection(context.getReplaceWith());
+				return true;
+			}
+
+		} finally {
+			textArea.endAtomicEdit();
+		}
+
+		return false;
+
+	}
+
+
+	/**
+	 * Replaces all instances of the text/regular expression specified in
+	 * the specified document with the specified replacement.
+	 *
+	 * @param textArea The text area in which to search.
+	 * @param context What to search for and all search options.
+	 * @throws PatternSyntaxException If this is a regular expression search
+	 *         but the replacement text is an invalid regular expression.
+	 * @throws IndexOutOfBoundsException If this is a regular expression search
+	 *         but the replacement text references an invalid group (less than
+	 *         zero or greater than the number of groups matched).
+	 * @see #replace(RTextArea, SearchContext)
+	 * @see #find(JTextArea, SearchContext)
+	 */
+	public static int replaceAll(RTextArea textArea, SearchContext context)
+									throws PatternSyntaxException {
+
+		String toFind = context.getSearchFor();
+		if (toFind==null || toFind.length()==0) {
+			return 0;
+		}
+
+		int count = 0;
+
+		textArea.beginAtomicEdit();
+		try {
+			int oldOffs = textArea.getCaretPosition();
+			textArea.setCaretPosition(0);
+			while (SearchEngine.replace(textArea, context)) {
+				count++;
+			}
+			if (count==0) { // If nothing was found, don't move the caret.
+				textArea.setCaretPosition(oldOffs);
+			}
+		} finally {
+			textArea.endAtomicEdit();
+		}
+
+		return count;
+
+	}
+
+
+	/**
+	 * Selects a range of text in a text component.  If the new selection is
+	 * outside of the previous viewable rectangle, then the view is centered
+	 * around the new selection.
+	 *
+	 * @param textArea The text component whose selection is to be centered.
+	 * @param start The start of the range to select.
+	 * @param end The end of the range to select.
+	 */
+	private static void selectAndPossiblyCenter(JTextArea textArea, int start,
+												int end) {
+
+		boolean foldsExpanded = false;
+		if (textArea instanceof RSyntaxTextArea) {
+			RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+			FoldManager fm = rsta.getFoldManager();
+			if (fm.isCodeFoldingSupportedAndEnabled()) {
+				foldsExpanded = fm.ensureOffsetNotInClosedFold(start);
+				foldsExpanded |= fm.ensureOffsetNotInClosedFold(end);
+			}
+		}
+
+		textArea.setSelectionStart(start);
+		textArea.setSelectionEnd(end);
+
+		Rectangle r = null;
+		try {
+			r = textArea.modelToView(start);
+			if (r==null) { // Not yet visible; i.e. JUnit tests
+				return;
+			}
+			if (end!=start) {
+				r = r.union(textArea.modelToView(end));
+			}
+		} catch (BadLocationException ble) { // Never happens
+			ble.printStackTrace();
+			textArea.setSelectionStart(start);
+			textArea.setSelectionEnd(end);
+			return;
+		}
+
+		Rectangle visible = textArea.getVisibleRect();
+
+		// If the new selection is already in the view, don't scroll,
+		// as that is visually jarring.
+		if (!foldsExpanded && visible.contains(r)) {
+			textArea.setSelectionStart(start);
+			textArea.setSelectionEnd(end);
+			return;
+		}
+
+		visible.x = r.x - (visible.width - r.width) / 2;
+		visible.y = r.y - (visible.height - r.height) / 2;
+
+		Rectangle bounds = textArea.getBounds();
+		Insets i = textArea.getInsets();
+		bounds.x = i.left;
+		bounds.y = i.top;
+		bounds.width -= i.left + i.right;
+		bounds.height -= i.top + i.bottom;
+
+		if (visible.x < bounds.x) {
+			visible.x = bounds.x;
+		}
+
+		if (visible.x + visible.width > bounds.x + bounds.width) {
+			visible.x = bounds.x + bounds.width - visible.width;
+		}
+
+		if (visible.y < bounds.y) {
+			visible.y = bounds.y;
+		}
+
+		if (visible.y + visible.height > bounds.y + bounds.height) {
+			visible.y = bounds.y + bounds.height - visible.height;
+		}
+
+		textArea.scrollRectToVisible(visible);
+
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ToolTipSupplier.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ToolTipSupplier.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/ToolTipSupplier.java	(revision 25584)
@@ -0,0 +1,39 @@
+/*
+ * 02/05/2009
+ *
+ * ToolTipSupplier.java - Can provide tool tips to RTextAreas without the need
+ * for subclassing.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.event.MouseEvent;
+
+
+/**
+ * A <tt>ToolTipSupplier</tt> can create tool tip text for an <tt>RTextArea</tt>
+ * on its behalf.  A text area will check its <tt>ToolTipSupplier</tt> for a
+ * tool tip before calling the super class's implementation of
+ * {@link RTextArea#getToolTipText()}.  This allows
+ * applications to intercept tool tip events and provide the text for a tool
+ * tip without subclassing <tt>RTextArea</tt>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ToolTipSupplier {
+
+
+	/**
+	 * Returns the tool tip text to display for a given mouse event.
+	 *
+	 * @param textArea The text area.
+	 * @param e The mouse event.
+	 * @return The tool tip, or <code>null</code> if none.
+	 */
+	public String getToolTipText(RTextArea textArea, MouseEvent e);
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java	(revision 25584)
@@ -0,0 +1,136 @@
+/*
+ * 01/22/2005
+ *
+ * VolatileImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image using VolatileImages.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.image.VolatileImage;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image.  The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * A <code>java.awt.image.VolatileImage</code> is used for rendering;
+ * theoretically, this should be the best image format for performance.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.BufferedImageBackgroundPainterStrategy
+ */
+public class VolatileImageBackgroundPainterStrategy
+					extends ImageBackgroundPainterStrategy {
+
+	private VolatileImage bgImage;
+
+
+	/**
+	 * Constructor.
+	 *
+	 * @param ta The text area whose background we'll be painting.
+	 */
+	public VolatileImageBackgroundPainterStrategy(RTextAreaBase ta) {
+		super(ta);
+	}
+
+
+	/**
+	 * Paints the image at the specified location.  This method assumes
+	 * scaling has already been done, and simply paints the background
+	 * image "as-is."
+	 *
+	 * @param g The graphics context.
+	 * @param x The x-coordinate at which to paint.
+	 * @param y The y-coordinate at which to paint.
+	 */
+	protected void paintImage(Graphics g, int x, int y) {
+		if (bgImage != null) {
+			do {
+				int rc = bgImage.validate(null);//getGraphicsConfiguration());
+				if (rc==VolatileImage.IMAGE_RESTORED) {
+					// FIXME:  If the image needs to be restored are its width
+					// and height still valid??  If not, we'll need to cache
+					// these values...
+					renderImage(bgImage.getWidth(), bgImage.getHeight(),
+						getScalingHint());
+				}
+				g.drawImage(bgImage, x,y, null);
+			} while (bgImage.contentsLost());
+		}
+	}
+
+
+	/**
+	 * Renders the image at the proper size into <code>bgImage</code>.
+	 * This method assumes that <code>bgImage</code> is not
+	 * <code>null</code>.
+	 *
+	 * @param width The width of the volatile image to render into.
+	 * @param height The height of the volatile image to render into.
+	 * @param hint The scaling hint to use.
+	 */
+	protected void renderImage(int width, int height, int hint) {
+		Image master = getMasterImage();
+		if (master!=null) {
+			do {
+				Image i = master.getScaledInstance(width,height, hint);
+				tracker.addImage(i, 1);
+				try {
+					tracker.waitForID(1);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+					bgImage = null;
+					return;
+				} finally {
+					tracker.removeImage(i, 1);
+				}
+				bgImage.getGraphics().drawImage(i, 0,0, null);
+				tracker.addImage(bgImage, 0);
+				try {
+					tracker.waitForID(0);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+					bgImage = null;
+					return;
+				} finally {
+					tracker.removeImage(bgImage, 0);
+				}
+			} while (bgImage.contentsLost());
+		} // End of if (master!=null).
+		else {
+			bgImage = null;
+		}
+	}
+
+
+	/**
+	 * Rescales the displayed image to be the specified size.
+	 *
+	 * @param width The new width of the image.
+	 * @param height The new height of the image.
+	 * @param hint The scaling hint to use.
+	 */
+	protected void rescaleImage(int width, int height, int hint) {
+		bgImage = getRTextAreaBase().createVolatileImage(width, height);
+		if (bgImage!=null)
+			renderImage(width, height, hint);
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/ui/rtextarea/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	A single-font text editor with many custom features.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/org/fife/util/DynamicIntArray.java
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/util/DynamicIntArray.java	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/util/DynamicIntArray.java	(revision 25584)
@@ -0,0 +1,371 @@
+/*
+ * 03/26/2004
+ *
+ * DynamicIntArray.java - Similar to an ArrayList, but holds ints instead
+ * of Objects.
+ * 
+ * This library is distributed under a modified BSD license.  See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.util;
+
+import java.io.Serializable;
+
+
+/**
+ * Similar to a <code>java.util.ArrayList</code>, but specifically for
+ * <code>int</code>s.  This is basically an array of integers that resizes
+ * itself (if necessary) when adding new elements.
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ */
+public class DynamicIntArray implements Serializable {
+
+	/**
+	 * The actual data.
+	 */
+	private int[] data;
+
+	/**
+	 * The number of values in the array.  Note that this is NOT the
+	 * capacity of the array; rather, <code>size &lt;= capacity</code>.
+	 */
+	private int size;
+
+
+	/**
+	 * Constructs a new array object with an initial capacity of 10.
+	 */
+	public DynamicIntArray() {
+		this(10);
+	}
+
+
+	/**
+	 * Constructs a new array object with a given initial capacity.
+	 *
+	 * @param initialCapacity The initial capacity.
+	 * @throws IllegalArgumentException If <code>initialCapacity</code> is
+	 *         negative.
+	 */
+	public DynamicIntArray(int initialCapacity) {
+		if (initialCapacity<0) {
+			throw new IllegalArgumentException("Illegal initialCapacity: "
+												+ initialCapacity);
+		}
+		data = new int[initialCapacity];
+		size = 0;
+	}
+
+
+	/**
+	 * Constructs a new array object from the given int array.  The resulting
+	 * <code>DynamicIntArray</code> will have an initial capacity of 110%
+	 * the size of the array.
+	 *
+	 * @param intArray Initial data for the array object.
+	 * @throws NullPointerException If <code>intArray</code> is
+	 *         <code>null</code>.
+	 */
+	public DynamicIntArray(int[] intArray) {
+		size = intArray.length;
+		int capacity = (int)Math.min(size*110L/100, Integer.MAX_VALUE);
+		data = new int[capacity];
+		System.arraycopy(intArray,0, data,0, size); // source, dest, length.
+	}
+
+
+	/**
+	 * Appends the specified <code>int</code> to the end of this array.
+	 *
+	 * @param value The <code>int</code> to be appended to this array.
+	 */
+	public void add(int value) {
+		ensureCapacity(size + 1);
+		data[size++] = value;
+	}
+
+
+	/**
+	 * Inserts all <code>int</code>s in the specified array into this array
+	 * object at the specified location.  Shifts the <code>int</code>
+	 * currently at that position (if any) and any subsequent
+	 * <code>int</code>s to the right (adds one to their indices).
+	 *
+	 * @param index The index at which the specified integer is to be
+	 *        inserted.
+	 * @param intArray The array of <code>int</code>s to insert.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than <code>getSize()</code>.
+	 * @throws NullPointerException If <code>intArray<code> is
+	 *         <code>null<code>.
+	 */
+	public void add(int index, int[] intArray) {
+		if (index>size) {
+			throwException2(index);
+		}
+		int addCount = intArray.length;
+		ensureCapacity(size+addCount);
+		int moveCount = size - index;
+		if (moveCount>0)
+			System.arraycopy(data,index, data,index+addCount, moveCount);
+		System.arraycopy(data,index, intArray,0, moveCount);
+		size += addCount;
+	}
+
+
+	/**
+	 * Inserts the specified <code>int</code> at the specified position in
+	 * this array. Shifts the <code>int</code> currently at that position (if
+	 * any) and any subsequent <code>int</code>s to the right (adds one to
+	 * their indices).
+	 *
+	 * @param index The index at which the specified integer is to be
+	 *        inserted.
+	 * @param value The <code>int</code> to be inserted.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than <code>getSize()</code>.
+	 */
+	public void add(int index, int value) {
+		if (index>size) {
+			throwException2(index);
+		}
+		ensureCapacity(size+1);
+		System.arraycopy(data,index, data,index+1, size-index);
+		data[index] = value;
+		size++;
+	}
+
+
+	/**
+	 * Removes all values from this array object.  Capacity will remain the
+	 * same.
+	 */
+	public void clear() {
+		size = 0;
+	}
+
+
+	/**
+	 * Returns whether this array contains a given integer.  This method
+	 * performs a linear search, so it is not optimized for performance.
+	 *
+	 * @param integer The <code>int</code> for which to search.
+	 * @return Whether the given integer is contained in this array.
+	 */
+	public boolean contains(int integer) {
+		for (int i=0; i<size; i++) {
+			if (data[i]==integer)
+				return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * Makes sure that this <code>DynamicIntArray</code> instance can hold
+	 * at least the number of elements specified.  If it can't, then the
+	 * capacity is increased.
+	 *
+	 * @param minCapacity The desired minimum capacity.
+	 */
+	private final void ensureCapacity(int minCapacity) {
+		int oldCapacity = data.length;
+		if (minCapacity > oldCapacity) {
+			int[] oldData = data;
+			// Ensures we don't just keep increasing capacity by some small
+			// number like 1...
+			int newCapacity = (oldCapacity * 3)/2 + 1;
+			if (newCapacity < minCapacity)
+				newCapacity = minCapacity;
+			data = new int[newCapacity];
+			System.arraycopy(oldData,0, data,0, size);
+		}
+	}
+
+
+	/**
+	 * Returns the <code>int</code> at the specified position in this array
+	 * object.
+	 *
+	 * @param index The index of the <code>int</code> to return.
+	 * @return The <code>int</code> at the specified position in this array.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than or equal to <code>getSize()</code>.
+	 */
+	public int get(int index) {
+		// Small enough to be inlined, and throwException() is rarely called.
+		if (index>=size) {
+			throwException(index);
+		}
+		return data[index];
+	}
+
+
+	/**
+	 * Returns the <code>int</code> at the specified position in this array
+	 * object, without doing any bounds checking.  You really should use
+	 * {@link #get(int)} instead of this method.
+	 *
+	 * @param index The index of the <code>int</code> to return.
+	 * @return The <code>int</code> at the specified position in this array.
+	 */
+	public int getUnsafe(int index) {
+		// Small enough to be inlined.
+		return data[index];
+	}
+
+
+	/**
+	 * Returns the number of <code>int</code>s in this array object.
+	 *
+	 * @return The number of <code>int</code>s in this array object.
+	 */
+	public int getSize() {
+		return size;
+	}
+
+
+	/**
+	 * Returns whether or not this array object is empty.
+	 *
+	 * @return Whether or not this array object contains no elements.
+	 */
+	public boolean isEmpty() {
+		return size==0;
+	}
+
+
+	/**
+	 * Removes the <code>int</code> at the specified location from this array
+	 * object.
+	 *
+	 * @param index The index of the <code>int</code> to remove.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than or equal to <code>getSize()</code>.
+	 */
+	public void remove(int index) {
+		if (index>=size) {
+			throwException(index);
+		}
+		int toMove = size - index - 1;
+		if (toMove>0) {
+			System.arraycopy(data,index+1, data,index, toMove);
+		}
+		--size;
+	}
+
+
+	/**
+	 * Removes the <code>int</code>s in the specified range from this array
+	 * object.
+	 *
+	 * @param fromIndex The index of the first <code>int</code> to remove.
+	 * @param toIndex The index AFTER the last <code>int</code> to remove.
+	 * @throws IndexOutOfBoundsException If either of <code>fromIndex</code>
+	 *         or <code>toIndex</code> is less than zero or greater than or
+	 *         equal to <code>getSize()</code>.
+	 */
+	public void removeRange(int fromIndex, int toIndex) {
+		if (fromIndex>=size || toIndex>size) {
+			throwException3(fromIndex, toIndex);
+		}
+		int moveCount = size - toIndex;
+		System.arraycopy(data,toIndex, data,fromIndex, moveCount);
+		size -= (toIndex - fromIndex);
+	}
+
+		
+	/**
+	 * Sets the <code>int</code> value at the specified position in this
+	 * array object.
+	 *
+	 * @param index The index of the <code>int</code> to set
+	 * @param value The value to set it to.
+	 * @throws IndexOutOfBoundsException If <code>index</code> is less than
+	 *         zero or greater than or equal to <code>getSize()</code>.
+	 */
+	public void set(int index, int value) {
+		// Small enough to be inlined, and throwException() is rarely called.
+		if (index>=size) {
+			throwException(index);
+		}
+		data[index] = value;
+	}
+
+
+	/**
+	 * Sets the <code>int</code> value at the specified position in this
+	 * array object, without doing any bounds checking.  You should use
+	 * {@link #set(int, int)} instead of this method.
+	 *
+	 * @param index The index of the <code>int</code> to set
+	 * @param value The value to set it to.
+	 */
+	public void setUnsafe(int index, int value) {
+		// Small enough to be inlined.
+		data[index] = value;
+	}
+
+
+	/**
+	 * Throws an exception.  This method isolates error-handling code from
+	 * the error-checking code, so that callers (e.g. {@link #get} and
+	 * {@link #set}) can be both small enough to be inlined, as well as
+	 * not usually make any expensive method calls (since their callers will
+	 * usually not pass illegal arguments to them).
+	 *
+	 * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+	 * this Sun bug report</a> for more information.
+	 *
+	 * @param index The invalid index.
+	 * @throws IndexOutOfBoundsException Always.
+	 */
+	private final void throwException(int index)
+								throws IndexOutOfBoundsException {
+		throw new IndexOutOfBoundsException("Index " + index +
+						" not in valid range [0-" + (size-1) + "]");
+	}
+
+
+	/**
+	 * Throws an exception.  This method isolates error-handling code from
+	 * the error-checking code, so that callers can be both small enough to be
+	 * inlined, as well as not usually make any expensive method calls (since
+	 * their callers will usually not pass illegal arguments to them).
+	 *
+	 * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+	 * this Sun bug report</a> for more information.
+	 *
+	 * @param index The invalid index.
+	 * @throws IndexOutOfBoundsException Always.
+	 */
+	private final void throwException2(int index)
+								throws IndexOutOfBoundsException {
+		throw new IndexOutOfBoundsException("Index " + index +
+								", not in range [0-" + size + "]");
+	}
+
+
+	/**
+	 * Throws an exception.  This method isolates error-handling code from
+	 * the error-checking code, so that callers can be both small enough to be
+	 * inlined, as well as not usually make any expensive method calls (since
+	 * their callers will usually not pass illegal arguments to them).
+	 *
+	 * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+	 * this Sun bug report</a> for more information.
+	 *
+	 * @param index The invalid index.
+	 * @throws IndexOutOfBoundsException Always.
+	 */
+	private final void throwException3(int fromIndex, int toIndex)
+								throws IndexOutOfBoundsException {
+		throw new IndexOutOfBoundsException("Index range [" +
+						fromIndex + ", " + toIndex +
+						"] not in valid range [0-" + (size-1) + "]");
+	}
+
+
+}
Index: /other-projects/rsyntax-textarea/src/java/org/fife/util/package.html
===================================================================
--- /other-projects/rsyntax-textarea/src/java/org/fife/util/package.html	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/org/fife/util/package.html	(revision 25584)
@@ -0,0 +1,5 @@
+<html>
+	<body>
+	General utility classes.
+	</body>
+</html>
Index: /other-projects/rsyntax-textarea/src/java/theme.dtd
===================================================================
--- /other-projects/rsyntax-textarea/src/java/theme.dtd	(revision 25584)
+++ /other-projects/rsyntax-textarea/src/java/theme.dtd	(revision 25584)
@@ -0,0 +1,65 @@
+<!-- DTD for RSyntaxTextArea Theme XML. -->
+<!ELEMENT RSyntaxTheme (baseFont, background, caret, selection,
+      currentLineHighlight, marginLine, markAllHighlight, markOccurrencesHighlight,
+      matchedBracket, hyperlinks, gutterBorder, lineNumbers, foldIndicator,
+      iconRowHeader, tokenStyles)>
+<!ELEMENT background EMPTY>
+<!ELEMENT baseFont EMPTY>
+<!ELEMENT caret EMPTY>
+<!ELEMENT selection EMPTY>
+<!ELEMENT currentLineHighlight EMPTY>
+<!ELEMENT marginLine EMPTY>
+<!ELEMENT markAllHighlight EMPTY>
+<!ELEMENT markOccurrencesHighlight EMPTY>
+<!ELEMENT matchedBracket EMPTY>
+<!ELEMENT hyperlinks EMPTY>
+<!ELEMENT gutterBorder EMPTY>
+<!ELEMENT lineNumbers EMPTY>
+<!ELEMENT foldIndicator EMPTY>
+<!ELEMENT iconRowHeader EMPTY>
+<!ELEMENT tokenStyles (style+)>
+<!ELEMENT style EMPTY>
+
+<!ATTLIST RSyntaxTheme version CDATA #REQUIRED>
+<!ATTLIST background color CDATA #REQUIRED>
+<!ATTLIST baseFont
+      family CDATA #IMPLIED
+      size   CDATA #REQUIRED>
+<!ATTLIST caret color CDATA #REQUIRED>
+<!ATTLIST selection
+      bg CDATA #REQUIRED
+      roundedEdges (true|false) "false">
+<!ATTLIST currentLineHighlight
+      color CDATA #REQUIRED
+      fade (true|false) "false">
+<!ATTLIST marginLine fg CDATA #REQUIRED>
+<!ATTLIST markAllHighlight color CDATA #REQUIRED>
+<!ATTLIST markOccurrencesHighlight
+      color CDATA #REQUIRED
+      border (true|false) "false">
+<!ATTLIST matchedBracket
+      fg CDATA #REQUIRED
+      bg CDATA #IMPLIED
+      animate (true|false) "false">
+<!ATTLIST hyperlinks
+      fg CDATA #REQUIRED>
+<!ATTLIST gutterBorder
+      color CDATA #REQUIRED>
+<!ATTLIST lineNumbers
+      fg         CDATA #REQUIRED
+      fontFamily CDATA #IMPLIED
+      fontSize   CDATA #IMPLIED>
+<!ATTLIST foldIndicator
+      fg     CDATA #REQUIRED
+      iconBg CDATA #REQUIRED>
+<!ATTLIST iconRowHeader
+      activeLineRange CDATA #REQUIRED>
+<!ATTLIST style
+      token      CDATA #REQUIRED
+      fg         CDATA #IMPLIED
+      bg         CDATA #IMPLIED
+      fontFamily CDATA #IMPLIED
+      fontSize   CDATA #IMPLIED
+      bold       (true|false) "false"
+      italic     (true|false) "false"
+      underline  (true|false) "false">
